1984年の予言が現実に:改ざんされたstripツールがLinux全体を侵食する

セキュリティLinuxオープンソースサプライチェーン攻撃コンパイラバックドア

データソース:arXiv + Lobsters + web research

1984年、チューリング賞の授賞式に登壇したケン・トンプソン(Ken Thompson)は、コンピュータサイエンス界を震撼させる予言を残した。たとえソースコードが完全に公開され、誰もが自由に監査できるソフトウェアであっても、「監査の目をすり抜けるバックドア」は確実に存在し得るという指摘である。悪意あるコンパイラは、プログラムのコンパイル時にバックドアを埋め込み、さらに自身を再コンパイルする際にはその不正なロジックを次世代のコンパイラバイナリへと複製する。ひとたびバイナリが生成されれば、悪意あるソースコードをリポジトリから跡形もなく消し去ったとしても、バックドアはバイナリ世代を超えて永続的に受け継がれていく。

それから42年。この恐るべき予言が完全な形で現実のものとなった。フランスのテレコム・パリ(Télécom Paris)とスウェーデン王立工科大学(KTH)の研究チームが7月27日にarXiv(2607.24888)で公開した論文により、この攻撃を実行するためにコンパイラすら必要ないことが証明されたのである。研究者たちが標的に選んだのは、GNU binutilsに含まれる目立たないバイナリ削減ユーティリティ「strip」だった。このツールをわずかに改ざんするだけで、NixOS Linuxディストリビューションのブートストラップ過程を通じてバックドアが次世代へと伝播し、最終的にシステム内のほぼすべての実行可能ファイルが感染するに至った。

1984年チューリング賞受賞者でUnix共同開発者のケン・トンプソン(2019年撮影)。出典:Wikimedia Commons 図:1984年チューリング賞受賞者でUnix共同開発者のケン・トンプソン。出典:Wikimedia Commons

コンパイラ攻撃が42年間「困難」とされた理由

トンプソンが提唱した元来の攻撃モデルには、極めて大きな前提条件が存在していた。それは、悪意あるコンパイラが「自身のソースコードを認識できること」である。自身のソースコードをビルドする瞬間に、悪意ある複製ロジックを生成バイナリへ注入しなければならないため、攻撃者はコンパイラ特有のコード構文パターンを特定・検知する複雑なロジックを記述する必要があった。

この依存関係こそが、コンパイラ型攻撃のアキレス腱だった。コンパイラのソースコードが進化したり、大規模なリファクタリングを受けたり、メジャーバージョンアップを遂げたりすると、構文検知ロジックが破綻し、感染の連鎖が断ち切られてしまうからだ。そのためセキュリティ業界では、トンプソンの「Trusting Trust」攻撃は理論上は成立するものの、実世界のソフトウェア保守サイクルを生き延びるのは困難であり、優れた思考実験の域を出ないと考えられてきた。

しかし今回の研究は、その壁を鮮やかに迂回した。研究チームが武器として選んだのは GNU strip である。このツールは実行可能ファイルからデバッグシンボルやシンボルテーブルを削除する機能に特化しており、いかなるソースコードも検査せず、生成もしない。

攻撃はELFファイルのバイナリ書き換えのみによって完結し、ソースコードには一切触れない。 ソースコードがどのように書き換えられ、リファクタリングされようとも、バックドアは無傷のまま生き残る。コンパイラ版よりもはるかに強靭で、根絶が難しいバックドアが誕生したのである。

バックドアはいかにして世代を超えて継承されるか

攻撃の経路は、NixOSのブートストラップ(bootstrap)機構を巧妙に利用している。NixOSがソースコードからOS全体をビルドする際、その起点となるのは約20個の事前コンパイル済みバイナリで構成される「バイナリシード(binary seed)」である。これが信頼の原点となる。システムはこのシードから出発し、ソースコードを用いて段階的にツールチェーンを再構築していく。そして最終的な標準ビルド環境(stdenv)が完成した時点で、ランタイムクロージャから初期シードへの依存関係は完全に切り離される。

研究者たちの手法は、このシード内に含まれる唯一の strip バイナリをあらかじめ改ざんしておくことだった。このシード版 strip が段階的ビルドで呼び出されると、ビルド対象である「次世代のstrip」に対して同一の悪意あるペイロードを注入する(論文中では「後継エッジ(successor edge)」と呼称)。シード自身が依存関係のクロージャから消え去った後も、ペイロードは生き残り、最終的なシステム環境へと浸透していく。

攻撃の設計と実装の概要図。出典:arXiv 2607.24888 図:攻撃の設計と実装の概要図。出典:arXiv 2607.24888

検証には実際の nixpkgs リビジョンが用いられた。GUIインストーラを含む完全なISOイメージのビルドに成功し、エラーは一切発生しなかった。結果として生成された依存クロージャには、1,199個のパッケージ成果物、3,799個のELF実行ファイルが含まれ、合計ディスク容量は6.16GBに達した。

