trusting trust攻撃

コンパイラなどのビルドツールのバイナリにバックドアを仕込み、そのツールが自分自身の後継バイナリをビルドするときにバックドアを再注入させることで、ソースコードには一切悪意あるコードが存在しないまま汚染が世代を超えて生き続ける攻撃。Ken Thompsonが1983年のチューリング賞(Dennis Ritchieと共同受賞)の受賞講演で示し、1984年8月のCACMに「Reflections on Trusting Trust」として掲載された。 #security #supply-chain-attack #compiler

仕組み

Thompsonの構成では、汚染されたCコンパイラのバイナリが2つのパターンを認識する。

  1. loginのソースを認識したら、バックドア入りのバイナリを吐く。
  2. コンパイラ自身のソースを認識したら、上記1と2の両方のロジックを新しいコンパイラバイナリに再注入する。

こうしておけば、コンパイラのソースから悪意あるコードを削除しても構わない。クリーンなコンパイラソースを汚染されたコンパイラバイナリでコンパイルすると、出来上がったバイナリはまた汚染されている。ソースをいくら監査しても、汚染はバイナリの側だけを伝って永続する。

Thompsonの結論は「自分が全部書いたのでないコードは信用できない。ソースコードレベルの検証や精査では、信用できないコードから身を守れない」というもので、講演の主眼は「最終的に信用しているのはソフトウェアを書いた人間である」という点にある。

4つの役割

stripを使った2026年の研究は、この攻撃を成立させる要素を4つの役割に整理している。

役割 Thompsonのコンパイラ 一般化
変換 (transformation) ソースをコンパイルする 何らかのビルド成果物を作る/書き換える
認識 (recognition) ソースのパターン 対象を見分ける手段
注入 (implantation) コード生成 成果物へのペイロード埋め込み
後継辺 (successor edge) コンパイラがコンパイラをコンパイルする 自分の次世代を自分が処理する

このうち後継辺が、悪意あるソースを消したあとも汚染を永続させる本体。攻撃の必須要素はコンパイラであることではなく、この4つを1つのツールが同時に満たすことなので、コンパイラ以外のビルドツールにも成立しうる。

対策と、それぞれの限界

  • DDC (diverse double-compiling) — David A. Wheelerが2005年のACSAC論文と2009年の博士論文で定式化した手法。検証したいコンパイラのソースを、独立した別のコンパイラでビルドし直し、2つの結果が一致するかを見る。片方だけが持つThompson型の埋め込みは不一致として露出する。ただし多様化されるのはコンパイラであって、コンパイラ後段のツールではない。
  • 再現可能ビルド (reproducible builds) — 同じソースから常にビット単位で同一のバイナリが出るようにし、第三者のリビルダーがバイナリとソースの対応を確認する。ただし保証するのは「ビルドが決定的であること」であって「ビルド環境が正直であること」ではない。汚染されたシードを両方のビルドが使っていれば、同じ埋め込みがビット単位で再現されるだけで検知されない。
  • bootstrappable builds — そもそも信用せざるを得ない不透明なバイナリ(ブートストラップシード)の量を減らす方向。GNU Guixのfull-source bootstrapは、357バイトのhex0シードからstage0-posix(hex1, hex2, M0, M1, M2-Planet…)を積み上げてGCCまで到達する、2万ノード超のパッケージグラフを実現している。OCamlツールチェインに対する同種の取り組みがCamlboot。

3つとも「ソースからバイナリへの経路」を守る手法であり、コンパイル後に走るユーティリティは対象外という共通の穴がある。そこを突いたのがstripを運び屋にしたtrusting trust攻撃。

コンパイラの外への一般化

Thompson以前・以後にも、この構図をコンパイラの外に広げる議論はあった。

  • Karger and Schell (1974) — Multicsの脆弱性分析で、コンパイラを介したコード挿入に言及。Thompsonの講演より前。
  • Spinellis (2003) — 信用できないエージェントが動いているプラットフォームでは、そのセキュリティポリシー自体が信用できない、という形の一般化。
  • Bratus et al. (2014) — 本質はコンパイラに仕込まれたバグではなく、プログラムが入力をどう扱うかにあり、信用できない入力を読むプログラムなら同じ攻撃を担える、という主張。
  • Maynor (2004) — 弱点はコンパイラに限らず他の信用されたビルドツールにも一般化する、と指摘するにとどまり、実装は示していない。

「非コンパイラのビルドユーティリティによる、実ディストリビューションのブートストラップを通した自己増殖」という形で実装まで示したのが2026年のstrip版の研究。

出典

作成日時: 2026-09-06 01:15 / 更新日時: 2026-09-06 01:15