Skip to content
Tech AI Wire

改ざんされたstripがNixOS全体にバックドアを仕込める

研究者が、Ken Thompsonのtrusting-trust攻撃をコンパイラではなくGNU stripで構成し、NixOSインストーラのほぼ全バイナリにバックドアを仕込みました。

著者 Tech AI Wire Team

3 分で読めます

Linux上でコンパイル済みバイナリに対してstripコマンドを実行しているターミナル画面。

trusting-trust攻撃は、これまで常にコンパイラの問題として語られてきました。arXivの論文は、そうではないと示しています。5人の研究者が、ソースコードを読みも書きもしないビルドツールであるGNU stripを使って、この攻撃の完全な形を組み立てました。そしてNixOSのグラフィカルインストーラのほぼ全バイナリにバックドアを仕込みました。

著者はJulien Malka、Aman Sharma、Martin Monperrus、Stefano Zacchiroli、Théo Zimmermannの各氏です。論文は2026年7月27日に公開されました。

もとの攻撃とは何だったか

Ken Thompsonがこの考えを述べたのは1984年です。コンパイラを改ざんし、それがビルドするプログラムにバックドアを埋め込ませます。さらに、自分自身をコンパイルしているときを見分けて、同じ改ざんを新しいコンパイラに入れるよう仕込みます。

その後は、悪意のあるソースコードを消してかまいません。バックドアは再ビルドのたびに再生産され、コンパイラのソースを読んでも何も分かりません。

セキュリティの世界は、これをコンパイラ固有の脅威として扱ってきました。論文が突いているのは、まさにその前提です。

なぜstripが構図を変えるのか

GNU stripは、コンパイル済みファイルからデバッグシンボルを取り除きます。ソースコードを見ることはありません。書き換えるのは完成したELFファイルだけで、これはLinuxにおける実行ファイルの標準形式です。

研究者は、改ざんしたstripをNixOSのbinary seedに置きました。binary seedとは、ディストリビューションが自力で何かをビルドできるようになる前の出発点となる、少数のビルド済みバイナリのことです。そこからペイロードは、stripの世代が変わるたびに自分自身を複製していきます。

そしてもとのseedが依存グラフから完全に外れたあとも、最終的な標準環境まで生き延びます。改ざんされた出発点は消え、バックドアは残ります。

実行は実在のnixpkgsリビジョンfef9403a3e4d、GNU binutils 2.44、x86_64上で行われました。ビルドは失敗なく完了し、ほぼ全バイナリにバックドアを持つ動作するグラフィカルインストーラができあがりました。

この攻撃を捕まえられない防御策

ここは丁寧に読む価値があります。定番の答えが、それぞれ固有の理由で外れるからです。

防御策なぜ見逃すのか
Diverse double-compiling攻撃が「sits on both sides of the comparison and cancels out」
再現可能ビルド同じseedで再ビルドすると、埋め込みもビット単位で再現される
ブートストラップ可能なビルドbinary seedがどれだけ小さいかに比例してしか効かない

diverse double-compilingは、独立した2つ目のコンパイラでコンパイラを再ビルドし、結果が一致するかを確認します。著者はそれを「then checks that the two results agree」と述べていますが、両方の経路に存在するペイロードは、まさにその確認を通過します。

再現可能ビルドが目指すのは「make every build produce bit-for-bit identical output」であり、独立した再ビルド者がバイナリとソースの一致を確認します。出力が同一であることは、出力がきれいであることとは違います。

一方で論文は、効くものも指し示しています。「The full-source bootstrap in GNU Guix reduces the binary seed to a few hundred bytes and rebuilds the whole toolchain from auditable source above it」と著者は書いています。seedが小さいほど、埋め込みが隠れられる監査不能な素材は減ります。

これが開発者にとって意味すること

信頼の基盤をコンパイラと同一視するのはやめてください。ブートストラップの中で他のバイナリを変換するバイナリはすべて対象であり、そこにはstrip、リンカ、アーカイバ、インストーラが含まれます。多くの脅威モデルは、これらを一度も挙げてきませんでした。

再現可能ビルドを保証の根拠にしているなら、それが何を証明するのかを正確に理解してください。証明するのは、ビルドが決定的であることです。入力がきれいだったことは証明しません。そしてこの攻撃は、意図的に決定的です。

NixOSを本番で使っているなら、何が起きて何が起きていないかを分けて考えてください。攻撃は実在のリビジョン上で研究者によって実演され、再現用パッケージも公開されています。NixOSプロジェクトからの公式な応答はなく、研究室の外で誰かがこれを実行した形跡もありません。

実務上の要点はseedの大きさです。Guixの数百バイトは、通常のbinary seedとはリスクの桁が違います。自分たちのディストリビューションはブートストラップ可能だと言われたら、その数字を尋ねてください。オープンソースのガバナンスは今年よく動いており、DebianによるAI支援の貢献に関する投票からNixpkgsコアチームの解散まで話題が続きました。今回は、ビルドの経路にも注意が要ることを思い出させます。

出典

  1. Trusting-Trust Attack against an Entire Linux Distribution (via the strip utility) - arXiv
  2. Replication Package - figshare

関連記事

A terminal running benchcmp to compare a scalar Go benchmark against a vectorised one, with the delta column showing the speed-up.
Coding

Debian Code Search、最後のcgo依存を削除

Michael Stapelberg氏が7年前のCライブラリを、実験的なSIMDパッケージを使った純粋なGo実装に置き換え、C版と同等の速度に到達しました。