インターネット初の乗っ取り:あるボランティアが危うくLinuxをダウンさせるところだった。
500ミリ秒。
半秒。
インターネットが乗っ取られることを免れた、その差。
2024年3月。San Francisco。
38歳のMicrosoftエンジニア、Andres Freundは、Debian開発システムでPostgreSQLのベンチマークを実行していた。それは日常的な作業だった。FreundはPostgreSQLプロジェクトのコミッターであり、仕事の一環として、リリース前のLinuxディストリビューションに対するデータベースのパフォーマンスをテストしている。
テスト環境に何か異常がある。
失敗したSSHログイン試行 — 公開されているすべてのサーバーを常に襲う、ランダムなユーザー名とパスワードの組み合わせを試す自動ボットによるもの — が、あるべきよりもはるかに多くのCPUを使用していた。ログイン失敗はすぐに終了するはずだ。これらはすぐには終了しない。
Freundはそれに気づいた。
彼はさらに調査を進めた。自身のローカルマシンでのSSHログイン成功が、約100ミリ秒というベースラインよりも500ミリ秒長くかかっていた。
半秒。
FreundはメモリデバッグツールであるValgrindで接続を実行した。Valgrindはliblzmaを指すエラーを投げた — SSHデーモンが呼び出す正当な理由のない圧縮ライブラリだ。
ここで調査は緊急を要するものとなった。
その後数日間、Freundはエラーを追跡した。彼は、テストマシン上のsshdプロセスが認証中にliblzmaからのコードを実行していることを発見した。彼はgitリポジトリ内のxz-utilsのソースを分析した。ソースはクリーンだった。しかし、リリース版tarball — Debianが実際にダウンロードしてビルドする圧縮されたソースアーカイブ — には、gitソースには存在しないbuild-to-host.m4というファイルが含まれていた。
そのファイルには難読化されたスクリプトが含まれていた。そのスクリプトは、圧縮ライブラリのエラー処理用の壊れたテスト入力として偽装された、bad-3-corrupt_lzma2.xzというテストファイル内に隠されたbashスクリプトをデコードする。そのbashスクリプトは、カスタム難読化とRC4復号を組み合わせて、good-large_compressed.lzmaという2番目のファイルをデコードする。
この一連の連鎖の最後に現れるのは、コンパイルされた共有オブジェクトだった。
その共有オブジェクトはバックドアだった。
2024年3月29日の夜 — 彼自身の話によれば、料理休憩中にセキュリティポッドキャストを聞きながら — Andres FreundはOpenwallのoss-securityメーリングリストに彼の発見を投稿した。
24時間以内に、Red HatはそれにCVE番号を割り当てた。深刻度スコアは10.0。最高の値だ。CISAは緊急勧告を発行した。Debian、SUSE、Fedora、Arch、Kaliはすべて影響を受けるパッケージを元に戻した。GitHubはバックドアをコミットしたメンテナーのアカウントを停止した。
そのバックドアは、約2週間以内に安定版Linuxディストリビューションに同梱される予定だったことが判明した。
Freundはそれを偶然発見した。
これは、何が起こったのか。何が起こりかけたのか。そして、その作戦が何であったのかについての事件ファイルである。
攻撃の標的はxz-utilsだった。
xz-utilsは圧縮ツールキットである。その主要なツールであるxzコマンドは、より高い圧縮率を持つ.zipファイルのUnix版である.xzファイルを生成する。コマンドラインツールの下には、それを必要とする他のプログラムに圧縮アルゴリズムを提供するliblzmaというライブラリがある。
liblzmaは、直接的または間接的に、膨大な数のLinuxシステムソフトウェアによってロードされる。パッケージマネージャーはそれにリンクする。システムユーティリティはそれにリンクする。そして — 攻撃者が特別に仕組んだ連鎖を通じて — OpenSSHデーモンがそれにリンクする。
その連鎖は次のようになる。主要なLinuxディストリビューションのほとんどで、sshdはsystemdのサービス通知メカニズムであるsd_notifyをサポートするようにパッチが当てられている。このパッチにより、sshdはlibsystemdというライブラリをロードする。そして、libsystemdがliblzmaをロードする。
その結果:ほとんどのプロダクションLinuxサーバーでは、SSHデーモン — リモートログインを受け入れるプロセス — は、SSHが認証トラフィックを圧縮しないにもかかわらず、起動時に圧縮ライブラリをロードする。
圧縮ライブラリを侵害すれば、インターネット上のすべてのLinuxサーバーへのリモートアクセスを制御するデーモンを侵害することになる。
バックドアのほぼ展開時に、Linuxは世界のウェブサーバー上位100万台のうち約96パーセントを稼働させていた。世界の最も強力なスーパーコンピューター500台すべて。Amazon Web Services、Google Cloud、Microsoft Azureにわたる仮想マシンの約92パーセント。世界のスマートフォンの約85パーセントを動かすAndroidは、Linuxカーネル上に構築されている。
xz-utilsバックドアは、もし安定版ディストリビューションに同梱されていたら、上記のすべてのごく一部に存在していただろう。
Facebookの元最高セキュリティ責任者であるAlex Stamosは、意図された結果を「地球上のあらゆるSSHサーバーへのマスターキー」という一言で表現した。
これが、CVEが10.0と評価された理由である。
バックドアの技術的な設計は正確に理解する価値がある。
攻撃者は、リリース版tarballにはバージョン管理されたgitソースには存在しない自動生成ファイルが含まれているという事実を悪用した。具体的には、tarball内のbuild-to-host.m4ファイルには、ビルドプロセスのconfigureステップに難読化されたスクリプトを注入するために変更された1行が含まれていた。
これは、gitソースコードを読んだ人はバックドアを見ることができず、gitからビルドした人はそれをトリガーできなかったことを意味する。リリースされたtarballからビルドするLinuxディストリビューション — 事実上すべてのディストリビューションがこれに該当する — だけがインジェクションを実行することになる。
インジェクションの連鎖は3段階だった。第1段階では、破損した圧縮テスト入力として偽装されたファイルからbashスクリプトを抽出した。第2段階では、そのbashスクリプトを使用して2番目のテストファイルをコンパイルされた共有オブジェクトにデコードした。第3段階では、共有オブジェクトをコンパイルされたliblzmaバイナリにリンクした。
その共有オブジェクトは、IFUNC — 間接関数リゾルバー — と呼ばれる正当なglibc機能を利用して、RSA_public_decryptと呼ばれる特定のOpenSSH関数をハイジャックした。
RSA_public_decryptは、証明書認証中にRSA署名を検証するOpenSSH関数である。クライアントがRSA証明書を使用して接続を試みるたびに、sshdはこの関数を呼び出して署名を検証する。
バックドアがアクティブな状態では、sshdは代わりに攻撃者のコードを呼び出していた。
攻撃者のコードは、クライアントの証明書で渡される大きな整数値であるRSA公開モジュラスを検査した。通常、この値は標準的なRSA検証で使用される。バックドアでは、それは実際にはペイロードコンテナだった。コードはハードコードされたChaCha20対称鍵を使用してペイロードを復号した。そして、ハードコードされたEd448公開鍵を使用して復号されたペイロードの署名を検証した。
署名が検証された場合 — つまり、ペイロードが攻撃者の秘密鍵で署名されている場合 — コードは埋め込まれたシェルコマンドをrootとして実行した。
これが、セキュリティ研究者が「ゲーテッドリモートコード実行」と呼ぶものだ。バックドアは、攻撃者が有効な暗号署名を提示した場合にのみアクティブになる。偶然バックドアを発見した普通の攻撃者はそれを悪用できなかった。Ed448秘密鍵の所有者だけがそれをトリガーできた。
この詳細は重要だ。販売目的で脆弱性を構築する犯罪者は、それを購入する誰でも使用できるようにする。持続的なアクセス能力を構築する国家主体は、それを排他的なものにする。彼らと、彼らが明示的に許可した者だけがその鍵を使用できる。
xz-utilsバックドアは排他的使用のために設計された。それは脆弱性ではなかった。戦略的資産だった。
バックドアを生み出した作戦は、2021年1月26日に始まった。
その日、JiaT75というユーザー名でGitHubアカウントが作成された。表示名はJia Tanだった。そのアカウントには以前のデジタルフットプリントはなかった。その名前でのソーシャルメディアの存在もなかった。カンファレンスでの講演もなかった。以前のオープンソースへの貢献もなかった。データ漏洩での出現もなかった。その名前は偽名であると思われる。
JiaT75によるxz-utilsへの最初の公開貢献は、アカウント作成から9ヶ月後の2021年10月29日に行われた。それはエディターの設定ファイルに対する些細なパッチだった。無害で、重要ではない。精査を招くことなく存在を確立する類の貢献だった。
その後2年5ヶ月にわたり、JiaT75はオープンソースプロジェクトに500以上のコミットを行った。その大部分は正当な改善だった — コードレビュー、翻訳、継続的インテグレーションの保守、バグ修正など。有用な仕事であり、心から役立つものだった。
これらのコミットのうち、約8つが悪意のあるものだった。
その比率は重要だ。60対1。悪意のあるコミット1つに対し、オペレーターは60個の実際の、有用な仕事を生み出した。これが、統計的異常分析ではパターンを検出不可能にした理由だ。攻撃者は、最終的に重要となる8つの変更をコミットするために必要な信頼を蓄積するためだけに、2年半にわたる献身的な努力で真に価値のある貢献を生み出した。
その作戦は単独で行われたわけではなかった。
2022年4月から、Jigar Kumarと名乗るユーザーがxz-develメーリングリストに現れた。Kumarには2022年4月以前にリストでの履歴はなかった。彼の存在は、プロジェクトのリードメンテナーに対し、応答時間の遅さを訴え、新しいメンテナーを追加するよう要求する圧力メールで構成されていた。
2022年5月には、Dennis Ensという2番目のアカウントが現れ、xz-utilsのJavaバージョンのメンテナンス状況について問い合わせ、その後も追加の圧力メッセージを送った。
両アカウントは同じプロフィールを持っていた。2022年以前のデジタルプレゼンスはなし。xz-develメーリングリスト以外での活動はなし。圧力キャンペーンの前後に他のプロジェクトへの参加はなし。
2024年2月 — バックドアがコミットされる数週間前 — 3番目のアカウントが現れた。Hans Jansen。Jansenの役割は、Debianのメンテナーに対し、侵害されたxz-utilsのバージョンをできるだけ早く採用するよう圧力をかけることだった。2024年3月25日、Hans JansenはDebianのバグレポートを提出し、明示的にアップグレードを要求した。
その4日後、Andres Freundはoss-securityに彼の発見を投稿した。
krygorin4545とmisoeater91という2つの追加のサポートアカウントが、様々なスレッドで同じパターンに従って背景的な圧力を提供した。作戦前の存在なし。特定の圧力期間中のみ参加。目的達成後に消滅。
Kasperskyの事後分析では、ソックパペット名の地理的スタイルが一貫していない — シンガポール、ヨーロッパ、インド — ことが指摘されており、オペレーターが連携しているように見えないよう、意図的にカバーする身元を分散させていたことを示唆している。しかし、行動パターン — 出現のタイミング、同期したプレッシャーポイント、各目的達成後の集団的な消滅 — は、単一のオペレーターまたは緊密に連携したチームを示唆していた。
圧力は功を奏した。
2022年6月29日、xz-utilsのリードメンテナーであるフィンランドのソフトウェア開発者Lasse Collinは、メーリングリストに返信し、Jia Tanが今後プロジェクトでより大きな役割を担い、実質的にはすでに共同メンテナーとして機能していると述べた。
これが引き継ぎだった。
何が起こったのかを理解するためには、Lasse Collinの立場を理解する必要がある。
Collinは2009年以来、xz-utilsを一人で保守してきた。プロジェクトは無給だった。彼は自由な時間でそれに取り組んでいた。その同じ月の初め、2022年6月のメーリングリストの返信で、Collinは長期的なメンタルヘルスの問題に対処していることを公に認めていた。彼はプロジェクトを、彼自身の言葉で「無給の趣味のプロジェクト」と呼んだ。
Lasse Collinは起こったことの責任を負わない。セキュリティコミュニティはこの点で満場一致している。Collinは無給の趣味の仕事をしており、記録された健康上の問題に対処していた。彼は、国家レベルの諜報活動と判明した組織的なプレッシャーの下にあった。彼をその立場に置いたシステムが彼を失敗させたのだ。彼がシステムを失敗させたのではない。
この作戦が悪用したのはCollinの能力ではなかった。それは彼の構造的な立場だった — 一人で、無給で、現実世界のストレスに対処し、何十億人もの人々が使用するインフラを、組織的なサポートなしに維持する責任を負っていたこと。
専門の攻撃者はその構造を特定し、それを標的とした。
引き継ぎが完了すると、インフラの準備が始まった。
2022年10月、Jia TanはGitHubのTukaani組織に追加された。2022年12月には、彼はリポジトリの組織構造を作成し、最初のリリースを行った。2023年3月には、GoogleのOSS-Fuzz — 自動脆弱性スキャンプラットフォーム — の主要なセキュリティ連絡先メールアドレスをLasse Collinのアドレスから自身のものに変更した。その時点から、セキュリティ関連のバグレポートは、他の誰よりも先にJia Tanに届くことになった。
2023年6月、Jia TanはliblzmaにIFUNCリゾルバーインフラを導入した。これらのコミットは正当なパフォーマンス最適化作業に見えた。しかし、振り返ってみると、それらは最終的にバックドアが注入されるためのフックだった。
2023年7月、Jia TanはOSS-FuzzでxzのIFUNCファジングを無効にするプルリクエストをオープンした。この変更は、IFUNCベースのバックドアが最終的に出荷されたときに、ファズテストパイプラインが異常を検出するのを防ぐことを目的としていた。
2024年2月、別のコミットにより、プロセス権限を制限するLinuxカーネルのセキュリティ機能であるLandlockのビルドシステム検出が破損した。このコミットは、本来であればLandlockを適用するシステム上でxz独自のサンドボックスを無効にした。
2024年2月23日と3月9日、バックドア自体が2段階でコミットされ、xz-utils 5.6.0および5.6.1リリースの一部としてパッケージ化された。
19日後、Andres Freundは500ミリ秒のSSH遅延に気づいた。
作戦によって残されたコミットメタデータを分析した研究者たちは、あるパターンに気づいた。
Jia Tanのコミットタイムスタンプは、主に中央ヨーロッパまたは東ヨーロッパのタイムゾーンに集中していた。勤務時間は中央ヨーロッパ時間の午前9時から午後5時頃に相当した。活動は中国の主要な祝日中も継続し、いくつかのヨーロッパの祝日中には停止した。
名前、および主張された活動地域は東アジアだった。実際の作業パターンはヨーロッパだった。
これが、インテリジェンス工作アナリストがシグネチャリークと呼ぶものだ。オペレーターは30ヶ月以上にわたりカバーする身元を維持した。しかし、すべてのgitコミットに埋め込まれた自動タイムスタンプは、定期的にコミットを行ったマシンの実際の場所を明らかにした。
関連する専門知識を持つセキュリティ研究者による公開分析では、3つの候補帰属が登場している。
元NSAコンピュータ科学者であるアメリカのセキュリティ研究者Dave Aitelは、この作戦がAPT29 — 米国および英国政府によってロシア対外情報庁に帰属される高度持続的脅威グループ — に帰属するパターンに合致すると公に評価した。APT29は、2020年に開示されたSolarWindsサプライチェーン侵害を含む、長期間にわたるスパイ活動で知られている。モスクワ時間帯と一致する勤務時間は、Jia Tanのパターンと一致する。
KasperskyのGlobal Research and Analysis Teamの元ディレクターであり、高度な作戦の帰属に関して30年の経験を持つCostin Raiuは、2026年2月のポッドキャストインタビューで3つの有力な候補を特定した。ロシアのAPT29が1つ目。国家安全部と関連付けられる中国のAPT41が2つ目。以前のFragment Zeroの報道ですでに取り上げられている北朝鮮のLazarus Groupが3つ目だった。
2026年4月現在、いかなる情報機関もこの作戦を公に帰属させていない。起訴は行われていない。逮捕もされていない。Jia Tanの正体は不明のままだ。
関連する工作専門知識を持つ研究者の間で異論がないのは、この作戦の忍耐力、運用セキュリティ、暗号学的洗練度、および資源投入が国家の情報機関 — またはそれに匹敵する機能を持つ組織 — と一致しており、個人の犯罪活動やハクティビスト活動とは矛盾するという点である。
これは一匹狼のハッカーの仕業ではなかった。
xz-utilsの作戦は、現代のテクノロジー文明がその重要なインフラを構築する方法における構造的特徴によって可能となった。
インターネットを動かすソフトウェアは、かなりの程度、自己の時間で働くボランティアによって構築されてきた。このソフトウェアから利益を得ている企業は、その経済的価値のわずかな部分しか貢献していない。
xz-utilsはすべての主要なLinuxディストリビューションに同梱され、世界中のサーバーの莫大な割合で実行されていた。そのメンテナーは無給だった。インターネットのほとんどに暗号化を提供するライブラリであるOpenSSLは、2014年のHeartbleed脆弱性の前は人手不足で有名だった。2021年のLog4Shell脆弱性の背後にあるJavaロギングライブラリであるLog4jは、世界中のエンタープライズインフラの裏側で、少数のボランティアによって維持されていた。
いずれのケースでも、数十億ドル規模の企業によって重要インフラとして扱われるライブラリが、趣味のプロジェクトのリソースで維持されていた。
xz-utilsの作戦は、この構造的な脆弱性を発明したわけではない。それを悪用したのだ。
2024年4月11日 — Freundの開示から2週間後 — 米国サイバーセキュリティ・インフラセキュリティ庁は、構造的問題を認める公式声明を発表した。CISAの立場:オープンソースインフラを確保する負担は、個々の無給のメンテナーに課されるべきではなく、オープンソースソフトウェアを利用する企業は、持続可能なエコシステムを生み出すために、財政的に、あるいは開発者時間を通じて、貢献しなければならない。
勧告は拘束力のないものだった。それはベストプラクティスだった。それらは、歴史的に投資を報いてこなかった企業のインセンティブ構造による自主的な採用に依存していた。
1ヶ月以内に、Linux FoundationとOpen Source Security Foundationは共同警告を発表し、同様のソーシャルエンジニアリングによる乗っ取りの試みが、すでに他の複数のオープンソースプロジェクトに対して進行中であることを警告した。Node.js、jQuery、および関連するJavaScriptインフラを維持するOpenJS Foundationは、xz-utilsと同じパターンに従った組織的なプレッシャーキャンペーンを受けていたことを公に開示し、xz-utilsの開示がコミュニティに何を探すべきかを教えてくれたおかげで、それを撃退できたと述べた。
2026年のLinux Foundationのレポートは、エコシステム全体にわたるより広範なパターンを記録した。レポートの核心的な発見:xz-utilsで起こったことは単一の事件ではなかった。それは方法論だった。その方法論は大規模に試行されている。成功した検出のほとんどは、xz-utilsの事例が照合すべきシグネチャを提供したために起こっている。
どれだけの検出されていないものがあるか — すでに進行中でありながらまだ捕捉されていない作戦 — は、構造上、公開情報源からは数えられない。
Fragment Zeroの2話前、闇の森の仮説に関する事件ファイルは、ある観察で締めくくられた。Liu Cixinが2008年に形式化した教義 — 生存のための沈黙、戦略的必要性としての隠蔽、存在の危険としての暴露 — は、人類の紛争の歴史において最も古い運用セキュリティ原則である。
不確実な脅威と非対称な能力の条件下で活動してきたあらゆる勢力は、同じ結論に達してきた。
静かにしろ。慎重に動け。監視されていると想定しろ。
xz-utilsの作戦は、人間の信頼関係の中で実行された闇の森だった。
攻撃者はファイアウォールを破らなかった。攻撃者はゼロデイを悪用しなかった。攻撃者は暗号保護を迂回しなかった。攻撃者ははるかに単純なことを行った。攻撃者は3年間、公然と身を隠し、有用な仕事を生産し、真の信頼を築き、他の親切な貢献者とまったく同じように振る舞いながら、ほとんどの技術組織には想像できない戦略的忍耐力をもって — 静かに、忍耐強く — 準備されたインフラが使用される瞬間を準備していた。
攻撃は、それが静かであったためにほぼ完全に成功した。それは、いかなるセキュリティツールによっても、いかなる監査によっても、いかなる組織的防御によっても検出されず、あるエンジニアが偶然にも500ミリ秒の不審な遅延を観察したことによって発見されたのだ。
開示から数週間後、Mastodonに投稿されたAndres Freund自身の発見に関する声明は、この事件ファイルを締めくくるものとなるだろう。
将来、運に頼るのは悪い戦略だ。
xz-utilsのバックドアは捕捉された。
この作戦の闇の森バージョン — コンピュータシステムではなく信頼関係を標的とするもの — は、今この瞬間も、他の不特定多数の重要なオープンソースプロジェクトに対して試行されている。このパターンは機能する。それを機能させる経済的インセンティブは実質的に変わっていない。組織的な対応は現実的ではあったものの、不十分だった。
次のものを発見するエンジニアもまた、運が必要となるだろう。彼らは適切なシステム上で適切なタイミングで適切なベンチマークを見ていなければならない。異常をその根源まで追跡するほど関心を持っていなければならない。作戦の首謀者がすでにペイロードを安定版リリースに送ってしまう前に、彼らはその発見を公開しなければならないだろう。
彼らが必要とするのは、具体的には500ミリ秒だ。
その間隔こそが、2024年3月のインターネットと、地球上のSSHを実行しているすべてのLinuxサーバーを解き放っていたであろう、未知のアクターが持つ単一の暗号鍵との間に立ちはだかったものだ。
Fragment Zeroはこの事件ファイルを追跡し続ける。
事件ファイルは閉じない。それは待ち続ける。