1 ポイント 投稿者 GN⁺ 2024-03-31 | 1件のコメント | WhatsAppで共有
  • xzバックドアのリバースエンジニアリング予備分析によると、この挙動は単なる認証バイパスではなく、リモートコード実行(RCE)に近い
  • フックされた RSA_public_decrypt が、サーバーのホストキーの署名を固定の Ed448 キーで検証する流れが中核
  • 署名検証を通過すると、ペイロードsystem() に渡され、実行される可能性がある
  • 分析は許可を得て共有された予備結果であり、Bluesky投稿には引用投稿または埋め込みコンテンツが含まれる
  • バックドアはゲート付きで再生不可能な形式と要約され、同じ入力を単純に再利用する攻撃とは異なるものとして見る必要がある

xzバックドアの実行フロー

  • 許可を得て共有されたリバースエンジニアリングの予備分析は、フックされた RSA_public_decrypt に焦点を当てている
    • サーバーのホストキーに対する署名を固定の Ed448 キーで検証する
    • 検証後、ペイロードsystem() に渡す

分類と制約

  • この挙動は認証バイパスではなく、**リモートコード実行(RCE)**に分類される
  • バックドアはgated/unreplayableな特性を持つものと要約されている
  • 元のBluesky投稿には、引用投稿または他の埋め込みコンテンツが含まれる

