いくつかの dll (厳密な名前ではない) を参照する exe にコード署名すると、悪意のあるユーザーが私の DLL を置き換えて、あたかも私が署名したかのように見える方法でアプリを配布する可能性がありますが、実行されていると考えるのは正しいですか?彼らのコード?
はい、残りの DLL が署名されているだけで厳密な名前が付いていない場合は、.NET が例外を発生させずに置き換えることができます。exe 内で、DLL が exe と同じキーで署名されていることを確認できます。これらのアプローチのいずれも、誰かがあなたの DLL や EXE を置き換えることを妨げません。
それが本当であると仮定すると、.NET アプリ全体に厳密な名前を付けずに署名したくないと思われます。そうしないと、作成したアプリを装ってコードを実行する機能を人々に与えることになりますか?
一般的に、それが「ベストプラクティス」だと思いますが、何も防げませんでした。ユーザーがローカル システム上のファイルを変更する権限を取得すると、悪意のあるアクティビティを阻止するためにできることはあまりありません。
完全な .NET プロジェクトを単一の exe にビルドする難読化テクノロジがいくつかあります。これは「最も安全な」アプローチになる可能性がありますが、それでも改ざんされる可能性があります。
本当の問題は、彼らが何をするのを防ごうとしているのですか? 私が言いたいのは、なぜ誰かがあなたのdllを置き換えることに興味があるのでしょうか? 彼らは何を達成したいと望んでいますか、彼らの目標は何ですか? 誰かがプロセスから機密情報を読み取るのを防ごうとしている場合は、失望の長い困難な道のりを歩んでいます。悪意のある人物がソース コードとプロセスで使用されるすべての情報に完全にアクセスできると仮定します。彼らはあなたのコードの全部または一部を意のままに置き換えることができると仮定してください。
更新しました
バインド リダイレクトは、同じキーで厳密な名前が付けられたアセンブリでのみ機能するため、DLL が変更されるのを防ぐことができますか?
ただし、コード インジェクションはさまざまな方法で実行できるという例外があります。
...そして元の質問に戻りますが、厳密な名前を付けずにコード署名すると、コード署名のポイントが損なわれますか?
あまり。コード署名 (厳密な名前付けではない) には、次の 2 つの明確な目的があります。
- 認証。ソフトウェアの作成者が誰であるかを確認します。
- 威厳。ソフトウェアが署名されてから改ざんされていないことを確認します。
多くの場合、これはインストール中にのみ認証および検証されます。これが、お客様が修正されていないインストーラーを当社から受け取ったことを確認するために、setup.exe に署名する理由です。「Do you trust XXXX Company」というプロンプトが表示され、認証済み/署名済みのインストーラーに許可を与えています。ただし、インストールすると、OS によるコード署名の組み込み使用はほとんどありません (ドライバーやその他のあいまいなケースを除く)。
一方、ストロングネーミングには、その存在の目的がまったく異なります。アプリケーションの「整合性」に完全に焦点を当てています。証明書も、それを検証するための署名機関 (CA) もありません。ユーザーが表示する情報も確認できず、OS が実行しようとしている実行可能ファイルについて検証できるものはありません。
.NET フレームワークは、多くのものに厳密な名前を使用します。それらはすべて、大まかにアプリケーションの整合性として分類されます。
- dll/exe の内容には、改ざんできないように署名されたハッシュがあります。
- 依存関係をロードするときに、各参照に厳密な名前を付け、検証する必要があります。
- アセンブリは GAC に登録でき、発行者ポリシーを使用できます。
- ネイティブ イメージを ngen して、アセンブリの IL のコンパイル済みイメージを生成できます。
ここで見逃しているものは他にもあると思いますが、これらは私が認識している主な用途です。
署名と厳密な名前付けのベスト プラクティス
- 署名済みインストーラーを使用する
- コード署名された実行可能ファイルを使用する
- 厳密な名前の実行可能ファイルを使用する
- すべての依存関係とそれらへの参照に厳密な名前を付ける
- 通常、コード署名の依存関係は必要ありません*
- インストール時にGACがアセンブリを登録することを検討してください
*注意: コード署名は DLL の場合に役立ちます。たとえば、「安全」とマークされ、ブラウザーに埋め込まれた COM オブジェクトは、実行可能ファイルであるかのように署名され、厳密な名前が付けられる必要があります。コード署名は、アセンブリをロードしたり、その属性を反映したりせずに、依存関係を外部から検証する場合にも役立ちます。