48

セキュリティ上の理由から、実行前にコードの整合性をチェックして、攻撃者によるソフトウェアの改ざんを回避することが望ましいです。だから、私の質問は

Linux で実行可能コードに署名し、信頼できるソフトウェアのみを実行する方法は?

van Doomらの作品を読んだことがあります。Linux 用の署名付き実行可能ファイルの設計と実装、およびSafford & Zohar によるIBM のTLC (Trusted Linux Client)。TLC は TPM コントローラーを使用しています。これは素晴らしいことですが、論文は 2005 年のものであり、現在の代替品を見つけることができませんでした。

別のオプションを知っていますか?

更新:そして、他のOSについては?オープンソラリス? BSDファミリー?

4

10 に答える 10

72

これは古代の質問だと思いますが、今見つけました。

しばらく前にLinuxカーネル(バージョン2.4.3前後)の署名付き実行可能ファイルサポートを作成し、実行可能ファイルに署名し、そのexecve(2)時点で署名をチェックし、署名検証情報をキャッシュする(ファイルがあったときに検証をクリアする)ためのツールチェーン全体を用意しました書き込みまたはその他の変更のために開かれます)、任意のELFプログラムへの署名の埋め込みなど。すべてのプログラムの最初の実行時にパフォーマンスペナルティが発生しました(カーネルは、要求ページだけでなく、ファイル全体をロードする必要があったため)。必要なページ)が、システムが定常状態になると、うまく機能しました。

しかし、複雑さを正当化するには大きすぎるいくつかの問題に直面したため、私たちはそれを追求するのをやめることにしました。

  • 署名付きライブラリのサポートはまだ構築されていません。ld.so署名されたライブラリでは、ローダーとdlopen(3)メカニズムも変更する必要があります。これは不可能ではありませんでしたが、インターフェースを複雑にしました。ローダーに署名の検証をカーネルに依頼させるべきでしょうか、それとも計算を完全にユーザースペースで行うべきでしょうか。strace(2)検証のこの部分がユーザースペースで行われる場合、dプロセスからどのように保護しますか?strace(2)そのようなシステムを完全に禁止することを余儀なくされるでしょうか?

    独自のローダーを提供するプログラムについてはどうしますか?

  • 非常に多くのプログラムが、ELFオブジェクトにコンパイルされない言語で書かれています。各インタプリタが署名も検証できるようにするには、、、、、、、などに言語固有の変更を加える必要があります。これらのプログラムのほとんどはフリーフォーマットのプレーンテキストであるため、ELFオブジェクトファイルへのデジタル署名の埋め込みを非常に簡単にする構造が欠けています。署名はどこに保存されますか?スクリプトでは?拡張属性では?署名の外部データベースでは?bashperlpythonjavaawksed

  • 多くの通訳者は、彼らが何を許可するかについて広くオープンです。とを使用して完全にbash(1)リモートシステムと通信でき、攻撃者が実行する必要のあることを簡単に実行するようにだまされる可能性があります。署名されているかどうかにかかわらず、ハッカーの管理下に置かれると、信頼できなくなります。echo/dev/tcp

  • 署名された実行可能ファイルのサポートの主な動機は、システムが提供する、、などを置き換えるルートキットに/bin/psあり/bin/psます/bin/kill。はい、実行可能ファイルに署名する他の有用な理由があります。ただし、ルートキットは時間の経過とともに大幅に印象的になり、多くの場合、管理者からアクティビティを隠すためにカーネルハックに依存しています。カーネルがハッキングされると、ゲーム全体が終了します。ルートキットが洗練された結果、使用を防ぐことを望んでいたツールは、ハッキングコミュニティで支持されなくなりました。

  • カーネルのモジュールロードインターフェイスは広く開かれていました。プロセスにroot特権が与えられると、チェックなしでカーネルモジュールを挿入するのは簡単でした。カーネルモジュール用に別のベリファイアを作成することもできましたが、モジュールを取り巻くカーネルのインフラストラクチャは非常に原始的でした。

于 2012-03-02T02:53:00.953 に答える
14

GNU/Linux/FOSS モデルは、実際には改ざんを助長しています。ユーザーとディストリビューション メーカーは、ニーズに合わせてソフトウェアを自由に変更 (改ざん) する必要があります。カスタマイズのために (ソース コードを一切変更せずに) ソフトウェアを再コンパイルするだけでも、かなり頻繁に行われますが、バイナリ コード署名が壊れてしまいます。その結果、バイナリ コード署名モデルは GNU/Linux/FOSS にはあまり適していません。

