難読化(ソフトウェア)

ソフトウェア開発において、難読化とは、人間やコンピュータが理解しにくいソースコード機械語を意図的に作成する手法である。自然言語における難読化と同様に、コードの難読化では、不必要に回りくどい記述法が用いられる場合がある。プログラマーは、コードの目的、ロジック、埋め込まれた値を隠すためにコードを難読化することがある。難読化を行う主な理由は、改ざん防止、リバースエンジニアリングの阻止、あるいはコードを難読化解除するためのパズルやレクリエーション課題(多くの場合、クラックミーに含まれる)の作成などである。難読化は手動で行うこともできるが、難読化ツールを用いて行う方が一般的である。[ 1 ]

概要

一部の言語は、そのアーキテクチャや特性により、他の言語よりも難読化されやすい場合があります。[ 2 ] [ 3 ] C[ 4 ] C++[ 5 ] [ 6 ] Perlプログラミング言語[ 7 ]などは、難読化されやすい言語の例です。Haskellも、構造がかなり異なるにもかかわらず、非常に難読化されやすい言語です [ 8 ] 。

言語を難読化しやすくする特性は、すぐには分かりません。

テクニック

難読化の種類には、単純なキーワードの置換、芸術的な効果を生み出すための空白の使用または非使用、自己生成プログラムまたは大幅に圧縮されたプログラムなどがあります。

Nick Montfortによれば、次のようなテクニックが考えられます。

  1. 名前の難読化(意味のない、または誤解を招くような方法で変数に名前を付けることを含む)
  2. データ/コード/コメントの混乱。実際のコードがコメントのように見えたり、構文とデータが混同されたりすることが含まれます。
  3. 二重コーディングは、コードを詩の形や面白い形で表示することができます。[ 9 ]

マルウェア回避のためのペイロードエンコーディング

XOR暗号化Base64エンコードは、マルウェアをウイルス対策ソフトの検出から隠蔽するためによく使われる2つの方法です。どちらも、悪意のあるコードのファイル形式における外観を変更することで、セキュリティソフトウェアが危険なパターンを認識できないようにします。

XOR難読化では、攻撃者は秘密鍵を選択し、マルウェアバイナリにXORビット演算を適用します。これにより、実行ファイルはランダムデータのように見えるものに変換されます。インポートテーブル内の関数名は消失し、 PEヘッダーは破損し、ファイル全体の構造が失われます。難読化されたペイロードはドロッパーに埋め込まれます。ドロッパーは、リソースまたはデータセクションとして隠されたマルウェアを含む、一見普通の実行ファイルです。ユーザーがドロッパーを実行すると、ドロッパーは同じ鍵でXOR演算を再度実行して元のマルウェアを再構築し、メモリから直接実行するか、実行前にディスクに書き込みます。[ 10 ]

このプロセスにより、ウイルス対策ソフトウェアが依存するいくつかの指標が削除されます。すべてのWindows実行ファイルの先頭を示すMZヘッダーは、XOR演算によって完全に隠蔽されます。セキュリティプログラムは、埋め込まれた実行ファイルを検索する際に、この2バイトの署名を頻繁にスキャンします。Base64エンコードは、異なる方法で同様の結果を実現します。バイナリデータをASCIIテキストに変換するため、実行ファイルはプログラムではなくプレーンテキストのように見えます。

2020年の機械学習セキュリティ回避コンペティションの研究では、これらの手法が最新の検出システムを回避できることが示されました。参加者は、XORエンコード、Base64エンコード、デッドコード挿入を組み合わせて、3つのコンペティションモデルすべてを、サンプルあたり5回未満の試行で回避しました。エントロピーベースの検出も失敗し、場合によってはBase64エンコードによって元のマルウェアファイルと比較してエントロピーが実際に低下しました。 [ 11 ]

これらの手法は、そのシンプルさゆえに特に危険です。XORとBase64エンコードは、実装に基本的なプログラミングスキルしか必要としませんが、高度な機械学習分類器に対して有効であることが証明されています。このため、セキュリティ研究者は、自動化されたXORキー回復ツールや実行ファイルに埋め込まれたリソースのより詳細な分析など、新たな防御策の開発に取り組んでいます。

自動化ツール

コード難読化を実行または支援するためのツールは多種多様です。これには、研究者が開発した実験的な研究ツール、趣味で開発されているツール、専門家が作成した商用製品、オープンソースソフトウェアなどが含まれます。さらに、難読化プロセスを逆行させることを目的とした難読化解除ツールも存在します。

市販の難読化ソリューションのほとんどは、プログラムのソース コードまたはプラットフォームに依存しないバイトコード(つまり、 Java.NETで使用されるポータブル コード) を変換しますが、コンパイルされたバイナリで直接動作するソリューションもあります。

レクリエーション

難読化されたソースコードを書いたり読んだりするのは、頭の体操になることがあります。国際難読化Cコードコンテスト難読化Perlコンテストなど、多くのプログラミングコンテストで、最も独創的に難読化されたコードに賞が授与されます。

Perlプログラマーの署名には、短く難読化されたPerlプログラムが使用されることがあります。これらはJAPH(Just another Perl hacker)と呼ばれます。[ 18 ]

