Skip to content

Instantly share code, notes, and snippets.

@coalg
Last active April 16, 2024 12:04
Show Gist options
  • Save coalg/4a5115cf1902625c6f09af2ebcc4d51e to your computer and use it in GitHub Desktop.
Save coalg/4a5115cf1902625c6f09af2ebcc4d51e to your computer and use it in GitHub Desktop.
xz/liblzmaのバックドア脆弱性

重要度Criticalの案件。以下の各記事はClaudeに要約させている(うまく要約できてないのもあります)

サプライチェーン攻撃の典型例、というか最悪のパターンに近い。

初報

oss-security - backdoor in upstream xz/liblzma leading to ssh server compromise

  • xzユーティリティのアップストリームリポジトリとリリースtarが不正なバックドアによって改ざんされていた
  • リリースtar(5.6.0および5.6.1)には、configureスクリプトを介してコードを注入するバックドアが含まれていた
  • リポジトリにも、obfuscated状態のバックドアコードが含まれていた
  • このバックドアは、以下の条件でのみ有効になる
    • x86-64 Linux
    • GCCおよびGNU linkerを使用
  • バックドアが有効な場合、以下の影響がある
    • opensshサーバのログイン時間が大幅に遅くなる
    • バックドアはopensshdのRSA_public_decrypt関数をフックし、認証をバイパスする可能性がある
  • まだ広く普及していないが、一部のLinuxディストリビューションで予備リリースに含まれている
  • 影響を受ける可能性のあるシステムは早急にアップグレードする必要がある

HNのコメント

Backdoor in upstream xz/liblzma leading to SSH server compromise | Hacker News

  1. バックドアの背後にいたJiaT75はxzプロジェクトに2年以上関わっていた。彼はFedoraにxz 5.6.xを追加するよう働きかけ、valgrindの問題を修正する手伝いをした。しかし、その問題はバックドアが原因だった可能性がある。
  2. Homebrewでxzの悪意のあるバージョンがインストールされた可能性がある。brew upgradeで最新の安全なバージョンに戻せる。
  3. GitHub上のtukaaniリポジトリが無効化され、リリースのダウンロードも不可能になった。
  4. AlpineLinuxやArch Linuxなどの主要ディストリビューションでこの問題への対応が進行中。
  5. JiaT75のGitHubアカウントとLasse Collinのアカウントが凍結された。
  6. バックドアコードがxz-embeddedにも組み込まれていた可能性がある。xz-embeddedはLinuxカーネルで使われている。
  7. 同じ作者がGettextにも関与していた可能性があり、それも危険にさらされていたかもしれない。
  8. 長期的にはxz形式そのものに信頼性と安全性の問題があるという指摘もある。

総じて、広範囲にわたる深刻な脆弱性であり、影響を最小限に抑えるため多くのディストリビューションで対応が進められている

このあたりのコメントを見るとJiaT75はxz以外にもlibarchiveにバックドアを仕掛けに行っていることが分かる。

Maybe not. They removed safe_fprintf() here and replaced it with the (unsafe) fp... | Hacker News

解析1

Filippo Valsorda: "I'm watching some folks reverse engineer the xz backdoor, sharing some preliminary analysis with permission. The hooked RSA_public_decrypt verifies a signature on the server's host key by a fixed Ed448 key, and then passes a payload to system(). It's RCE, not auth bypass, and gated/unreplayable." — Bluesky

この一連のツイートは、xzバックドアの詳細な解析を共有している。主な内容は次のとおり:

  • バックドアはRSA_public_decryptフック関数を使い、サーバーのホストキーに対する署名を固定のEd448キーで検証する。検証が通れば、ペイロードをsystem()に渡してリモートコード実行が可能になる。
  • これはパスワード認証回避ではなく、リモートコード実行の脆弱性である。またゲート付きで再利用不可能。
  • ペイロードはRSA_public_decryptに渡されたN値(公開鍵)から抽出され、単純なフィンガープリントでチェックされ、固定のChaCha20キーで復号化された後、Ed448署名検証が行われる。
  • OpenSSHの証明書を使えば、RSA_public_decryptの公開鍵を攻撃者が認証前に制御できる。
  • バックドアはペイロードが不正な形式の場合や攻撃者の鍵の署名が検証されない場合は通常の動作に戻る。そのため、ネットワーク経由で信頼できる自動スキャンツールを作ることができない。
  • "gated"とは攻撃者の秘密鍵が必要なこと、"unreplayable"とは攻撃が特定のホストに紐づけられていて再利用できないことを意味する。

要約すると、高度に巧妙な供給網攻撃であり、ライブラリのメンテナが悪意を持っていたため偶然見つかったが、そうでなければ長期間気づかれなかった可能性が高いバックドアである。