代わりに、この種のソフトウェアは、ソース パッケージの署名や安全なハッシュの生成に依存しています。信頼できる信頼できるパッケージ配布モデルと組み合わせることで、これはバイナリ コード署名と同じくらい安全にすることができます (ソース コードへの透過性に関しては、それ以上ではないにしても)。

于 2009-11-14T15:57:26.470 に答える
5

これを見てください:http://linux-ima.sourceforge.net/

まだ署名していませんが、検証は可能です。

于 2009-11-14T16:22:44.983 に答える
3

Solaris 10 & 11 OS の観点から質問に答えることができます。すべてのバイナリは署名されています。署名を検証するには、「elfsign」を使用します...

$ elfsign verify -v /usr/bin/bash
elfsign: verification of /usr/bin/bash passed.
format: rsa_sha1.
signer: O=Oracle Corporation, OU=Corporate Object Signing, OU=Solaris Signed Execution, CN=Solaris 11.
signed on: Fri Oct 04 17:06:13 2013.

Oracle は最近、Solaris 11 の検証済みブート プロセスも追加しました。詳細については、「Solaris Verified Boot Introduction」を参照してください。

OpenSolaris コードには製品グレードのフォークがいくつかありますが、調査する価値のある 3 つは Illumos、SmartOS、および OmniOS です。

于 2014-12-11T13:20:52.303 に答える
2

メデューサ DS9をご覧ください。ずいぶん前に遊んでいましたが、記憶が正しければ、特定のバイナリを登録でき、カーネルレベルでの変更は許可されていませんでした。もちろん、マシンへのローカル アクセスでオーバーライドできますが、実際には簡単ではありませんでした。constable と呼ばれるスマート デーモンがあり、マシン上で発生するすべてのことをチェックし、通常とは異なることが発生すると、叫び始めます。

于 2009-11-14T16:15:36.450 に答える
2

試したことはありませんが、http: //blog.codenoise.com/signelf-digitally-signing-elf-binariesをご覧ください。このソリューションはカーネル サポートを必要とせずに機能し、準備ができているようです。

署名者のコードはhttp://sourceforge.net/projects/signelf/にあります。

「Linuxで信頼できるコードのみを実行する」という質問は解決しませんが、プログラムが改ざん/破損の可能性を検出する方法を作成することで、問題を部分的に解決します

于 2012-11-12T11:03:21.240 に答える
1

http://en.wikipedia.org/wiki/PKCS

その PKCS7 (S/MIME) 署名を使用します。独自の証明書/秘密鍵のペアを生成し、証明書に自己署名してから、PKCS7 を使用して秘密鍵と証明書でファイルに署名します。証明書を添付し、実行時に openssl コマンド (man smime または単に openssl help を実行) を使用して自身をチェックできます。公開鍵が配布するファイルに含まれていても、その公開鍵の S/MIME 署名は配布しない秘密鍵でのみ生成できるため、これは改ざん防止です。したがって、ファイルが証明書によって署名されている場合は、秘密鍵を持つ誰かによって署名されている必要があり、秘密鍵を誰にも渡していないため、それはあなたからのものであるに違いありません。

自己署名証明書の作成方法は次のとおりです。

http://www.akadia.com/services/ssh_test_certificate.html

あなたの証明書を権限のルート (-CAfile) として信頼するように openssl を説得し、それをルートとして確認し、ファイルの証明書が自分のものであることを確認し (証明書をハッシュし)、ハッシュを確認する必要があります。文書化されていませんが、openssl の終了ステータスは、smime 検証を行うときにチェックしている署名の有効性を反映していることに注意してください。一致する場合は 0、一致しない場合は非ゼロです。

チェックがコード内にある場合、彼らがあなたを打ち負かしたい場合は、単にチェックを削除できるため、これらすべてが安全ではないことに注意してください。これを行う唯一の安全な方法は、OS にチェッカーを配置して、バイナリをチェックし、署名されていない場合は実行を拒否することです。しかし、OSにはチェッカーがなく、とにかくLinuxを変更して削除/バイパスできるため...これが本当に良いのは、人々があなたをバイパスしないようにすることよりも、破損したファイルを検出することです.

于 2009-11-16T05:04:40.513 に答える