難読化
難読化とは何ですか?
難読化とは、何かを理解しにくいものにすることを意味します。 プログラミングコードは、知的財産や企業秘密を保護し、攻撃者が独自のソフトウェアプログラムをリバースエンジニアリングするのを防ぐために難読化されることがよくあります。
プログラムのコードの一部またはすべてを暗号化することは、難読化の一つの方法です。 他のアプローチには、潜在的に明らかになるメタデータを除去し、クラス名と変数名を無意味なラベルに置き換え、未使用または無意味なコードをアプリケー 難読化ツールと呼ばれるツールは、簡単なソースコードを同じように動作するプログラムに自動的に変換しますが、読みやすく理解するのはより困難です。
残念ながら、悪意のあるコード作成者もこれらの方法を使用して、マルウェア対策ツールによって攻撃メカニズムが検出されないようにします。 2020年のSolarWinds攻撃は、難読化を使用して防御を回避するハッカーの例です。
難読化解除技術を使用して、難読化をリバースエンジニアリングまたは元に戻すことができます。 これらの手法には、プログラムスライスが含まれ、プログラム内の特定の時点でプログラムコードを関連するステートメントだけに狭めます。 コンパイラの最適化とプログラムの合成は、他の2つの復号化技術です。 難読化は、リバースエンジニアリングを困難にし、問題の価値がないことを目的としています。
難読化はどのように機能しますか?
コンピュータコードの難読化は、複雑なラウンドアバウトフレーズと冗長なロジックを使用して、コードを読者が理解するのを困難にします。 目標は、読者が読んでいるものの複雑な構文で読者をそらすことであり、メッセージの真の内容を判断することを困難にすることです。
コンピュータコードでは、読者は人、コンピューティングデバイスまたは他のプログラムであってもよい。 難読化は、コードを解釈するためにデジタル署名に大きく依存するウイルス対策ツールやその他のプログラムをだますためにも使用されます。 逆コンパイラは、Javaなどの言語、AndroidやiOSなどのオペレーティングシステム、.NETなどの開発プラットフォームで利用可能で、ソースコードを自動的にリバースエンジニアリングすることができます。難読化は、これらのプログラムが逆コンパイルを行うことを困難にすることを目的としています。
コードの難読化は、プログラムの元のコードの内容を変更することではなく、そのコードの配信方法と表示をより混乱させることです。 難読化によって、プログラムの動作や終了出力が変更されることはありません。
以下は、通常のJavaScriptコードのスニペットの例です:
var greeting = 'Hello World';greeting = 10;var product = greeting * greeting;
難読化された形式の同じスニペットは次のようになります:
var _0x154f=;var _0x52df=function(_0x159d61,_0x12b953){_0x159d61=_0x159d61-0x122;var _0x154f4b=_0x154f;return _0x154f4b;};(function(_0x19e682,_0x2b7215){var _0x5e377c=_0x52df;while(!!){try{var _0x2d3a87=-parseInt(_0x5e377c(0x129))*parseInt(_0x5e377c(0x123))+-parseInt(_0x5e377c(0x125))*parseInt(_0x5e377c(0x12e))+parseInt(_0x5e377c(0x127))*-parseInt(_0x5e377c(0x126))+-parseInt(_0x5e377c(0x124))*-parseInt(_0x5e377c(0x12f))+-parseInt(_0x5e377c(0x128))*-parseInt(_0x5e377c(0x12b))+parseInt(_0x5e377c(0x12a))*parseInt(_0x5e377c(0x12d))+parseInt(_0x5e377c(0x12c))*parseInt(_0x5e377c(0x122));if(_0x2d3a87===_0x2b7215)break;else _0x19e682(_0x19e682());}catch(_0x22c179){_0x19e682(_0x19e682());}}}(_0x154f,0x1918c));var greeting='Hello\x20World';greeting=0xa;var product=greeting*greeting;
難読化されたバージョンは、人間の目を使用して従うことはほぼ不可能です。
難読化技術
難読化には、いくつかの異なる方法が含まれます。 多くの場合、複数の技術は、層状の効果を作成するために使用されます。
c#やJavaなどのコンパイルされたソフトウェア言語で書かれたプログラムは、難読化が容易です。 これは、一般的に読みやすい中間レベルの命令を作成するためです。 これとは対照的に、C++はマシンコードにコンパイルされるため、難読化がより困難であり、人々が作業するのがより困難です。
一般的な難読化手法には、次のようなものがあります:
- 名前を変更します。 難読化器は、変数のメソッドと名前を変更します。 新しい名前には、印刷できない文字や非表示の文字が含まれる場合があります。
- これにより、プログラム全体が圧縮され、コードが読めなくなります。
- 逆コンパイルされたコードは、構造化されておらず、思考の行が隠されているコードを維持するのが難しいスパゲッティロジックのように見えるように このコードの結果は明確ではなく、コードを見ることによってコードのポイントが何であるかを知ることは困難です。
- 命令パターン変換。 このアプローチは、コンパイラによって作成された一般的な命令を取り、同じことを効果的に行うより複雑であまり一般的でない命令と交換します。
- ダミーコード挿入。 ダミーコードをプログラムに追加して、読みにくくしたりリバースエンジニアリングしたりすることができますが、プログラムのロジックや結果には影
- メタデータまたは未使用のコードの削除。 未使用のコードとメタデータは、Word文書の注釈と同じように、プログラムに関する追加情報を読者に提供し、それを読んでデバッグするのに役立ちます。 メタデータと未使用のコードを削除すると、プログラムとそのコードに関する情報が少なくなります。
- コード内の述語は、trueまたはfalseの論理式です。 不透明述語は、統計分析では結果を容易に決定することができない条件分岐またはif-then文です。 不透明な述語を挿入すると、実行されない不要なコードが導入されますが、逆コンパイルされた出力を理解しようとする読者には困惑しています。
- アンチデバッグ。 正当なソフトウェアエンジニアやハッカーは、デバッグツールを使用してコードを行ごとに調べます。 これらのツールを使用すると、ソフトウェアエンジニアはコードの問題を発見し、ハッカーはそれらを使用してコードをリバースエンジニアリングすることができます。 ITセキュリティ担当者は、デバッグ対策ツールを使用して、ハッカーが攻撃の一部としてデバッグプログラムを実行していることを識別できます。 ハッカーは、デバッグツールを実行して、コードに加えている変更を識別するためにデバッグツールがいつ使用されているかを識別することができます。
- 改ざん防止。 これらのツールは、改ざんされたコードを検出し、変更された場合はプログラムを停止します。
- 文字列暗号化。 このメソッドは、暗号化を使用して実行可能ファイル内の文字列を非表示にし、プログラムの実行に必要な場合にのみ値を復元します。 これにより、プログラムを通過して特定の文字列を検索することが困難になります。
- コード転置。 これは、その動作に目に見える影響を与えることなく、コード内のルーチンとブランチの順序を変更することです。
難読化の成功を測定する方法
難読化メソッドの成功は、次の基準を使用して測定できます:
- 強さ。 変換されたコードが自動復号化の試行に抵抗する程度によって、強度が決まります。 より多くの労力、時間、リソースがかかるほど、コードはより強くなります。
- 変換されたコードが元のコードと異なる程度は、それがどれほど効果的であるかの別の尺度です。 差別化を判断するために使用される方法のいくつかは、次のとおりです。
- 新しいコードに含まれる述語の数。
- 継承ツリーの深さ(DIT)–コードの複雑さを示すために使用されるメトリック。 より高いDITは、より複雑なプログラムを意味します。
- 費用。 コスト効率の高い難読化方法は、特に大規模なアプリケーションに対してどれだけスケールするかという点で、高価な方法よりも便利です。
- 難読化ツールが追加するレイヤーが多ければ多いほど、プログラムはより複雑になり、難読化がより成功します。
難読化の利点
難読化の主な利点は次のとおりです:
- 秘密だ 難読化は、コードに含まれる貴重な情報を非表示にします。 これは、競合他社や攻撃者からコードを保護しようとしている正当な組織にとって利点です。 逆に、悪意のあるアクターは難読化の秘密を利用して悪意のあるコードを隠します。
- 未使用のコードの削除などの難読化手法の中には、プログラムを縮小して実行するリソースを少なくする効果があります。
- セキュリティ。 難読化は組み込みのセキュリティ方法であり、アプリケーションの自己保護と呼ばれることもあります。 外部のセキュリティ方法を使用する代わりに、保護されているものの中で機能します。 これは、信頼されていない環境で実行され、機密情報を含むアプリケーションを保護するのに適しています。
難読化の欠点
難読化の主な欠点の一つは、マルウェアでも使用されていることです。 マルウェアの作成者は、特定の機能のコードをスキャンするウイルス対策プログラムを回避するために使用します。 これらの機能を不明瞭にすることにより、マルウェアはウイルス対策ソフトウェアに正当なように見えます。
マルウェア作成者が使用する一般的な手法には、次のものがあります:
- 排他的または(XOR)。 Xor値をコードに適用してデータを非表示にする操作で、訓練を受けた目だけがデータを復号化できるようにします。
- ROT-13. ランダムな文字のコードを置き換える命令。
難読化により、新しいマルウェアを開発する代わりに、著者は一般的に使用されるコモディティ攻撃方法を再パッケージ化して機能を偽装します。 場合によっては、悪意のあるアクターにはベンダー固有の技術が含まれています。
難読化のもう一つの欠点は、コードを読みにくくすることができることです。 たとえば、文字列暗号化難読化メソッドを使用するコードでは、実行時に文字列の復号化が必要になるため、パフォーマンスが低下します。
難読化とSolarWinds
2019年9月に始まったと考えられているテキサス州オースティンのIT管理および監視ソフトウェアメーカーであるSolarWindsへの攻撃は、他の企業や政府機関の多くが侵害されました。 この攻撃は2020年12月に発見され、ロシアのハッカーに起因しています。 当初はSolarWindsのOrion IT管理プラットフォームを侵害していました。
攻撃者はSunburstマルウェアを使用し、難読化、機械学習、AI技術を組み合わせてOrionプラットフォームのソフトウェアアップデートにバックドアを設置しました。 彼らの努力を偽装し、防御を回避するために、彼らは監査ログを変更し、使用後にファイルとプログラムを削除し、活動を偽造してネットワーク上の正当なアプリケーションとして見えるようにしました。
このサプライチェーン攻撃は、1年以上検出されないままだったと疑われています。 Orionコードに挿入されたマルウェアは、ユーザーが感染した更新プログラムをダウンロードするまで休止状態になり、隠されていました。 その後、検出されずにネットワークを介して広がり、Orionを使用している組織の長いリストに感染しました。
難読化は、ハッカーがITシステムに侵入するために採用する多くの技術の一つです。 さまざまな種類のサイバーセキュリティ攻撃に対する防御の詳細については、TechTargetの詳細なサイバーセキュリティ計画ガイドをご覧ください。