感染の広がりは圧倒的だった。3,791個のコマンドライン(CLI)実行ファイルのうち、実に3,790個に感染マーカーが埋め込まれていた。唯一感染を免れたのは Firefox 147.0.3 だけだったが、その理由はビルドオプションに --disable-strip が指定されており、strip の実行工程そのものを完全にスキップしていたためである。

stripの工程を省いたソフトウェアだけが唯一の生存者となったという事実は、逆説的にこの攻撃の網羅性がどれほど恐るべきものであったかを証明している。

言語を問わず、すべての機能テストを通過

感染したプログラムは、あらゆる主要プログラミング言語のエコシステムにまたがっている。C/C++(bash, git, sudo, curl, python3.13)、Python(pydoc, idle)、Rust(rsvg-convert)、Go(captree)、Lua(lua)。攻撃は言語を選ばない。なぜならソースコードを解釈するのではなく、ビルド後のELFバイナリを直接改変するからだ。

さらに恐ろしいのは、システムテストの結果である。研究チームは仮想マシン上で完全なNixOSデスクトップ環境を起動し、テストを実施した。gnome-shellmutternautilus などの中核コンポーネントはすべて改ざんされた strip を経由してビルドされていたにもかかわらず、機能テストは1件たりとも失敗しなかった。感染したシステムは外見上、完全に正常に動作する——これこそが、本攻撃の最も危険な性質である。

論文では、バックドアの「休眠(dormancy)モード」についても言及されている。普段は有害な動作を行わず、自己の複製と伝播のみを静かに続け、攻撃者が指定した特定のターゲットやトリガー条件が現れた時だけ発動する。このような潜伏型攻撃は、通常の監視や健全性チェックでは一切の異常が検知されないため、発見が極めて困難である。

42年前の警告に、現代もなお耳を傾けない現実

トンプソンによる1984年の講演をきっかけに、計算機科学の世界では「信頼できるコンパイラ」に関する研究が進められてきた。代表的な防御策が、デビッド・A・ウィーラー(David A. Wheeler)が提唱した「多様性二重コンパイル(Diverse Double-Compiling: DDC)」である。これは複数の独立したコンパイラでビルド結果を相互照合することで改ざんを暴く手法だが、現実の主要Linuxディストリビューションにおいて、こうした防御策がデフォルト導入されることはほとんどなかった。

技術コミュニティ「Lobsters」での議論も興味深い歴史的背景を浮き彫りにしている。トンプソンは1984年の講演当時、すでに実動するプロトタイプを構築していたという証言や、GNU GuixやNixにおける stage0-posix / hex0 プロジェクトが、わずか数十バイトの機械語からすべてをソースコードでビルドする「フルソースブートストラップ(full-source bootstrap)」を目指して立ち上げられた経緯が語られた。また、Russ Coxはトンプソンの元祖コードを入手してUnix V6上で再現し、ブラウザ上で誰でも体験できる環境を公開している。

しかし、実際のシステム設計における現実は冷酷だ。不透明な事前ビルド済みバイナリへの依存を排除するフルソースブートストラップは、極めて膨大なエンジニアリング作業と継続的なメンテナンスコストを要求する。その重荷は、大半の主要ディストリビューションが背負いきれないほどの規模なのだ。

コード監査では決して見抜けないバックドア

この攻撃が突きつける本質的な教訓は極めて重い。それは、「ソースコードが公開されているから安全である」という認識は単なる幻想に過ぎない、ということだ。ソースコードの厳格な監査は、コード内の脆弱性や不正ロジックを見つけ出すことはできても、バイナリレイヤーで直接行われた改ざんを暴くことはできない。デバッグ情報を削除するだけの単なるツールが、ELFヘッダーに余計なバイト列を密かに書き込んでいるなどとは、誰も疑いすらしないからだ。

ケン・トンプソンが1984年に証明したのは、「ひとたび信頼の連鎖が崩れれば、ソース監査だけでそれを取り戻すことは不可能である」という真理だった。42年後の今、研究者たちはコンパイラよりもはるかに素朴で、はるかに疑われにくい strip というツールを使って、その冷徹な現実を再び突きつけてみせた。

ブートストラップチェーンの中に事前コンパイルされたバイナリシードが残り続ける限り、この攻撃経路が塞がれることはない。そして、完全な検証可能性を手に入れるための代償であるフルソースブートストラップを支払う覚悟は、現代のソフトウェアエコシステムにはまだ備わっていないのである。

参考リンク:

  • arXiv 2607.24888 論文
  • Lobsters ディスカッション (p5w5j6)
  • Ken Thompson, Reflections on Trusting Trust (1984)