22

Authenticode コード署名と厳密な名前付けについて頭を悩ませようとしています。

少数の dll (厳密な名前ではない) を参照する exe にコード署名すると、悪意のあるユーザーが私の DLL を置き換えて、あたかも私が署名したかのように見える方法でアプリを配布する可能性がありますが、実行されていると考えるのは正しいですか?彼らのコード?

それが本当であると仮定すると、.NET アプリ全体に厳密な名前を付けずに署名したくないと思われます。そうしないと、作成したアプリを装ってコードを実行する機能を人々に与えることになりますか?

私が確信が持てない理由は、私がオンラインで見つけた記事 (SN+Authenticode の使用に関する MSDN ドキュメントを含む) のどれもこれに言及していないようであり、理解することがかなり重要なポイントのように思われるからです (私が正しく理解していれば) ?

4

4 に答える 4

16

いくつかの dll (厳密な名前ではない) を参照する exe にコード署名すると、悪意のあるユーザーが私の DLL を置き換えて、あたかも私が署名したかのように見える方法でアプリを配布する可能性がありますが、実行されていると考えるのは正しいですか?彼らのコード?

はい、残りの DLL が署名されているだけで厳密な名前が付いていない場合は、.NET が例外を発生させずに置き換えることができます。exe 内で、DLL が exe と同じキーで署名されていることを確認できます。これらのアプローチのいずれも、誰かがあなたの DLL や EXE を置き換えることを妨げません。

それが本当であると仮定すると、.NET アプリ全体に厳密な名前を付けずに署名したくないと思われます。そうしないと、作成したアプリを装ってコードを実行する機能を人々に与えることになりますか?

一般的に、それが「ベストプラクティス」だと思いますが、何も防げませんでした。ユーザーがローカル システム上のファイルを変更する権限を取得すると、悪意のあるアクティビティを阻止するためにできることはあまりありません。

完全な .NET プロジェクトを単一の exe にビルドする難読化テクノロジがいくつかあります。これは「最も安全な」アプローチになる可能性がありますが、それでも改ざんされる可能性があります。

本当の問題は、彼らが何をするのを防ごうとしているのですか? 私が言いたいのは、なぜ誰かがあなたのdllを置き換えることに興味があるのでしょうか? 彼らは何を達成したいと望んでいますか、彼らの目標は何ですか? 誰かがプロセスから機密情報を読み取るのを防ごうとしている場合は、失望の長い困難な道のりを歩んでいます。悪意のある人物がソース コードとプロセスで使用されるすべての情報に完全にアクセスできると仮定します。彼らはあなたのコードの全部または一部を意のままに置き換えることができると仮定してください。

更新しました

バインド リダイレクトは、同じキーで厳密な名前が付けられたアセンブリでのみ機能するため、DLL が変更されるのを防ぐことができますか?

ただし、コード インジェクションはさまざまな方法で実行できるという例外があります。

...そして元の質問に戻りますが、厳密な名前を付けずにコード署名すると、コード署名のポイントが損なわれますか?

あまり。コード署名 (厳密な名前付けではない) には、次の 2 つの明確な目的があります。

  1. 認証。ソフトウェアの作成者が誰であるかを確認します。
  2. 威厳。ソフトウェアが署名されてから改ざんされていないことを確認します。

多くの場合、これはインストール中にのみ認証および検証されます。これが、お客様が修正されていないインストーラーを当社から受け取ったことを確認するために、setup.exe に署名する理由です。「Do you trust XXXX Company」というプロンプトが表示され、認証済み/署名済みのインストーラーに許可を与えています。ただし、インストールすると、OS によるコード署名の組み込み使用はほとんどありません (ドライバーやその他のあいまいなケースを除く)。

一方、ストロングネーミングには、その存在の目的がまったく異なります。アプリケーションの「整合性」に完全に焦点を当てています。証明書も、それを検証するための署名機関 (CA) もありません。ユーザーが表示する情報も確認できず、OS が実行しようとしている実行可能ファイルについて検証できるものはありません。

.NET フレームワークは、多くのものに厳密な名前を使用します。それらはすべて、大まかにアプリケーションの整合性として分類されます。

  1. dll/exe の内容には、改ざんできないように署名されたハッシュがあります。
  2. 依存関係をロードするときに、各参照に厳密な名前を付け、検証する必要があります。
  3. アセンブリは GAC に登録でき、発行者ポリシーを使用できます。
  4. ネイティブ イメージを ngen して、アセンブリの IL のコンパイル済みイメージを生成できます。

ここで見逃しているものは他にもあると思いますが、これらは私が認識している主な用途です。

署名と厳密な名前付けのベスト プラクティス

  • 署名済みインストーラーを使用する
  • コード署名された実行可能ファイルを使用する
  • 厳密な名前の実行可能ファイルを使用する
  • すべての依存関係とそれらへの参照に厳密な名前を付ける
  • 通常、コード署名の依存関係は必要ありません*
  • インストール時にGACがアセンブリを登録することを検討してください

*注意: コード署名は DLL の場合に役立ちます。たとえば、「安全」とマークされ、ブラウザーに埋め込まれた COM オブジェクトは、実行可能ファイルであるかのように署名され、厳密な名前が付けられる必要があります。コード署名は、アセンブリをロードしたり、その属性を反映したりせずに、依存関係を外部から検証する場合にも役立ちます。

于 2011-12-19T20:19:30.303 に答える
1

誰かが dll を置き換えたり、あなたのマシンでコードを実行したりできるようになると、それほど多くの保護手段はあなたに残されなくなります。私の場合、すべての Dll は個別にコード署名されています。私のコードは、自己更新の一部として署名されていない Dll のダウンロードを拒否します。ただし、私のシステムで私の整合性レベル以上で実行されているアプリ (>= Vista Windows の場合) は、CreateRemoteThread など (http://www.codeguru.com/Cpp/WP /dll/article.php/c105) しかし、誰かが外国のコードをシステムに取り込めると仮定するのは難しい部分です。残りは簡単です。

于 2011-12-19T20:18:20.770 に答える
0

また、アプリケーションの他の部分を展開せずに dll をアップグレードする場合、コード署名はしばしば多くの苦痛をもたらすことを覚えておく必要があります。

これが、多くの一般的なライブラリが dll の名前を厳密に指定しない理由です。

于 2011-12-20T16:20:19.143 に答える
0

同じものを探して多くのものを読んだ後。私は最終的にあなたの質問に答えることができます。はい、アプリの実行ファイルにデジタル署名する場合は、依存関係の厳密な名前が必要です。

依存関係に厳密な名前がない場合は、これを想定してください。そして、それらは置き換えられます。アプリケーションは問題なくそれらをロードします。そして、ユーザーは「検証済みの発行元: あなたの名前」というダイアログが表示されます。実行可能ファイルはそのままでしたが、依存関係が変更されました。

問題はそのユーザーではなく、依存関係が変更されたそのパッケージの配布ですが、誰もがあなたの名前を見ることができます。

于 2014-11-28T14:50:07.130 に答える