暗号

暗号学者たちは、コードのリバースエンジニアリングを暗号学的に困難にするコードを難読化するというアイデアを研究してきました。これは、識別不能性難読化に関する多くの提案で形式化されています。識別不能性難読化は、安全に構築できれば、誰も作り方を知らない全く新しい種類の暗号を含む、様々な種類の暗号を構築できる暗号プリミティブです。(より強力な概念であるブラックボックス難読化は、一般的に不可能であることが知られています。)[ 19 ] [ 20 ]

難読化のデメリット

  • 難読化によってプログラムの読み取り、書き込み、リバースエンジニアリングが困難になり、時間がかかるようになるが、必ずしも不可能になるわけではない。[ 21 ]
  • これにより、開発者のビルド プロセスに時間と複雑さが追加されます。
  • ソフトウェアが難読化された後のデバッグの問題は非常に困難になる可能性があります。
  • コードがメンテナンスされなくなると、愛好家はプログラムのメンテナンス、改造、あるいはより深い理解を求めるようになるかもしれません。難読化によって、エンドユーザーがコードを使って有用なことを行うことが難しくなります。
  • 特定の種類の難読化 (つまり、単なるローカル バイナリではなく、必要に応じて Web サーバーからミニ バイナリをダウンロードするコード) は、パフォーマンスを低下させたり、インターネットを必要とする場合があります。

難読化されたコードをユーザーに通知する

AVG AntiVirus [ 22 ]などの一部のウイルス対策ソフトウェアは、手動で難読化されたコードを含むウェブサイトにアクセスした際にユーザーに警告を発します。これ、難読化の目的の一つが悪意のあるコードを隠すことにあるためです。しかし、一部の開発者は、ファイルサイズの削減やセキュリティ強化を目的としてコードの難読化を採用している場合があります。一般ユーザーは、特に信頼できる企業から提供された、無害なコードについてウイルス対策ソフトウェアが警告を発することを期待していないため、このような機能は、ユーザーが正規のソフトウェアを使用することを思いとどまらせる可能性があります。

MozillaとGoogleは、アドオンストアで難読化されたコードを含むブラウザ拡張機能を禁止しています。[ 23 ] [ 24 ]

難読化とコピーレフトライセンス

作者がソースコードを公開することにあまり積極的ではない場合など、難読化された形式でソースコードを公開することでコピーレフト・ソフトウェア・ライセンスを回避することが違法かどうかについて議論がなされてきました。この問題は、 GNU一般公衆利用許諾書(GNU General Public License)において、「改変を行うための推奨形式」を公開することを義務付けることで対処されています。[ 25 ] GNUのウェブサイトには、「難読化された『ソースコード』は真のソースコードではなく、ソースコードとはみなされません」と記載されています。[ 26 ]

デコンパイラ

コンパイラは、実行ファイルまたはライブラリからソースコードをリバースエンジニアリングできるツールです。このプロセスは、暗号学における伝統的な「中間者攻撃」に着想を得て、「マン・イン・ザ・エンド(Mite)」攻撃と呼ばれることもあります。デコンパイルされたソースコードは、ランダムな関数名や変数名、誤った変数型、そしてコンパイラの最適化によって元のソースコードとは異なるロジックが含まれるなど、読みにくいものになることがよくあります。

モデルの難読化

モデル難読化とは、機械学習モデルの内部構造を隠蔽する手法である。[ 27 ]難読化はモデルをブラックボックス化する。これは説明可能なAIとは相反する。難読化モデルは、モデルに入力する前の学習データにランダムノイズを加えるために適用することもできる。これにより、個々のサンプルやサンプル群の特性に関する機密情報が隠蔽される。[ 28 ]

参照

