generated at
Trojan source

実際に実行されるコードとエディタに表示されるコードを食い違わせる攻撃手法
複数の攻撃手法がレポートされている
1. 文字の順序が入れ替わるunicode制御文字を使う
RTLを強制する制御文字を使っている
関数の呼び出し先が変わったり、条件式の結果が反転したりする
3. homoglyphを使う
見た目は同じだがcodepointが異なるアルファベット
これも関数の呼び出し先を変えたり、条件式の結果を反転させたりできる
原理的には全てのプログラム言語で実現可能
攻撃対象
if文や早期return、コメントアウト
unicode対応が完璧な近代的なテキストエディタと、プログラマの目
他人の書いたコードが入ってくるインフラ
pull requestやpatchなど
日本語ではトロイのソース


しくみ
RTL制御文字を使っている
文字の順序が入れ替わる
U+202E
ブラウザのタイトルバーや本文も、この文字を解説しただけで影響を受けている
U+2066
U+2069



例:見た目に反してコメントアウトされているif文
if文の部分はコメントアウトされていない様に見えるが、実際にはコメントアウトされている
VSCodeやemacsだとこんな感じ
正しくuncode対応していると、逆にこうなってしまう
Scrapboxでの対策
Trojan sourceに使われる文字を可視化した
commenting-out.js
#!/usr/bin/env node var isAdmin = false; /*‮ } ⁦if (isAdmin)⁩ ⁦ begin admins only */ console.log("You are an admin."); /* end admins only ‮ { ⁦*/


例:if文が成立しそうで実はしない
stretch-string.js
#!/usr/bin/env node var accessLevel = "user"; if (accessLevel != "user‮ ⁦// Check if admin⁩ ⁦") { console.log("You are an admin."); }


例:ゼロ幅スペース (U+200B)が入っている
invisible-function.js
#!/usr/bin/env node function isAdmin() { return false; } function is​Admin() { return true; } if (is​Admin()) { console.log("You are an admin\n"); } else { console.log("You are NOT an admin.\n"); }


例:見た目は同じだがcodepointが違うアルファベット
こういうのをhomoglyphと呼ぶ様だshokai
homoglyph-function.js
#!/usr/bin/env node function sayHello() { console.log("Hello, World!\n"); } function sayНello() { console.log("Goodbye, World!\n"); } sayНello();
Hが U+41d になっている

対策
表示順序を制御する文字をそのまま描画しない