参考までに:AIツールはバイナリ実行ファイルから匿名のコード作成者を識別できる

Table of Contents

参考までに:AIツールはバイナリ実行ファイルから匿名のコード作成者を識別できる

究極の Git Blame について話します。

AI 搭載ツールによって、ソフトウェア実行ファイル内の低レベルのマシンコード命令からプログラマーが識別される可能性があります。

これは、プリンストン大学、Shiftleft、ドレクセル大学、Sophos、ブラウンシュヴァイク工科大学の専門家によるもので、彼らは、バイナリ ファイルにスタイロメトリを適用する方法について説明しています。

プライバシー保護アプリなどのソフトウェアを匿名で開発したい人にとっては、この技術によって身元が明らかにされる可能性があるため、これは少々悪いニュースです。一方で、マルウェア作成者の特定を目指す犯罪捜査員にとっては、むしろ良いニュースと言えるでしょう。

本質的には、マシンコードは C のような言語に逆コンパイルすることができ、その後、機械学習アルゴリズムを使用して既知のプログラマーまで遡ることができます。

法医学

ソースコードの文法測定法(ソースコードの構文を分析して作成者に関する手がかりを得る手法)は、デジタルフォレンジックで使用される確立された手法です。

米国陸軍研究所 (ARL) は、「スタイル測定学の研究により、匿名のコード投稿者であっても、その作成者が以前にコードを公開したことがあれば、匿名性を解除して元の著者を明らかにできることが証明されている」と述べています。

この技術は、ウイルス作成者の特定に役立つだけでなく、検閲対策ツールやその他の違法プログラムの作者を暴くのにも役立ちます。多くのプログラマーが自分たちが持っていると思い込んでいるプライバシーを侵害する可能性を秘めています。

ソースコードは人間が読めるように設計されていますが、バイナリ(通常はソースコードをコンパイルまたはアセンブルして生成される)には、作者を示唆する特徴が少なくなっています。ツールチェーンは、変数名、関数名、その他のシンボルやメタデータ(作者に関する情報を含む可能性があります)を削除し、最適化によってコード構造を変更するように指示することができます。

それでも、研究者のアイリン・カリスカン、ファビアン・ヤマグチ、エドウィン・ドーバー、リチャード・ハラン、コンラッド・リーク、レイチェル・グリーンシュタット、アルヴィンド・ナラヤナンは、2011年の論文で説明された研究を基に、機械学習と計量文学的手法を使用してバイナリファイルを分析できることを実証しました。

「匿名性を維持したいプログラマーはプライバシーを守るために極端な対策を講じる必要があることを私たちは示しています」と、先月米国カリフォルニア州で開催されたネットワークおよび分散システムセキュリティシンポジウム(NDSS 2018)で発表された論文の中で、この研究者たちは説明した。

研究者らは、Google の Code Jam チャレンジに提出されたソリューションを分析し、プログラマー 1 人あたり 8 つのトレーニング サンプルを使用して、候補者プログラマー 100 人のプールでは 96 パーセントの確率で、候補者 600 人のプールでは 83 パーセントの確率で、作成者を正確に特定することができた。

また、高度なスキルを持つプログラマーは、より独特なスタイルを開発するため、初心者よりも簡単に識別できることもわかりました。

具体的には、研究者は C++ Code Jam ソリューションを取得し、GCC ツールチェーンを使用して 32 ビット x86 ELF Unix 実行ファイルにコンパイルし、逆コンパイル識別プロセスを実行しました。

バイナリからプログラマーの匿名性を解除する

実行ファイルからコード作成者を特定する方法

研究者たちはGitHubから収集したサンプルでこの手法をテストしました。GitHubリポジトリにはリポジトリ所有者以外の人物が作成したモジュールが含まれていることが多いため、Google Code Jamデータセットよりも分析が困難でした。それでも、50人のプログラマーを対象に65%の精度を達成しました。

多数の GitHub サンプル (あるケースでは 7 個、別のケースでは 11 個) を持つプログラマーの場合、精度は 100 パーセントに向上しました。

論文では、4 段階のプロセスについて説明しました。Radare2 と ndisasm を使用してプログラムをバイナリから逆アセンブルし、マシン コード命令を取得する。Hex-Rays デコンパイラを使用してプログラムを C のような疑似コードに逆コンパイルする。次元削減によって、コードを最も顕著な潜在的識別子に削減する。そして、機械学習アルゴリズムであるランダム フォレスト分類器を使用してコードを処理する。

運ぶ(ビット)隠す

プライバシー保護に関心のあるプログラマーは、コードを難読化して作者を隠せると考えるかもしれません。しかし、専門家たちは、意図的に改変されたコードでさえも特定することに成功したと報告しています。

彼らは GNU strip ユーティリティを使用してバイナリからすべてのシンボル情報を削除しましたが、これによって分類精度は 24 パーセント低下しましたが、「実行可能バイナリからシンボル情報を削除するだけでは、実行可能バイナリのサンプルを匿名化するのに十分ではない」という結論に達しました。

同様の手法で、彼らはObfuscator LLVMなどのツールを用いてバイナリを処理することも試みた。これらのツールは、命令を意味的に同等のものに置き換えたり、制御フローグラフを変更したり、さらには不要な命令を追加したりすることができる。それでも、著者の特定精度は88%だった。

ここでの注意点は、研究者らが、著者を隠そうとしないプログラマーに焦点を当てており、彼らが評価しなかったより洗練された反フォレンジック技術が存在することを認めている点です。

プリンストン大学の博士研究員であるアイリン・カリスカン氏は、今週金曜日にザ・レジスターに送った電子メールの中で、リンターのようなコードフォーマットツールの影響を分析していないものの、ある程度の効果があるかもしれないが、その影響は匿名化するには不十分だと述べた。

「特にプログラマーが同じフォーマット方法を決定論的に使用した場合、匿名化の解除には全く効果がありません」と彼女は述べた。「難読化やシンボル除去を行っても、バイナリの匿名化は実現しません。」

「対策としては、様々なツールを用いた非決定論的な方法での難読化、あらゆる種類のマルウェアやコードのプロパティとパッキングのランダム化、時間パターンの隠蔽、そしてコマンド&コントロールサーバーなどのマルウェア特有の要素の隠蔽などが挙げられます」と彼女は説明した。「語彙やレイアウトのリファクタリングといった単純な難読化(現在市販されている難読化ツール)は、コードの文法構造に影響を与えないため、全く効果がありません。そのためには、例えば関数仮想化ツールの使用が必要になります。」

推奨事項

プライバシーを守りたい開発者に対して、研究者はいくつかの推奨事項を提示しているが、それに従うのは難しい。

1 つは、文体比較の基礎として役立つ公開リポジトリがないことです。

もう一つは、リリースするコードごとに異なるIDを使用することです。次に、ソフトウェアごとに異なるコーディングスタイルを採用することです。最後に、異なる最適化と難読化を適用することを提案しています。

プライバシーが目的なら、Caliskan 氏は、パブリック コード リポジトリをオンラインで維持しないことを第一歩として提案しました。

「より重要なのは、インターネット上に一切の存在感を持たないことです」と彼女は述べた。「ランダムな仮名、ランダムなコード、そしてマルウェア(マルウェア作成者がたった一つのコードサンプルを全世界に公開するつもりでない限り)、そして上記の方法は、第一歩です。」®

Discover More