Trojan Sourceとは何か、そしてどのようにソースコードに紛れ込むのか

11月初旬、ケンブリッジ大学は「Trojan-Source」と題した研究結果を発表しました。この研究は、方向指定フォーマット文字を使用して、ソースコードやコメント内にバックドアを隠蔽する手法に焦点を当てています。これを利用すると、コンパイラが解釈するロジックと、人間のコードレビュー担当者が目にするロジックが異なるコードを作成することが可能になります。
この脆弱性は新しいものです。Unicodeが悪用された例は過去にも存在しましたが(例えば、ファイル名の末尾部分の方向を反転させることで、本来の拡張子を隠蔽するなど)、今回の研究で明らかになったのは、多くのコンパイラがソースコード内のUnicode文字を警告なしに無視する一方で、コードエディタを含むテキストエディタは、それらの文字に基づいてコメントやコードの行を再配置(リフロー)してしまう可能性があるという点です。その結果、エディタ上ではコンパイラが解析するものとは異なる順序でコードやコメントが表示され、最悪の場合、コードとコメントが入れ替わってしまうことさえあります。
詳細については以下をご覧ください。また、実際に手を動かしてTrojan Sourceのシミュレーション攻撃を試してみたい方は、無料のパブリックミッションに挑戦し、その脅威を直接体験してみてください。
双方向テキスト
Trojan-Source攻撃の一つは、UnicodeのBidi(双方向)アルゴリズムを利用します。これは、英語(左から右)とアラビア語(右から左)のように、表示順序が異なるテキストを混在させるための仕組みです。方向指定フォーマット文字を使うと、文字のグループ化や表示順序を再構成することができます。
上の表は、この攻撃に関連するBidiオーバーライド文字の一部です。例えば、次のようなケースを見てみましょう。
RLI e d o c PDI
RLIはRight-to-Left Isolate(右から左への分離)の略です。これは、テキストをそのコンテキストから分離し(PDI、Pop-Directional-Isolateで囲まれた範囲)、右から左へと読み込ませます。その結果、以下のようになります。
c o d e
しかし、コンパイラやインタプリタは通常、ソースコードを解析する前にBidiオーバーライドを含むフォーマット制御文字を処理しません。もしこれらの方向指定フォーマット文字を単に無視した場合、次のように解析されます。
e d o c
古いワインを新しい革袋に?
もちろん、これは今に始まったことではありません。過去にも、方向指定フォーマット文字をファイル名に挿入して悪意のある性質を隠蔽する手法が存在しました。例えば、メールの添付ファイルが「myspecialexe.doc」と表示されていても、RLO(Right-to-Left override)文字が含まれていれば、実際には「myspecialcod.exe」というファイル名である可能性があります。
Trojan Source攻撃では、ソースコード内のコメントや文字列に方向指定フォーマット文字を挿入します。これらは構文エラーやコンパイルエラーを引き起こさないためです。これらの制御文字はコードのロジックの表示順序を変更し、コンパイラに人間とは全く異なる読み方をさせるのです。
例えば、以下のバイト順で構成されたファイルがあるとします。

方向指定フォーマット文字によって、次のように順序が入れ替わります。

方向指定フォーマット文字が明示的に表示されない場合、コードは次のようにレンダリングされます。

RLOは最終行の閉じ括弧を開始括弧に(またはその逆に)反転させます。このコードを実行すると「You are an admin」と表示されます。管理者チェックはコメントアウトされていますが、制御文字によって、あたかも存在しているかのように見えてしまいます。
(出典: https://github.com/nickboucher/trojan-source/blob/main/C%23/commenting-out.csx)
どのような影響があるのでしょうか?
C、C++、C#、JavaScript、Java、Rust、Go、Pythonなど、多くの言語がこの攻撃に対して脆弱であり、さらに多くの言語が影響を受けると考えられています。経験豊富な開発者であればソースコード内の方向指定文字に違和感を覚えるかもしれませんが、初心者であれば特に気に留めない可能性があります。さらに、これらの文字の可視化はIDEに大きく依存するため、必ず発見できるという保証はありません。
では、この脆弱性はどのようにしてソースコードに紛れ込むのでしょうか。第一に、悪意のあるコードが混入した信頼できないソースを利用した場合です。第二に、インターネット上のコードをコピー&ペーストした場合で、これは多くの開発者が経験していることでしょう。多くの組織が複数のベンダーのソフトウェアコンポーネントに依存しています。ここで問われるのは、それらのコードをどこまで完全に信頼できるかという点です。隠されたバックドアを含むソースコードをどのように検出すればよいのでしょうか。
誰が解決すべき問題なのか?
コンパイラやビルドパイプラインは、文字列やコメント内に限定されている場合を除き、複数の方向性を持つソースコード行を許可すべきではありません。文字列やコメント内の方向指定文字は、適切に終了処理がなされない場合、行末まで影響を及ぼす可能性があることに注意が必要です。一般的に、コードエディタはホモグラフや方向指定文字などの疑わしいUnicode文字を明示的にレンダリングし、強調表示すべきです。GitHubでは11月より、双方向Unicodeテキストを含むコード行に警告マークとメッセージを表示するようになりましたが、行内のどこに該当文字があるかまでは強調されません。そのため、無害な変更に紛れて悪意のある変更が入り込む余地が残されています。
開発者やコードレビュー担当者の意識向上が不可欠です。そのため、私たちはこの脆弱性を解説するウォークスルーを作成しました。現在、Java、C#、Python、Go、PHPに対応しています。
詳細については、Trojan Sourceのシミュレーション(公開ミッション)を試すか、Trojan Sourceに関する研究論文をご覧ください。
AI主導の開発をリリース前にガバナンスする
AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。
他のブログ記事を見る
セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
AIを活用した開発をリリース前にセキュアに
開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。



.avif)