参考文献

  1. ^ 「難読化(obfu)とは何か? - WhatIs.comからの定義」SearchSoftwareQuality . 2019年2月2日時点のオリジナルよりアーカイブ2019年2月1日閲覧
  2. ^ Binstock, Andrew (2003年3月6日). 「Obfuscation: Cloaking your Code from Prying Eyes」 . 2008年4月20日時点のオリジナルよりアーカイブ2013年11月25日閲覧。
  3. ^ Atwood, Jeff (2005年5月15日). 「Jeff Atwood, May 15, 2005」 . Codinghorror.com. 2010年1月9日時点のオリジナルよりアーカイブ2013年11月25日閲覧。
  4. ^ “Obfuscation” . Kenter.demon.nl. 2016年3月4日時点のオリジナルよりアーカイブ2013年11月25日閲覧。
  5. ^ 「C++チュートリアル – 難読化コード – 簡単な入門」 DreamInCode.net。2008年6月28日時点のオリジナルよりアーカイブ。 2013年11月25日閲覧
  6. ^ 「Cチュートリアル – C言語の難読化コード」 2011年7月7日. 2013年12月27日時点のオリジナルよりアーカイブ2013年11月25日閲覧。
  7. ^ 2013年11月25日 18:22 GMT時点。「Pe(a)rls in line noise」。Perlmonks.org。2009年1月16日時点のオリジナルよりアーカイブ2013年11月25日閲覧。{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)
  8. ^ “Obfuscation – Haskell Wiki” . 2006年2月16日. 2017年8月30日時点のオリジナルよりアーカイブ2020年3月3日閲覧。
  9. ^ Montfort, Nick. 「難読化コード」(PDF)2019年4月24日時点のオリジナル(PDF)からアーカイブ。 2017年11月24日閲覧
  10. ^ Ceschin, Fabrício; Botacin, Marcus; Lüders, Gabriel; Gomes, Heitor Murilo; Oliveira, Luiz S.; Grégio, André (2020). 「古いマルウェアに新しい技を教える必要はない:XORベースの敵対的サンプルによる回避チャレンジの勝利」リバーシング&オフェンシブ指向トレンドシンポジウム議事録. pp.  1– 10. doi : 10.1145/3433667.3433669 .
  11. ^ Ceschin, Fabrício; Botacin, Marcus; Lüders, Gabriel; Gomes, Heitor Murilo; Oliveira, Luiz S.; Grégio, André (2020). 「古いマルウェアに新しい技を教える必要はない:XORベースの敵対的サンプルによる回避チャレンジの勝利」リバーシング&オフェンシブ指向トレンドシンポジウム議事録. pp.  1– 10. doi : 10.1145/3433667.3433669 .
  12. ^ Ben Kurtovic. 「「Hello world!」を難読化する」" . benkurtovic.com . 2017年9月14日時点のオリジナルよりアーカイブ。2017年10月18日閲覧。
  13. ^ “Obfuscated Python” . wiki.c2.com . 2017年2月14日時点のオリジナルよりアーカイブ2017年10月18日閲覧。
  14. ^ 「The First Annual Obfuscated Python Content」 . code.activestate.com . 2023年5月25日時点のオリジナルよりアーカイブ2017年10月18日閲覧。
  15. ^ domas (2022年11月3日), xoreaxeaxeax/movfuscator2022年11月12日時点のオリジナルよりアーカイブ。 2022年11月5日閲覧。
  16. ^ Break Me00 The MoVfuscator Turning mov into a soul crushing RE nightmare Christopher Domas、2015年9月25日、2022年10月21日時点のオリジナルよりアーカイブ。 2022年11月5日閲覧。
  17. ^ Williams, Al (2021年3月21日). 「One Instruction To Rule Them All: C Compiler Emits Only MOV」 . Hackaday . 2023年10月23日閲覧
  18. ^ 「JAPH – Just Another Perl Hacker」 pm.org Perl Mongers. 2013年5月16日時点のオリジナルよりアーカイブ。 2015年2月27日閲覧
  19. ^ 「暗号化技術のブレークスルーによりソフトウェアがハッキング不可能になる可能性」 Wired . ISSN 1059-1028 . 2022年4月14日時点のオリジナルよりアーカイブ2021年3月14日閲覧。 
  20. ^ Jain, Aayush; Lin, Huijia ; Sahai, Amit (2020). 「Indistinguishability Obfuscation from Well-Founded Assumptions」 . Cryptology ePrint Archive . arXiv : 2008.09317 . 2022年3月3日時点のオリジナルよりアーカイブ。 2021年3月14日閲覧
  21. ^ "Boaz Barak著「プログラムを難読化できるか?」 Math.ias.edu。2016年3月23日時点のオリジナルよりアーカイブ。 2013年11月25日閲覧
  22. ^ 「ウェブサイトがブロックされています。修正するにはHTTPSを無効にするしかありません... | AVG」 support.avg.com 2020年7月21日。2022年2月4日時点のオリジナルよりアーカイブ。 2022年2月4日閲覧
  23. ^ 2018年10月2日午前5時01分、サンフランシスコのトーマス・クラバーン氏。「Google、Chromeウェブストアの偽装コードに対して措置を講じる」。www.theregister.co.uk 2019年11月12日時点のオリジナルよりアーカイブ。 2019年11月12日閲覧{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)
  24. ^ Cimpanu, Catalin. 「Mozilla、難読化コードを含むFirefox拡張機能の禁止を発表」 ZDNet . 2020年3月5日時点のオリジナルよりアーカイブ。 2019年11月12日閲覧
  25. ^ 「GPLにおける『作品の改変のための推奨形式』という文言の背後にある理由」 Lwn.net。2013年12月2日時点のオリジナルよりアーカイブ。 2013年11月25日閲覧
  26. ^ 「フリーソフトウェアとは何か?」 gnu.org. 2013年10月14日時点のオリジナルよりアーカイブ2014年12月18日閲覧。
  27. ^周、明義;ガオ、シャン。ウー、ジン。グランディ、ジョン C.チェン、シャオ。チェン、チュンヤン。リー、リー (2023)。「展開されたニューラル ネットワークを保護するためのモデル難読化」{{cite journal}}:ジャーナルを引用するには|journal=ヘルプ)が必要です
  28. ^ Zhang, Tianwei; He, Zecheng; Lee, Ruby B. (2018年7月12日). 「データ難読化によるプライバシー保護機械学習」. arXiv : 1807.01860 [ cs.CR ].

さらに読む