私は最近、.NETの難読化されたコードが解読される可能性があることを示したプレゼンテーションに参加しました。彼は、真のセキュリティを実現するためのより良い方法は、難読化されたアセンブリを暗号化するか、管理されていないアセンブリに知的財産を保持することです。管理されていないアセンブリパスに伴う明らかな欠点は、アセンブリがプラットフォーム固有になることです。上記の2つのアプローチで見られる長所または短所はありますか。
4 に答える
このレベルのコードセキュリティに対するあなたの動機は何ですか?
コード自体が本当に十分に価値のあるIPである場合は、コードをまったく配布せずに、ある種のSaaSオファリングの背後に隠すことを検討する必要があります。難読化はまさにそれが言うことであり、暗号化ではありません。ランタイムはコードを読み取って実行できる必要があるため、必然的に読み取り可能である必要があります。アンマネージDLLでさえ、アセンブラーコードに対してのみ逆コンパイルできるため、IPは完全に安全ではありません。
ちなみに、アンマネージコードの明らかな欠点は、IMHOの言うことではなく、マネージ言語からアンマネージ言語に移行する際に犠牲にするすべてのものです。
両方のモデルには長所と短所があります。ただし、これらは主に特定の脅威モデルに依存します。これから始めることをお勧めします。どのグループの人々があなたの製品にセキュリティの脅威を示していますか、そしてそれらの脅威は何ですか?
一般に、マネージコードを使用する利点は市場投入までのスピードですが、特定の攻撃やIPの盗難の影響を受けやすくなります。ネイティブコードを使用する利点は、特定の攻撃の影響を受けにくいことですが、市場投入までの速度は遅くなります。これらは非常に一般的な長所と短所であり、脅威モデルに基づいて調整する必要があります。
あなたのコメントに答えるために編集してください。保護する必要のあるIPがある場合は、(一般的な場合)暗号化された難読化されたアセンブリではなく、ネイティブコードの実行可能ファイルを使用します。ネイティブコードは、暗号化された難読化されたマネージコードよりも解読が難しく、暗号化と難読化の追加の複雑さにより、製品にかなりの量の設計とテストが追加されます。
別のオプションがあることを指摘するために再度編集しました:MPressのようなパッカーを使用できます。これには、難読化や暗号化のパフォーマンスや複雑さの影響はありませんが、専門家ではないクラッカーによるIPの盗難に対する合理的な保護を提供します。Reflectorを使用してパックされた.NETアセンブリを見ると、メイン呼び出しが1つだけ表示されます。
3番目のオプションは、実行可能ファイルを暗号化することです。私が最もよく知っているオプションは、ドングルが存在する場合にのみ復号化できるラッパー内に暗号化されたコードを配置します。
ドングルと暗号化は理論的には強力です。実行可能ファイルが復号化されるまで、プログラムをいじり始めることすらできないからです。とは言うものの、プログラムを実行するたびに復号化する必要があるため、実際に行う必要があるのは、プログラムを実行してメモリからクリアコードをプルすることだけです。ただし、そのオプションは、ドングルの1つにアクセスできない人には利用できないため、ドングルを誰に発送するかを判断する機会が与えられます。
欠点は、コストサポートの手間です。顧客が必要とする物理的なハードウェアが存在するため、ソフトウェアを電子的に配信することはできません。一部の国では、ドングルは暗号化デバイスであるため、ドングルのインポートまたはエクスポートに関するルールがある場合があります。また、一部のハイパーバイザーシステムはUSBパススルーをサポートしていません。一部のドングルメーカーは依然としてパラレルポートドングルを提供していますが、最近のコンピューターハードウェアには必ずしもパラレルポートが付属しているわけではありません。顧客が仮想サーバー上でソフトウェアを実行する必要がある場合は、狭い場所にいることに気付くかもしれません。そして、それらは驚くほど簡単に壊れます。あなたの顧客はそれらを壊します。
マシンコードと比較して、.NETコードははるかに構造化されており、変換の柔軟性が低くなっています。したがって、.NETコードを保護するための技術的な課題の1つは、コードを(難読化、暗号化、またはその他の手法を使用して)十分にスクランブルし、.NETランタイムによって課せられる検証可能性を壊さないことです。
とはいえ、.NETコードを保護するためにできることはまだたくさんあります(すでに述べた手法以外に)。
- コードを正しく逆アセンブルするのを困難にする逆アセンブル防止のトリックを適用します
- コードで使用される文字列リテラルを暗号化する
- 関数とデータシンボルの名前を無意味な名前に変更します
- 一部のコードをファイルレベルで意図的に損傷しますが、実行時にのみ修復します
- 改ざんを阻止するためのチェックサムの重要なロジック
- レイヤーで保護を適用し(たとえば、難読化されたコードやその他の保護ロジックをチェックサムと修復)、全体として保護を無効にするのが難しくなります
もちろん、これらを手作業で行うことは難しく、エラーが発生しやすくなります。しかし、そのような保護を自動化するために使用できる商用のプロフェッショナルグレードのツールがあります。