解析2

xz/liblzma: Bash-stage Obfuscation Explained - gynvael.coldwind//vx.log

  • Stage 0: ビルドプロセス中に、悪意のあるテストファイル(bad-3-corrupt_lzma2.xzとgood-large_compressed.lzma)から暗号化されたStage 1スクリプトを抽出する。
  • Stage 1: 抽出したStage 1スクリプトを実行し、good-large_compressed.lzmaファイルから暗号化されたStage 2スクリプトを復号して実行する。
  • Stage 2:
    • 追加の悪意のあるペイロードを実行できる"拡張機構"が組み込まれている
    • RC4ライクな暗号化アルゴリズムを使って、バイナリバックドア(liblzma_la-crc64-fast.o)を抽出し、コンパイル/リンクプロセスに組み込む

攻撃者は、多段階の暗号化、ファイル切り出し、置換暗号、AWKスクリプトを使ったRC4ライクな実装など、標準コマンドラインツールだけを使って巧妙に隠蔽していた。 この発見は偶然の産物だったため、まだ見つかっていない危険なバックドアが他にも存在する可能性がある。

解析3

research!rsc: The xz attack shell script

解析4

XZ Utils review notes

影響1

liblzma and xz version 5.6.0 and 5.6.1 are vulnerable to arbitrary code execution compromise - Xe Iaso

  • liblzmaとxzのバージョン5.6.0と5.6.1には任意のコード実行の脆弱性がある。
  • この脆弱性は、一部の配布版でliblzma、libsystemd、sshdの相互作用に対するパッチと組み合わさることで発生する。
  • 攻撃者はsshd サーバに悪意のあるペイロードを送ることでシステムを乗っ取ることができる。
  • AMD64 Linuxシステムのみが影響を受ける。
  • 一部の最新の配布版(Debian sid、Fedora 40など)ではこのバージョンが含まれている可能性がある。
  • 影響を受ける可能性のある配布版がリストアップされている。
  • 影響を受ける可能性がある場合は、xzのバージョン5.4.6に降格するか、公開SSH サーバを無効にする必要がある。
  • バージョン5.4.6は脆弱性がないと考えられている。

影響2

oss-security - From xz to ibus: more questionable tarballs

ibus 1.5.29-rc2 のソースtarballリリースと、対応するGitコミットの間に潜在的な問題があることの指摘。

  • simple.xml.inファイルのバージョン文字列が、tarballとGitリポジトリで異なっている。tarballは"1.5.29-rc2.20231109"、Gitリポジトリは"1.5.29-beta3.20230822"となっている。
  • ドイツ語翻訳ファイル(po/de.po)のPOT-Creation-Dateフィールドが、tarball(2023-11-09 15:10+0900)とGitリポジトリ(2023-08-02 00:14+0900)で異なる。
  • ibusunicodegen.hファイルに違いがあり、tarballの方が古い著作権表記年になっている。また、特定のコミットからの不完全なチェリーピックの形跡がある。
  • autotoolsやValaトランスパイリングに関連する差分を除いても、tarballとGitリポジトリの間に説明できない変更がある。

議論1

Techies vs spies: the xz backdoor debate - lcamtuf’s thing

  • 不明な主体がOpenSSHで使用されているlibxzライブラリにバックドアを仕掛けた
  • 攻撃者は"Jia Tan"の偽名を使い、長年に渡ってlibxzの開発者に成りすまし、バックドア機能を潜り込ませた
  • この攻撃は国家機関による注文労働の可能性が高い
  • 小規模なOSSプロジェクトは開発者の関心が薄れやすく、引き継ぎミスが起こりがち
  • 技術的な対策だけでなく、政府機関や大手IT企業による徹底した監視が必要
  • バックドアの発見が、意図的な開示タイミングだった可能性もある

議論2

reflections on distrusting xz

  • "Jia Tan"のsshバックドア挿入は最終目標ではなく、多層的な計画の一部だった可能性がある。
  • xzにバッファーオーバーフローなどの脆弱性が潜んでいる可能性があり、これを悪用して他のパッケージにも攻撃を仕掛けられるかもしれない。
  • "Jia Tan"は2月にxzの新しいデコーダを書き直したが、この際に悪意のあるコードを挿入した可能性がある。
  • Landlockサンドボックスを無効化したことは、xzに任意のコードを実行させる予定があった証拠かもしれない。
  • この攻撃は綿密に計画されたものと思われ、"Jia Tan"の関与したすべてのコミットを不審に扱う必要がある。
  • xzの以前のバージョンに戻すことが提案されており、筆者は"Jia Tan"の関与しなかったコミットのみでフォークを作成した。

攻撃の過程とOSS文化

A Microcosm of the interactions in Open Source projects

