匿名プログラマーをコーディングスタイルで特定する手法

By Kim Crawley

本ブログ記事は、2018年9月17日に米国で公開された抄訳版です。原文はこちらからご覧頂けます。

マルウェアのフォレンジックを担当している人にとって、匿名のコードの作者を特定するための優れた方法があれば大変有益でしょう。たとえば、SamSamランサムウェアは、病院や都市全体のネットワークに対して多大な被害を与えました。この攻撃の背後にいるのはたった1人のマルウェア作者であると考えられています。この人物を特定できたら素晴らしいことでしょう。

コンピューターサイエンスのRachel Greenstadt准教授とAylin Caliskan助教授は、今年のDEFCONにおいて、コードの使用パターンからプログラマーを特定する手法を発表しました。その要旨の一部を紹介します。

「多くのハッカーは、コード、バイナリ、エクスプロイトを匿名で提供することを好みます。しかし、それらは本当に匿名でしょうか。我々のプログラマー非匿名化に関する研究は、機械学習を活用し...抽象的な構文ツリーの中に、スタイルに基づくフィンガープリントが存在し、そのフィンガープリントを利用してコードやバイナリのプログラマーを特定できる可能性があることを示します。我々が行ったプログラマー非匿名化の研究では、難読化されたバイナリと実際のコードを使用しています。コードは、単一作者のGitHubリポジトリから取得したものと、流出事件を起こしたNulled.IOのハッカーフォーラムから取得したものを使用しています」

これは、個人言語という言葉や法言語学の分野を思い起こさせます。法言語学の研究が始まったのは1927年であると考えられています。AP通信は、身代金を要求する文書を書いた人間の特定方法に関する考察を記事にしています。

個人言語とは、ある個人が言語を使用する際の独特の方法を指す言葉です。法言語学にとって、個人言語を特定することは重要なことです。個人言語は方言よりもはるかに固有性の高いものです。

私のことを個人的に知っている人であれば、私が「quite frankly!」という言葉で文をしめくくるのが好きであることを知っているでしょう。また私は、物事を説明するときに同じ意味の形容詞を2つまたは3つ使うことを好みます。たとえば不愉快なことを表現するときに、「obnoxious, unpleasant, and annoying」のような言い方をします。さらには、「mayn’t?」という言葉を聞いたことがあるでしょうか。私はよくこの言葉を口にしますが、他の人はあまり使用しないでしょう。

DEFCONでのGreenstadt氏とCaliskan氏のプレゼンテーションは、Edwin Dauber氏およびRichard Harang氏との共著論文「Git Blame Who?: Stylistic Authorship Attribution of Small, Incomplete Source Code Fragments」(Git blameで人探し:小さく不完全なソースコードの断片からスタイルによって作者の属性を識別)に掲載されています。彼女たちがテストサンプルを取得した方法は以下のとおりです。

「(重複を)取り除き、1行以上の実コード(空白やコメント以外)を含むサンプルを作者1人あたり150以上取得可能であるというしきい値を設定したところ、106人のプログラマーが選別されました。このしきい値は、トレーニングセットとテストセットの両方において十分なデータを確保するために、実験的マインドセットによって選ばれたものです。次に、git blameコマンドを使用してコードの各行の作者を調べ、そのプログラマーが書いたひとまとまりのコード行をダミーのmain関数の中にカプセル化し、抽象的な構文ツリーから特徴を抽出しました」

この研究者達は、複数のコードサンプルを取得したと判断した後で、作者を特定するためにいくつかの手法を使用しています。それらの手法について次のように述べています。

「この手法では、3つの実験的設定を使用しました。1つ目は既知のトレーニングセットとテストセットの両方のサンプルの組み合わせです。2つ目はトレーニングサンプルのみの組み合わせ、3つ目はテストサンプルのみの組み合わせです。2番目に提案する手法は、我々がより適切であると考える手法です。この手法では特徴ベクトルに一切の調整を行いません。その代わりに、個々のサンプルに対して同じ分類を実行し、それらのサンプルの結果を集約する必要があります(他の手法ではサンプルをマージします)。予測されたクラスではなく分類器の確率分布出力を集約し、集約されたサンプルの予測値として、最大の平均確率を持つクラスを使用します」

Greenstadt氏とCaliskan氏は、高度なプログラマーのほうが初心者よりも一般的に特定が容易であることを発見しました。初心者は、他のどこかで見つけたコードの断片を使用する傾向があります。また、人間が話す言語と同様に、あるレベルの流暢さに到達するまでは、その人に特有の個人言語は現れないのが一般的です。

DEFCONにおけるGreenstadt氏とCaliskan氏のプレゼンテーションでは、彼女たちの最近の研究を取り上げています。その研究では、機械学習のアルゴリズムを使用したコードサンプルの分析や、使用する語句の選択、コードの長さ、コードの編成方法などの特徴の抽出を行っています。彼女たちの手法の精度はとても良く、約83%の確率でコード作者を特定できました。

これらの研究手法は、マルウェアのコードを調べてサイバー攻撃者を特定するのに非常に役立ちます。またこの研究は、コードの著作権や知的財産権に関する法的紛争において役立つ可能性があります。ただし、これらの知見が悪用される可能性もあります。プログラマーがオープンソースのコードを作成するときに匿名であることを選ぶのには正当な理由があり、それは何となく理解できます。たとえば、敵対する政府が好ましくないと考えるようなソフトウェアを開発する場合などがこれに該当するでしょう。

Greenstadt氏は、DEFCONの後もこの研究を続ける予定であると述べています。「我々は引き続き、特定の個人に属する特徴とそうでない特徴を理解しようとしています。そこには多くの懸念があることは承知していますが、公に貢献する人が減らないことを期待しています」

Tags: