Trojan Source は、 Unicodeの双方向文字を悪用して、ソースコードの実際の実行とは異なる表示を行うソフトウェアの脆弱性です。 [ 1 ]この脆弱性は、異なる読み方向のスクリプトがコンピュータ上でどのように表示およびエンコードされるかを利用しています。これは、 2021 年後半にケンブリッジ大学の Nicholas Boucher と Ross Anderson によって発見されました。[ 2 ]
Unicodeは、テキスト、記号、グリフを表現するための符号化規格です。Unicodeはコンピュータ上で最も広く使われている符号化方式であり、2023年9月時点でウェブサイトの98%以上で使用されています。[ 3 ] Unicodeは多くの言語をサポートしており、そのため、さまざまなテキストの書き方をサポートする必要があります。これには、英語やロシア語などの左から右に書く言語と、ヘブライ語やアラビア語などの右から左に書く言語の両方のサポートが必要です。Unicodeは複数の書き方システムの使用を可能にすることを目的としているため、表示順序が異なるスクリプトを混在させ、競合する順序を解決できる必要があります。解決策として、Unicodeには、テキストの表示方法と表現方法を記述する双方向文字(Bidi)と呼ばれる文字が含まれています。これらの文字は多くの場合目に見えないため、視覚的に変更することなくテキストの解釈方法を変更するために悪用される可能性があります。[ 4 ]
このエクスプロイトでは、双方向文字を悪用してソースコード内のテキストを視覚的に並べ替え、後続の実行順序を改変します。双方向文字は、文字列リテラルが許可されているソースコードの領域に挿入できます。これは、ドキュメント、変数、コメントなどによく当てはまります。
上記の例では、RLI マーク (右から左への分離) により、次のテキストは表示とは異なる方法で解釈されます。最初に三重引用符 (文字列の終了) があり、次にセミコロン (新しい行の開始) があり、最後に早期リターン ( Noneを返し、その下のコードを無視) があります。新しい行は RLI マークを終了させ、下のコードに流れ込むのを防ぎます。双方向文字のため、一部のソースコードエディタやIDE は、コードが再配置されたことを視覚的に示さずに表示用にコードを再配置するため、人間のコードレビュー担当者は通常それを検出しません。ただし、コードがコンパイラに挿入されると、コンパイラは双方向文字を無視し、視覚的に表示される順序とは異なる順序で文字を処理する可能性があります。コンパイラが終了すると、視覚的には実行不可能に見えるコードが実行される可能性があります。[ 5 ]書式設定マークは複数回組み合わせて複雑な攻撃を作成できます。[ 6 ]
Unicode文字列をサポートし、Unicodeの双方向アルゴリズムに従うプログラミング言語は、この脆弱性の影響を受けやすい。これには、Java、Go、C、C++、C#、Python、JavaScriptなどの言語が含まれる。[ 7 ]
この攻撃は厳密にはエラーではありませんが、多くのコンパイラ、インタプリタ、Webサイトがこのエクスプロイトに対する警告や緩和策を追加しました。GNU GCCとLLVMの両方に、このエクスプロイトに対処するよう要請がありました。[ 8 ] Marek Polacekは、エクスプロイトが公開された直後に、潜在的に安全でない方向文字に対する警告を実装するパッチをGCCに提出しました。この機能は、-Wbidi-charsフラグの下でGCC 12にマージされました。[ 9 ] [ 10 ] LLVMも同様のパッチをマージしました。Rust は1.56.1でエクスプロイトを修正し、デフォルトで文字を含むコードを拒否するようにしました。Rustの開発者は、修正前に脆弱なパッケージを発見しませんでした。[ 11 ]
多くのソースコードエディタやIDEでは、これらの潜在的に危険な文字がより見やすく表示されるようになっています。Visual Studio Codeでは、デフォルトで制御文字がレンダリングされるようになりました。[ 12 ]研究論文で指摘されているように、 Notepad++とvimでは既にこれらの文字がより見やすくなっています。[ 13 ]
Red Hat はWeb サイトで警告を発し、この脆弱性を「中程度」と分類した。[ 14 ] GitHub はブログで警告を発し、リポジトリのコードで双方向文字が検出された場合にダイアログボックスを表示するように Web サイトを更新した。[ 15 ]