Trojan source
実際に実行されるコードとエディタに表示されるコードを食い違わせる攻撃手法
複数の攻撃手法がレポートされている
1. 文字の順序が入れ替わるunicode制御文字を使う
関数の呼び出し先が変わったり、条件式の結果が反転したりする
見た目は同じだがcodepointが異なるアルファベット
これも関数の呼び出し先を変えたり、条件式の結果を反転させたりできる
原理的には全てのプログラム言語で実現可能
攻撃対象
if文や早期return、コメントアウト
他人の書いたコードが入ってくるインフラ
pull requestやpatchなど
しくみ
文字の順序が入れ替わる
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.");
}
invisible-function.js#!/usr/bin/env node
function isAdmin() {
return false;
}
function isAdmin() {
return true;
}
if (isAdmin()) {
console.log("You are an admin\n");
} else {
console.log("You are NOT an admin.\n");
}
例:見た目は同じだがcodepointが違うアルファベット
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
になっている
対策
表示順序を制御する文字をそのまま描画しない