このドキュメントは、オープンソースプロジェクトにおける開発者とユーザー間の相互作用を描いた興味深い事例を提示しています。主な内容は以下の通りです。

  • xz/liblzmaライブラリに重大な脆弱性が見つかった際の、開発者とユーザーのメーリングリストでのやり取りが紹介されています。
  • 当初は控えめな質問からスタートしましたが、徐々にメンテナに対する非難や要求が強くなっていきます。
  • メンテナは精神的な問題に加え、時間的制約などからプロジェクトの手伝いを求めています。しかし、回答にはそれを支援する姿勢はありません。
  • 代わりに、attackerと呼ばれる"Jia Tan"という人物がメンテナを支援し、徐々にプロジェクトを引き継いでいったことが示唆されています。
  • 著者は、このようなオープンソースプロジェクトにおける一人のメンテナに対する過剰な要求と、支援不足の問題を指摘しています。
  • オープンソースのエコシステムを改善するために、この種の消費者とメンテナの関係を変える必要があると主張しています。

要約すると、この事例はオープンソース開発の現状と課題を象徴的に示しており、開発者支援の重要性を説いています。

攻撃者の行動・時系列

攻撃者についての推測

XZ Backdoor: Times, damned times, and scams

  • xzの長年のメンテナである"Jia Tan"がこのバックドアを仕込んだ疑いがある
  • "Jia Tan"という名前は偽名の可能性が高い
  • 彼のGitコミットのタイムスタンプから、彼の実際の所在地を推測している
  • 彼のコミットの多くはUTC+8 (中国時間)になっているが、一部はUTC+2、UTC+3(東欧時間)になっている
  • 東欧時間のコミットが連続して起きていることから、彼が実際は東欧に住んでいる可能性が高い
  • 彼の作業時間や休日から、東欧の職場勤めのプログラマーである可能性が高いと推測している

要約すると、Git のコミット履歴からタイムゾーンの不整合を発見し、開発者の実在名と所在地を推理しようとする分析である。開発者の実際の身元を特定する試みが面白い内容となっている。

まとめ1

An Accidental Discovery of a Backdoor Likely Prevented Thousands of Infections - Security Boulevard

  • xzライブラリのソースコードにバックドアが仕込まれており、このライブラリがsshdなど多くのパッケージにリンクされていたため、大規模な感染被害が起こりかねない脆弱性があった。
  • この問題は偶然の副産物として発見され、ほとんどのディストリビューションで広まる前に発覚したため、大惨事を免れることができた。
  • バックドアの準備作業は数年前から行われており、ある"Jia Tan"と呼ばれる人物(あるいはグループ)が planyleの偽アカウントを使って徐々にコードを改変してきたと考えられている。
  • ディストリビューションによってはsshdにリンクされている外部ライブラリが50近くにも及び、多くの脆弱性にさらされていた。
  • サプライチェーンの脆弱性対策として、実行時の使用状況を解析してパッチ適用優先順位を決める手法が有効であると指摘されている。

まとめ2

これは報道だが…

What we know about the xz Utils backdoor that almost infected the world | Ars Technica

広い視点の問題提起

The XZ Utils backdoor is a symptom of a larger problem | Ariadne's Space

  • 実際には「ソフトウェアサプライチェーン」は存在しない。企業がオープンソースソフトウェアを使う際の責任を回避するための概念にすぎない。ただし、コモンズの整合性を保護する提案は有用である。
  • 「ジャンク引き出しライブラリ」がバックドアの標的になりやすい。多くの無関係な機能やライブラリが含まれるため、これらをパッケージに分割することで脅威を軽減できる。
  • ソフトウェアメンテナの精神的健康が重要である。メンテナをいじめるスレッドには加わらず、プライベートで懸念を伝えるべきである。そうしないと脅威のあるアクターがメンテナになる可能性がある。

法律と匿名性

  • 匿名での貢献が増えており、実在する人物と貢献者を結びつけることが難しくなっている。
  • 著作権法やライセンス契約などの法的責任を追跡するには、貢献者の実在する人物を特定できる必要がある。
  • 匿名での貢献は、貢献者が所属組織の制限を回避できるメリットがある一方で、プロジェクトメンテナにリスクや責任が集中する。
  • メンテナは法的責任を負いつつ、匿名の貢献者とのやり取りが増えており、ストレスを感じている。
  • 過去には実名が求められる傾向があり、信頼関係の構築がしやすかった。
  • プライバシーを守りつつ、貢献者の実在を示す中間的な解決策が必要ではないか。

LWN.netの解説

How the XZ backdoor works [LWN.net]

メンテナの反応(Lasse Collin)

まとめ(国内)

報道(国内)

実践

ふりかえり・提言

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment