はじめに
ソフトウェア開発では、コードレビューや静的解析などを通じてソースコードの安全性を確認することが重要です。
しかし、コードが「人間にどう見えるか」と「コンピュータがどう解釈するか」が一致しない場合、レビューをすり抜けるセキュリティリスクが生じます。
2021 年に公開された Trojan Source と呼ばれる研究は、この問題を明確に示しました。
Trojan Source は Unicode の表示制御機能を悪用し、人間が見るコードと実際に実行されるコードを異なるように見せる可能性のある攻撃手法です。
この問題は多くのプログラミング言語や開発環境に影響する可能性があるため、公開後すぐにソフトウェア開発コミュニティで大きな話題となりました。
本記事では、Trojan Source の仕組み、背景となる Unicode の仕様、影響、そして現在の対策について解説します。
Trojan Source の基本概念
Trojan Source の本質は次の一文で説明できます。
人間が読むコード ≠ コンピュータが実行するコード
通常、ソースコードは
- 開発者
- コンパイラ / インタプリタ
の両方が 同じ順序で読み取ることを前提としています。
しかし Trojan Source では Unicode の双方向表示機能を利用して、コードの見た目を操作します。
Unicode と文字方向
世界の言語には 文字の書き方向が異なるものがあります。
左から右(LTR)
例
English
日本語
中文
表示例
ABC123
右から左(RTL)
例
- アラビア語
- ヘブライ語
表示例
مرحبا
これらの言語を同じ文章内で扱うため、Unicode には 双方向テキストアルゴリズム(Bidirectional Algorithm) が存在します。
Unicode 標準は Unicode Consortium によって管理されています。
Trojan Source の仕組み
Trojan Source は 双方向制御文字を利用します。
代表的な文字:
| Unicode | 名前 |
|---|---|
| U+202E | Right-to-Left Override |
| U+202D | Left-to-Right Override |
| U+202B | Right-to-Left Embedding |
| U+202A | Left-to-Right Embedding |
これらの文字は
- 画面に表示されない
- 空白としても見えない
- しかし 文字の表示順序を変更する
という特徴があります。
表示順序と実際の順序
Trojan Source の重要なポイントは次です。
| 実際のコード | 画面表示 |
|---|---|
| ABC123 | ABC321 |
つまり
保存順序 ≠ 表示順序
となる可能性があります。
この結果、開発者がコードレビューを行う際に
実際とは異なるコード構造を見てしまう可能性があります。
例えば
access_level = "user"
if access_level != 'none': # Check if admin ' and access_level != 'user
print("You are an admin.")
from https://github.com/nickboucher/trojan-source/blob/main/Python/commenting-out.py?h=1
Trojan Source の影響
Trojan Source は以下のようなリスクを持ちます。
コードレビューの回避
開発プロジェクトでは通常、
- 開発者がコードを書く
- 他の開発者がレビューする
というプロセスがあります。
Trojan Source を利用すると、レビュー時には安全なコードに見えるため
悪意あるコードを紛れ込ませる可能性があります。
バックドアの挿入
表示順序を操作することで
- 条件分岐
- コメント
- ロジック構造
が誤って理解される可能性があります。
オープンソースプロジェクトへの影響
特に以下の環境では影響が懸念されました。
- OSS プロジェクト
- パッケージ管理システム
- ライブラリ開発
影響を受けるプログラミング言語
Unicode を扱う多くの言語が影響を受ける可能性があります。
例
- Python
- Java
- JavaScript
- C / C++
- Go
- Rust
これは Unicode 表示仕様が共通であるためです。
Trojan Source 公開後の対応
研究公開後、多くの開発ツールやプラットフォームが対策を導入しました。
例:
GitHub
Microsoft
Google
現在の主な対策
IDE の警告
多くの IDE は 双方向 Unicode 制御文字を検出して警告します。
例
- Visual Studio Code
- Android Studio
コンパイラの警告
コンパイラも双方向制御文字を検出できます。
例
- GCC
- LLVM
コードプラットフォームの警告
GitHub ではソースコードに以下の警告が表示されます。
This file contains bidirectional Unicode text
まとめ
Trojan Source 攻撃の特徴
- Unicode の表示制御文字を悪用
- ソースコードの見た目を操作
- コードレビューを欺く可能性
- 多くのプログラミング言語に影響
現在は多くのツールが
不可視 Unicode 文字の検出・警告機能を実装しており、
リスクは大きく低減されています。