1件のコメント

 
GN⁺ 2024-03-31
Hacker News の意見
  • この件についての追加リバースエンジニアリング結果がある。バックドアが文字列を隠すために使っていた prefix trie から抽出したシンボル再マッピング情報が含まれており、リバースエンジニアリング/分析そのものからも隠れようとしていたように見える
    https://gist.github.com/smx-smx/a6112d54777845d389bd7126d6e9...
    デコードされた文字列の完全な一覧はここにある
    https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01
    OpenSSL の内部に詳しくない立場から見ると、N 値は rsa_stn フィールドから取得しているようだ
    https://github.com/openssl/openssl/blob/56e63f570bd5a479439b...
    この値は BIGNUM で、可変長型に見える
    https://github.com/openssl/openssl/blob/56e63f570bd5a479439b...
    バックドアはリモート攻撃者から受け取った証明書からこの値を取り出してChaCha20で復号を試み、成功すると system() に渡す。system() は、現在のプロセスが実行されているユーザー権限でシェルスクリプト 1 行を実行する単純なラッパーに近い
    もし正しく理解できているなら、これは公開鍵バイパスよりさらに悪い。公開鍵バイパスなら理論上はログインしようとしているユーザーの権限しか得られず、強化された SSH 設定では root ログインが禁止されている可能性が高い
    しかしこれは sshd プロセス自体のコンテキストでのリモートコード実行なので、root で動作している sshd ならペイロードも root として実行されうる。広範にばらまかれたリモートコード実行としては、現実的にほぼ最悪に近い

    • 適切なサンドボックス化、SELinux、緩和策があれば、攻撃者が root 権限で何かを行うのを防げるかもしれない。ただし SSH デーモンにサンドボックスを効果的に適用するのは非常に難しい
    • とてつもない。10億台のコンピューターの権限で何をするかをどう決めるのか、見当もつかない
  • このバックドアが性能問題のせいで見つかったのでなければ、後になって発見される可能性はどれほどあったのだろうか。性能問題はコード上のミス/修正可能な欠陥だったと理解しているが、それを捉えられるツールがあったのかも重要だ
    こうした問いは、この種のバックドアが初めてなのか、それとも初めて表面化しただけなのかを理解することにも関わってくる

    • 悪意ある IT アクターが非常に多い環境で 1 年ほど働いた立場からすると、発見される可能性は常にかなり高いと思う。秘密を守ることには想像しがたいほどのエネルギーが必要で、真実の一貫性を保つのも同様だ
      小さなミス一つで全てが崩れることがあり、ときには一文だけで連鎖反応が始まり、緻密に組まれた計画が露見する
      犯罪捜査は毎日そうやって進む。警察業務にはリソース制約があるが、ソフトウェアは趣味で分析する人、趣味のように分析し続ける専門家、職業として分析する専門家たちに毎日見られている
      結局のところ、いつかは発見されていた可能性が高い
      XZ 攻撃は非常によく実行されており、ほとんど傑作に近い。国家機関が関与していても驚かない。しかし同時に、とてつもなく運が良かった。今問題として挙がっているもののどれか一つでも見つかっていたら、私だけでなく多くの同僚が長期の追跡に入っていただろう
      導ける結論の一つは、xz/liblzma がオープンソースでなかったら、こうした問題を見つけるのは不可能だっただろうという点だ。もちろんオープンソースだったからこそそもそも可能になった面もあるが、これが Windows や MacOS の中にあったと想像してみればよい
    • エクスプロイトが使われていなければ、発見確率はかなり低かっただろう。隠し場所の選び方が巧妙だった。実質的にコードベースの外にあり、監査者が見ない場所だった
      ただし使わなければ目的を達成できない。使えば使うほど、後から検出される可能性も高まる。SolarWinds と比較できる
    • 今後数か月のあいだ、多くの人がこの方向でかなり深く考えることになりそうだ。コードレビューなのか、何らかの振る舞い分析なのかが問題になる
      個人的には system() 呼び出しはやや雑で、バイナリ機能スキャナーがその経路を潜在的に見つけられたかもしれないと思う
    • これは見つけるのが難しかったはずだ。sshd パッチは許容される段階であるリンク時に発生し、この分析が正しいならマスターキーバックドアでもないので、通常のログイン監査の痕跡は残らない。そして sshd が別プロセスを起動すること自体は当然許容されうる
      非常に厳密な SELinux ポリシーであれば、sshd がシェル以外の何かを実行することを検出できたかもしれないが、そのレベルの強化は非常にまれだろう
      対象の外側から発見するという問題もすでに試されたと言える。複数の人が valgrind などでペイロードを調べたが、見つけられなかった。デバッグ環境で見つからないようにする防御もかなり巧妙だ。ペイロードの下にある露出したインフラが ASan のようなツールと互換性がないからだ
      たとえリンクされていても、コードは main() よりはるか前に実行されるため、デバッガで liblzma 周辺を探っても通常は実行場面を観測できない
      strace ならプロセス生成後のすべてのシステムコールとリンカーの動作を見られる。しかし、ここまでの理解では、ペイロードはその段階で有効化可否を決めるためにシステムコールを使ってはおらず、argvenviron などを見ているようだ
    • 興味深い派生点として、Ken Thompson 攻撃も PWB でのメモリ性能バグによって発見されたことを思い出す
      [0] https://en.wikipedia.org/wiki/PWB/UNIX
      [1] https://news.ycombinator.com/item?id=38020792
  • バイナリペイロードの中にエンコードされた文字列があるように見える
    https://gist.github.com/q3k/af3d93b6a1f399de28fe194add452d01...
    この文字列はキルスイッチとして動作する
    https://piaille.fr/@zeno/112185928685603910
    本当にそうなら、緩和策の一つは次のようになるかもしれない

    echo "yolAbejyiejuvnup=Evjtgvsh5okmkAvj" | sudo tee -a /etc/environment  
    
    • 必ず -a を含める必要がある。そうしないと環境ファイルを消してしまうおそれがある。そして通常は、悪意のあるコードが含まれていないバージョンへアップグレードして再起動するのが正しい
    • あまりにも奇妙だ。自分たちでシステムを保護する方法を残しておきたかった国家アクターの匂いが強い
  • バックドアが正確に何をするのか、簡単に説明できる? まだ分かっている段階なのか? バックドア自体がペイロードではないように思えるが、悪意ある圧縮ファイルが必要なのか、それとも sshd プロセスにフックしてリモート攻撃者の悪意あるパケットを待ち受けるのかが気になる
    元の文は、攻撃者が SSH セッションの認証前段階で悪意あるペイロードを送れるようにも読めるが、なぜエクスプロイトが永遠に出てこないかもしれないと言われているのかも分からない。コードをリバースエンジニアリングできるなら、概念実証も書けるのでは?
    結局のところ、攻撃者はこのバックドアのあるマシンをどうやって制御するのか?

    • 正確にノックすると開くドアを思い浮かべればいい。秘密のノックを知らない人には、ただの壁に見え、壁として振る舞う。秘密のノックがなければ、そもそも開くことを証明する方法すらないかもしれない
      ここでの状況も似ている。xz は怪しい動作をする前に、あるデータを復号しようとする。非対称方式なので、秘密の暗号鍵を提示しなくても復号の検証はできる。対応する公開鍵を持っているからだ
      秘密鍵を見つけるのは現実的には不可能で、ペイロードの復号に失敗しても目に見えて異なる動作をしないため、エクスプロイトコードは永久に公開されないかもしれない。エクスプロイトコードを作る方法は秘密鍵が何らかの形で見つかることだけで、現実的にはバックドア開発者が漏らす場合しかない
    • 読んだ内容に基づけば、攻撃ベクトルはこうだと思う。sshd が起動し、libsystemd をロードし、それがハッキングコードの入った XZ ライブラリをロードする
      XZ ライブラリは RSA 署名を検証する OpenSSL 関数の独自版を注入する
      誰かが SSH にログインし、認証用の署名付き SSH 証明書を提示すると、その改変された関数が呼び出される
      証明書には通常のログイン処理でユーザー名やロールのようなアサーション情報が入ることがあり、その情報で特定ユーザーのログインに有効な証明書かどうかを判断する。だが改変された関数が特定の攻撃者鍵で署名された証明書を検知すると、証明書の下位フィールドの一部を取り出してシステムコマンドとして実行する。実行コンテキストは sshd、つまり root ユーザーだ
      残念ながら攻撃者の署名鍵は分かっておらず、ハッキングコードが検証に使う公開鍵しか分かっていない。要するに、攻撃者は感染したシステム上でroot として任意のコマンド実行ができ、痕跡はせいぜいログイン失敗の試行程度だろう。インターネットに公開されたシステムなら、そうした試行はもともと大量にある
    • まだ正確に何をするのかは分かっていないようだ。ただし「リプレイ不可能」という部分はこう理解している。ペイロードが不正だったり、攻撃者鍵の署名が検証されなかったりすると、バックドアは通常動作に戻るということだ
      攻撃者の鍵署名が必要だという点が核心だ。その鍵が漏洩するか、RSA アルゴリズムが破られない限り、他の研究者や第三者がこのバックドアを悪用することはできない。RSA が破られるなら、それよりはるかに大きな問題が起きる
    • 公開鍵暗号が正しく使われていて、悪用可能なバグがないなら、リバースエンジニアリングをしても概念実証は作れない
    • 配布されたエクスプロイトはソースではなくバイナリで、テストデータの中に巧妙に隠されていた。さらに、未公開の秘密鍵でペイロードを検証する
      現時点では攻撃者だけがエクスプロイトを実行できるため、スキャンも不可能だ。性能低下のような二次的影響を除けば検出は難しく、実際そのように発見された
  • これほど多くの Linux サーバーで毎日使われる重要なパッケージが、資金不足のせいで元の作者に維持できなくなるというのは理解しがたい。オープンソースでは何かを変える必要がある
    一つの解決策は、一定規模以上の企業や事業者にメンテナンス費用の支払いを義務づけるライセンスかもしれない

    • そういうライセンスには人々が強く反発する。「もう自由ではない」という大きな反発が始まり、その主体はキャンセルされる
    • 本当に資金不足なのか、それともバーンアウトなのかが気になる
    • 提案されている EU の Cyber Resilience Act が解決策を自称している。簡単に言えば、ファイアウォールであれトースターであれ、製品寿命のあいだの脆弱性についてベンダーが責任を負う
      そのためベンダーには、オープンソースを安全に保つインセンティブが生まれる。メンテナーに資金を出したり、コード監査を依頼したり、正社員を雇って貢献させたりする形だ
    • 重要であることと必要であることは別だ。このパッケージは重要というより必要なパッケージだ
    • xz のように複雑なものがなぜ必要なのか理解しがたい。bzip2 のコードは小さく、1人のごく一部の時間だけでも保守できるはずだ
  • 現在 xz リポジトリに行くと、GitHub 利用規約違反で無効化されている。無効化自体は当然だが、GitHub にはコードと履歴は残し、バナーを表示しつつ悪用可能な機能だけ止めてほしい
    そうすれば研究者や他の人たちがエクスプロイトを学べる。もっと些細な状況でライブラリがマルウェアをホストしていてリポジトリが落とされると、単なる些事として見過ごされかねない

    • 自動化ツールにダウンロードさせたくはないのだろう
    • そのリポジトリの GitHub イベントは、CSV でここから見られる: https://github.com/emirkmo/xz-backdoor-github
      ソースコードに関心があるなら見つけるのは難しくない。このコードと Git リポジトリは世界中の複数の Git リポジトリにつながっており、リリースにも何度もソースが同梱されている
    • xz には独自の Git ミラーがあり、すべてのコミットを見ることができる
  • あまり知られていないオープンソースゲームの事実上のメンテナーとして、開発者が出入りするのを見てきた。価値のある貢献は基本的にすべてマージしている
    協力者の中には、さまざまなコーディングスタイルでCとC++が入り混じった状態のまま、かなり深く機能を掘り下げる人たちもいる。実装の細部を常にすべて把握できているわけではないが、心のどこかでは、誰かが本当にひどいバックドアを仕込んだらプロジェクトが終わるかもしれないと思っている
    幸い、そのゲームはかなり obscure で、攻撃対象領域も非常に小さい。それでも、善意でWindowsバイナリに署名してみようかという誘惑は止まるようになった
    この xzバックドア は本当に巨大な悪夢で、元の開発者たちや、これに巻き込まれたすべての人たちに同情する

    • もちろんその通りだが、ソフトウェアだけの問題ではない。そもそも、意味のある観点でこれを「問題」と呼べるのかさえ確信がない
      森の小道を歩いているとき、通りかかった車がそのままはねていくかもしれない。運転手は捕まらない可能性が高く、防ぐ方法もなく、警察もそばにいない。ソフトウェアのバックドアよりはるかに恐ろしいこのシナリオは、実際には、何かをしながら生きていくために受け入れなければならない最小限のリスクだ。実際にそういうことは起こる
      しかし結局のところ、大多数の人は他人を積極的に傷つけようとはしない。人間のあらゆる営みは常にその前提の上に成り立ってきたし、今もそうだ
      コードレビューをもう少し厳格にし、リンターやCIやパターンマッチングをもっと使い、コード署名をさらに普及させ、人々の身元を検証すればこうしたことを防げる、という幻想こそがむしろ本当の問題だ。世界はあらゆる細部のレベルで管理・統制できるし、そうあるべきだという シリコンバレー流の妄想 の症状でもある。そんな「治療法」は、防ごうとしているどんな病よりもはるかに悪くなりうる
    • ZeroMQの故 Pieter Hintjens は Optimistic Merging という慣行を擁護していた。コードレビューやCIの結果を待たず、貢献を即座にマージするやり方だ。緩いマージ基準を採るアプローチが完全に的外れというわけではない
      [1]: http://hintjens.com/blog:106
      貢献者が楽しくプロジェクトに参加できるコミュニティを作る利点は理解できる。しかし、プロジェクトを明確なビジョンや方向性のないまま拡大させ、結局は他人の貢献を共通の基準に合わせるために、メンテナーへ過大な負担を強いるやり方のように感じられた
      実際のコードレビューは将来の不確かな時点へ先送りされ、そのときレビューが徹底されるかどうかも、誰が責任を持って行うのか、問題を修正するのかも不明だ。結局、ユーザーに何が配布されるのかを制御できない混沌への処方箋のように聞こえる
      悪意あるコードの配布という問題もある。当該ブログ記事のコメントでもこの問題が取り上げられており、Pieter は xz の事例とまったく同じシナリオを説明している
      「Mallory が忍耐強く、欺瞞的で、十分長いあいだ有効な貢献者のように振る舞ってプロジェクトの制御権を手に入れ、その後ゆっくりとバックドアを仕込むとしよう。そうなると、慎重なコードレビューも役に立たない。Mallory はメンテナーになれるだけの十分な信頼を得ればよく、それは可能かどうかではなく、やり方の問題だ」
      彼は「最善の防御はコミュニティの規模と多様性だ」と結論づけている
      しかし、慎重なコードレビューは実際にこうしたことが起こる可能性を下げられると思う。信頼された貢献者であれ外部の貢献者であれ、すべての貢献を徹底的にレビューすれば、不審な挙動や、「Aをする」と言いながら実際にはBをするコミットをより早く発見できる可能性が高まる
      Optimistic Merging がより大規模で多様なコミュニティにつながるのかも議論の余地がある。厳格な貢献ガイドラインを持ちながら活発なコミュニティを維持しているプロジェクトは多い。そして、悪意あるパッチをいつどうやって見つけるのかという問いにも答えていない
      xz の問題は小さなコミュニティだったことではなく、コミュニティがなかった ことだ。単一の悪意ある行為者がプロジェクトの制御権を握り、他の誰からの監督もほとんどなかった。貢献ガイドラインはコミュニティ規模の要因ではなく、Optimistic Merging を使っていたかどうかに関係なく、こうしたことは起きていただろう
      [2]: http://hintjens.com/blog:106/comments/show#post-2409627
    • 企業がネットワーク境界のセキュリティに莫大な努力を注いでいる一方で、開発組織では日常的に brew install cask や vi/emacs/vscode の拡張機能をインストールしているのを見ると、いつも驚かされる
      Rust は、デフォルトが最も安全なプログラミング言語/コミュニティだと言ってよく、ポインタまわりの危険な細工をほとんどできないレベルのセキュリティ優先設計を持っている。それなのに、最も一般的で推奨されるインストール経路はこうで、私自身も完全な偽善者としてしばしばこうしている
      https://www.rust-lang.org/tools/install
      これは一例にすぎない。「これを curl して sh にパイプしろ」という形で自らリモートコード実行への道を開いておきながら、同時に誰かの unsafe ブロックについて議論する習慣が、あまりにも多くの人にとって筋肉記憶になってしまっている
    • 正直なところ、私たちの善意が悪用されることに気づくのは時間の問題だった。「壊すのは早く、直すのも早く」や「私のプロジェクトの所有権を引き継いでくれる人はいる?」のような行動は問題を呼び込みかねないが、オープンソースがコーディングへの無償の愛情労働である以上、それなしで成り立つ姿も想像しにくい
      こうしたことが起きたのは残念だが、驚きではない。こうした悪意ある行為者に対抗するための、より良いツールが、それもオープンソースとして、出てきてほしい
  • このバックドアが投げかける疑問はいくつもある。同じチーム、あるいは似たようなチームが仕込んだ別のバックドアは他に何があるのか。こうしたチームはどれほど活発に活動しているのか。こうした侵入攻撃に脆弱な依存関係はどれほどあるのか。業界におけるこの種の秘密工作の標的となりうる攻撃面はどれほど広いのか。
    apache httpd, postgres, mysql, nginx, openssh, dropbear ssh, haproxy, varnish, caddy, squid, postfix のような主要ネットワークサービスと、そのすべての依存関係、さらにそれら依存関係の全コミッターグラフを作ることが、どこが最も価値が高く、監視が手薄かを把握する第一歩になるかもしれない。
    これが誰かがこうしたことを試みた最初の事例であるはずはない。失敗して露見した最初の事例にすぎない。Linuxカーネルに対して試みられ、発見されたバックドアは知っているが、これはリモート攻撃であり、まったく性質が異なる。

    • なぜ、皆がやるようにゼロデイを使わず、バックドアを作ることにしたのだろうか。
      なぜ、検知されてもバグに見えるような無害そうなものを配布するのではなく、完全機能のバックドアを実装し、配布方法まで隠そうとしたのだろうか。
      これは意識的な判断だったはずだ。その理由は、目標が何だったのかについての手がかりを与えるかもしれない。
    • Debianが、rootで動作しインターネットから接続を受けるサービスに不要なライブラリをロードさせるようパッチしていた理由も問うべきだ。
  • これは、リモートからエクスプロイトをスキャンするには、こちらが持っていない攻撃者の秘密鍵が必要だという意味のようだ。残る選択肢は、ローカルで検知スクリプトを走らせることだけだ。

    • 一部のスキャナーが取りうる完全にひどい方法は、RSA認証を提示したら「潜在的に脆弱」とマークすることだ。ほとんどのSSHサーバーはRSA認証を提供しており、実際SecSH RFCでもそれを実装必須としている。そうなると、人々がパスワード認証に戻るよう促してしまうかもしれない。
      この問題が実システムで広範に広がっていると判明しない限り、そうしたやり方は、以前に似たような「専門家」たちが毎年パスワード変更を要求し、実際のセキュリティは下げたまま、書類上のセキュリティだけを良く見せていた件よりも悪く見える。
    • クライアント公開鍵が特定のフィンガープリントと一致したときにだけ署名検証コードが実行されるようなので、タイミング情報で検知できるかもしれない。
      バックドアの署名検証には約100µsかかるはずなので、フィンガープリントが一致する鍵は、そうでない鍵よりその分だけ処理時間が長くなるはずだ。この時間差は少なくともLAN上では現実的に検知可能であり、スキャナーが対象の近くで動作するなら、インターネット越しでも可能かもしれない。
      認証失敗を繰り返した後にクライアントIPをブロックするシステムでは、スキャンはさらに難しくなるだろう。
      (https://bench.cr.yp.to/results-sign.html では Ed448 検証は約40万サイクルとなっており、4GHzでは100µsに相当する。)
    • ツイートでは「リプレイ不可」とされている。なぜリプレイできないのか気になる。バックドア入りの sshd が何らかのチャレンジを出し、攻撃者がそれに署名しなければならない構造なのだろうか。
  • 人気のない意見かもしれないが、作戦全体には感嘆せずにいられない。もちろん非難すべきだが、それでも感嘆してしまう。構想から実行まで、本当に芸術作品のようで、これほど早く見つかったのはとてつもない幸運だった。

    • ペイロードがSSHログイン中にランダムな0.5秒停止を引き起こさなければ、おそらく長い間発見されなかっただろう。
      次は、攻撃者が人間の待ち時間が発生する作業で異常な遅延スパイクを生まないペイロードを作る可能性が高い。
      なぜか、Kim Dotcom が違法盗聴の対象になっていると知った出来事を思い出す。MW3で突然 ping が大きく跳ね上がったからだ。調べてみると、自分のパケットだけが物理的に非常に遠い場所にある GCSB のオフィスを経由してルーティングされていた。GCSB にはニュージーランド永住者を盗聴する権限がない。最終的に彼はニュージーランド首相から個人的な謝罪を受けた。
    • 「いずれにせよ、マージされるべきでなかったあの人物は大したことをやった。ひどいことだが、大した仕事だった。」
      最も巧妙だった部分は、侵入するプロジェクト選定だったと思う。あとから “Hans” の IFUNC プルリクエストの議論を読むと胸が痛むが、なぜこのプロジェクトが選ばれたのかを本当によく示している。
      “Jia” と “Hans” の背後に何人いたのか、そしてコミュニケーションやコード貢献をどう分析し、どう戦略化していたのかを知りたい。メーリングリストで圧力をかける役を演じた第三の人格のような一部の側面は、やや雑に作られていたようにも見える。
      だから、洗練された少人数チーム、あるいは単独の個人がやった可能性もまだある。国家主体であれば、この種の作戦のために偽の人格を一日中作って維持する人たちがいるだろうと思う。
      誰かが「この3ユーザー、少し無礼なくらい強く押してくるのが変だな。誰なんだ? アカウントも同時期に作られている。怪しい。なぜわざわざ偽アカウントでこれをここまで強く推す必要があるんだ? 調べるべきだ」と考えていたらまずかったはずだ。全体の投入労力に比べると、その部分は不注意だったか、計画が悪かったか、予算不足だったことになる。
    • 同意するが、ソーシャルエンジニアリングの部分は特に残酷に感じる。
    • それほど unpopular な意見ではない気がする。多くの面で非常に印象的な攻撃だ。巧妙で、何年もかけて構築されており、調査のきっかけになった奇妙な性能低下を攻撃者が起こさなければ、おそらく私たちは気づかなかっただろう。
      劇的な仮説を付け加えるなら、攻撃者が自分で炸裂させる情報核爆弾に怖気づいて、わざと失敗させた可能性すらある。
      最終結果には嫌悪を覚えつつも、攻撃の複雑さ自体は認めざるをえない。
    • 「感嘆」が正しい言葉かは分からないが、かなり印象的な作戦だったのは確かだ。