1 ポイント 投稿者 GN⁺ 2024-07-22 | 1件のコメント | WhatsAppで共有
  • 世界中のWindowsクラッシュは、CrowdStrike CSAgent.sys が誤ったメモリアドレスを参照するフローによって発生したと初期分析されている
  • 問題の命令は mov r9d, [r8] で、R8 にはポインタ配列からインデックスで取り出した マップされていないアドレス が入っていた
  • C-00000291-...xxx.sys ファイル群はカーネルドライバではなく、CSAgent.sys が読む難読化データに見え、CrowdStrike はこれを Channel Files 構成ファイルだと確認した
  • CrowdStrike は C-00000291-ロジックエラー を引き起こし、OSクラッシュにつながったと明らかにし、Channel File 内の null byte が原因だという推定は否定した
  • 今回の配布はバージョン更新ではなく コンテンツ更新 として扱われ、一部クライアントの staging 制御を迂回した事例があり、crash report が原因分析の核心的な手がかりとなった

CSAgent.sysクラッシュの流れ

  • 初期分析は CrowdStrike の CSAgent.sys をリバースし、単一の crash dump をもとに進めた静的分析である
    • Windows システムや VM なしで資料を共有し、追加調査を依頼していた状態だった
    • CSAgent.sys は VirusTotal に上がっていたファイルを基準に分析された: VirusTotal サンプル
  • クラッシュ地点は mov r9d, [r8] 命令である
    • R8 はマップされていないアドレスだった
    • この値は RAX にあるポインタ配列から RDX インデックス (0x14 * 0x8) で取得したアドレスである
  • C-00000291-...32.sys のような他の .sys ファイルは、実際のドライバではなく 難読化データ のように見えた
    • CSAgent.sys がこれらのファイルを参照または読み込んでいる状況があった
    • ファイルを削除するとクラッシュが解消する状況のため、ファイル内容が CSAgent.sys クラッシュに影響した可能性が提起された
    • デバッグすればより簡単に確認できるとも付け加えられていた
  • 共有された .zip には複数の CSAgent.sys バージョン、IDB、複数の C-....sys ファイルが含まれていた
    • 最新ファイルの一つには “fix” が含まれているようだという説明があった
    • 共有リンク: Google Drive zip

Channel FilesとCrowdStrikeの確認内容

  • Kevin Beaumont は、問題を引き起こした .sys ファイルは channel update files であり、不正な形式が上位の CS ドライバをクラッシュさせたと記した
  • CrowdStrike の技術説明は、初期分析と同じ方向性を確認している
    • C-...sys ファイルはカーネルドライバではなく、Channel Files という構成ファイルである
    • C-00000291- がロジックエラーを誘発し、その結果 CSAgent.sys を通じて OS クラッシュが発生した
    • リンク: CrowdStrike 技術説明
  • 一部では空の 0x0 Channel File が原因だと推定したが、CrowdStrike は問題が Channel File 内の null byte と関連していないと否定した
    • Malware Utkonos は、ファイルが 0xaaaaaaaa で始まるべきだというチェックを指摘している: 関連投稿
  • Channel update は、一部クライアントの staging 制御 を迂回して配布されたことが確認された
    • 一部の IT 担当者は CrowdStrike ポリシーで最新バージョンを無視するよう設定していたが、今回の更新はバージョン更新ではなく コンテンツ更新 だったため迂回されたと確認している
    • 関連投稿: ResetEra スレッド
  • CrowdStrike の特許でも channel files という表現が複数回登場する
    • 例として US11822515B2 と US11645397B2 が挙げられている
    • 検索語は channel file assignee:(Crowdstrike, Inc.)

crash reportとmacOS System Extensionsの手がかり

  • crash report は CrowdStrike クラッシュを理解する手段であり、macOS の別の 0day を明らかにするのにも使われた
    • 関連する Black Hat 発表タイトルは “The Hidden Treasure of Crash Reports?” である
    • リンク: Black Hat 発表ページ
  • Apple が 3rd-party kext を廃止し、ユーザーモードの System Extensions へ移行した点は肯定的に評価されている
    • ただし、この移行過程で kernel panic、権限昇格、セキュリティツールのアンロード問題があったと記されている
  • macOS でユーザーモード System Extensions をサポートするカーネルコードにはバグが多く、ユーザーモードへ移行したセキュリティツールが Apple の中核 kext で広範な kernel panic を引き起こした事例があった
  • core macOS System Extension フレームワークの権限昇格問題として CVE-2019-8805 が言及されている
  • System Extensions の処理欠陥により、非特権コードやマルウェアがセキュリティツールのアンロードを引き起こせる可能性がある
    • 例として、最新の macOS でも信頼された System Extension として動作するファイアウォール LuLu を終了させられると記されている
    • このバグは LuLu のみに該当する問題ではない

1件のコメント

 
GN⁺ 2024-07-22
Hacker Newsの意見
  • 「BSODを引き起こすコンテンツ更新で、削除すれば解決する」という話を見た瞬間、壊れたバイナリデータと不適切に書かれたパーサーの組み合わせだろう、と100ポンド賭けてもいいと思った
    この10年ほどかなり真剣にコンピューティングに取り組んできて、サイバーセキュリティはまったくやっていないが、ほぼすべてのCVE・クラッシュ・バグ・性能低下・苦痛は、バイナリデータを機械が読めるデータ構造に戻すデシリアライズの過程から生まれると思っている
    人間のプログラマーがエッジケースを見落とし、命令型言語がそれを許してしまうからだ。展開アルゴリズム、フォントアウトラインリーダー、画像・動画・音声パーサー、ゲームデータパーサー、XML/HTMLパーサー、OpenSSLの証明書・署名・キーパーサー、今回のCrowdStrike EDRのコンテンツパーサーまで、全部含まれる
    2つ目の仮説まで考えるなら、さらに50ポンド上乗せしてもいい

    • 同時に少なくとも5つのことが間違っていたと思う。カーネルモジュールのお粗末なエラー処理がOS全体を落とし、破損ファイルを解析し続けてブートループを作り、ファイルを削除したり破損としてマークしたりもしなかった
      破損ファイルが内部テストを通過したか、内部テストがなかったかで、更新適用タイミングに関する個別設定も無視されたようだ。さらに世界中に同時配布して被害を限定できず、そもそもファイル破損がなぜ起きたのかもまだ分からない
    • 2023年の上位25件の共通脆弱性一覧はhttps://cwe.mitre.org/top25/archive/2023/2023_top25_list.htmlにある
      信頼できないデータのデシリアライズ(CWE-502)は15位で、1位は境界外書き込み(CWE-787)、4位は解放後使用(CWE-416)だった。2019年から毎回リストに入っている弱点はhttps://cwe.mitre.org/top25/archive/2023/2023_stubborn_weaknesses.htmlにまとめられている
    • 「ほぼ100%」というよりは98%くらいに見える。残りの2%はロジックバグ、設定ミス、悪いデフォルト値、そもそも安全でない設計選択で埋まる
      ちなみに情報セキュリティ分野で30年以上働いている
    • 命令型プログラミングのせいにするのは難しいと思う。たとえばRustは命令型だが、switchで抜けているケースをかなりよく検出してくれる
      逆に20年前に使っていたSchemeの派生は関数型だったが、すべてのケースを網羅したかは検査しなかったし、Haskellのghcも数年前はその検査がデフォルトで有効ではなかった。今は変わったかどうか分からない
    • どちらがより致命的なのか分からない。実質的にエラー・失敗処理がなかった点なのか、それとも「チャネル更新が顧客のステージング制御を迂回し、全員に配布された」点なのか
      何人かのIT担当者がCSのポリシーを最新バージョン無視に設定していたにもかかわらず、これは「バージョン更新」ではなく「コンテンツ更新」なので迂回されたと確認している。コンテンツ更新がクライアントを壊し得るなら、ステージング制御やポリシーを迂回できてはならない
  • CSのようなルートキットベースのエンドポイント監視ソフトウェアが本当に必要かは別として、この分野をより倫理的な標準へ移すには、オープンソースの代替が強力になり得る
    中核ツールがオープンソースなら、正確に何をしているかが透明で、バックドアや深刻なバグがないかを一般の人々が監査できる。一方で、セキュリティチームがマルウェアシグネチャを供給する方式は、依然としてビジネスモデルになり得る

    • そうではないと思う。Kolideがそうした試みの一つだが、実際の慣行や企業内での使われ方はプロプライエタリ製品と同じくらい陰湿だ
      ユーザーの立場からすると、オープンソースの監視ルートキットがよりよくテスト・開発されているとか、自分の利益を考慮していると安心することはできない。問題は監視ソフトウェアというカテゴリー全体だ。存在すべきではない。こういうものを使う会社はセキュリティを理解しておらず、従業員を信頼しておらず、働きやすい場所でもない
    • オープンソースの代替としてGRRがある: https://github.com/google/grr
      Googleのすべてのクライアント端末に入っている
    • レッドチームでEDR回避のためのマルウェアを開発する立場から言うと、EDRシステムは必須だと言える。「ルートキットベースのエンドポイント監視」という表現は、ゲームコミュニティの誤解からよく出てくる不正確な描写だ
      こうしたツールは高度な脅威に対して不可欠な保護を提供し、実際に検出する。Windows端末が含まれるテストなら、EDRがないと私の仕事は90%楽になる
      OpenEDRのようなオープンソースEDRもあるが、古く、テレメトリの品質が悪い: https://github.com/ComodoSecurity/openedr。GitHub上の各種概念実証コードを寄せ集めて運用向けEDRを作るのは非現実的で危険だ
      EDRセンサー自体が攻撃対象になる。攻撃者にとってはたいていEDRが唯一の障害なので、オープンソース化すると、悪意あるコード提供で開発を遅らせたり脆弱性を仕込んだりするリスクが大きくなる。セキュリティセンサー開発は、相手が誰なのか確信できない非常に敵対的な環境だ
      実際にはむしろ逆に近い。Elastic Securityの検出ルールのように、オープンソースのマルウェアヒューリスティックルールは存在する: https://github.com/elastic/detection-rules。Elasticもカーネルドライバーを含むEDRを提供しており、経験上、回避するのは比較的難しい。WindowsでドライバーなしのEDRを作れば、私の仕事はもっと楽になる
      EDRセンサーはすでにセキュリティ研究者や攻撃者に「監査」されている。弱点を見つけるためにリバースエンジニアリングとデバッグが継続的に行われている。EDRがカーネルモードのシェルコードをそのまま受け取って実行するレベルの問題を見つけたら、当然公開するだろう
    • CrowdStrikeが提供する価値は、シグネチャデータベースの維持と、世界中の攻撃キャンペーンを監視できる能力だ。これにはオープンソースプロジェクトが持ちにくい相当なリソースが必要になる
      単純なハッシュ照合プログラムよりはるかに複雑だ
    • セキュリティは本来、単に買ったり外注したりできる製品ではないのだが、現実はこうなってしまった
  • テスト配布でなぜ検出できなかったのか理解しにくい。外部に配布したときだけ問題が起きるようにした差分が何だったのか気になる。
    配布前にテストしなかったとは信じがたく、企業側もサードパーティ製コンポーネントを配布する前にテスト環境を持つべき。開発中にパッケージをインストールして失敗したり問題を起こしたりすることはよくあるが、本番環境にテストなしでそのまま入れるのがよいと考える人はいない。このケースがなぜ違うのか分からない。

    • 推測だが、コード変更用とデータファイル用で2つのパイプラインが別々にあった可能性が高い。
      パイプライン1では、ソフトウェアコード更新を重要な変更と見なし、非本番環境とカナリーテストを経て新しい「バージョン」をグローバルに配布していたのだろう。
      パイプライン2では、コンテンツ/チャネル更新を別扱いしていた可能性がある。この経路では新しいマルウェアシグネチャのようなものだけを配布するため、新しいファイルは標準形式のデータファイルであり、「実行」されず読み取られるだけだと仮定していたのだろう。
      このパイプライン自体は当初テストされ、十分に動作すると判断されていたはずだが、生成されたデータファイルの完全性を検証したり、より重要なことに、現在使われている最新バージョンのソフトウェアに配布したときにエラーなく動作するか確認したりするテスト段階がなかったのだろう。
      毎日チャネルファイルを読むエージェントソフトウェアは、パイプライン1で、考え得るあらゆるデータファイルサイズと模擬コンテンツについて「徹底的に」テストされていたはずだ。もちろん、不正なデータファイルはエラーとして拒否すべきだったが。
      今回の正確なシナリオは、2つ目の経路にある壊れたパイプラインが特殊な形の不正なデータファイルを作り、その特定のケースがソフトウェアバージョンの開発・テスト・配布パイプラインで想定もテストもされていなかった、という可能性がある。
      これが正しければ教訓は明らかだ。「データ」専用の配布であっても、パイプラインがどれほど標準化され安定していても、大規模配布前のテストは必須だ。コストと遅延は増えるが、受け入れなければならない。そもそも人々が「セキュリティ」ソフトウェアにお金を払うのと似た話だ。
      企業顧客も同様に、新しい配布物をIT環境の非本番領域でテストするか、本番フリート全体に許可する前にカナリー配布を設けるべきだ。
    • 現時点である限られた証拠だけを見ると、この配布が十分にテストされていた可能性は非常に低そうに見える。恣意的なSLAを満たすために定義更新を緩く運用していて、ついに破綻した、というほうがもっともらしい。
      ある会社がエンドポイントセキュリティとネットワーク異常検知に参入しようとしたとき、複数の見込み顧客がさまざまなCVE種別と深刻度について4時間SLAを要求していた。つまり、24時間365日のオンコールのセキュリティエンジニアと、4時間未満での定義作成・配布が必要であり、その4時間内に対象の100%へ配布可能でなければならないという意味だった。
      ゼロデイについて高品質な定義を4時間以内に作成して配布するのも難しく、テストパイプラインを通すのはさらに難しく、実際にカバーする新しいテストを書くなど言うまでもない。その分野ではそれが「普通」と見なされていたので、すぐに諦めた。CSもここで同じように仕事をしていたとしても驚かない。
    • 定義更新の自動テスト配布が、現在バージョンの定義コンシューマーを走らせず、影響を受けない古いバージョンだけを走らせていた可能性がある。
    • 失敗したリリースが単に「一般的なエンジニアリングの一部」として扱われる場所を見たことがある。誰も完璧ではない、という感じだ。
    • まったくテストしなかったとは信じがたい。ウイルスシグネチャをエンジンに対してテストしたものの、最終リリース成果物である**.sysファイル**は確認せず、パッケージング段階でバグが入り込んだ可能性が気になる。
      それでもひどい話だが、もし何のテストもなくリリースしたのなら、本当に衝撃的なレベルの怠慢だ。
  • 理解できないのは、はるかに技術的ではないが、より重要な部分だ。なぜ影響範囲がこれほど大きかったのか分からない。
    もっと重要度の低いサービスでも、自動モニタリングとロールバックを用意し、はるかにゆっくり配布したことがある。まず顧客トラフィックのないベータに配布し、問題がなければフリートのごく一部に配布したうえで、更新を受け取るホストの割合をゆっくり増やしていく。
    この方式なら問題は即座に止まっていたはずで、これが一般的な慣行だと思っていた。

    • これはソフトウェア更新ではなく、シグネチャデータベース更新だった。可能な限り早く配布されるべき種類のものだ。
      新しいウイルスを認識した時点では、すでに野生で広がっているので、一分一秒が重要になる。1日遅らせた結果、サーバーが20時間前に侵害されていたと知るような状況は望まない。
    • コード更新にはカナリーリリース手順があったとしても、設定更新は別チャネルだったようだ。
      潜在的に壊れる変更は望まなくても、最新のウイルス検知ルールは引き続き欲しい、という期待があったのだろう。見落とされたエッジケースは、テストされていない設定が既存コードを壊す状況だ。
      出典は純粋な推測なので、ニュース記事で引用しないこと。
    • 今回の事故の影響を考えると、先に配布するためのWindowsクライアントのステージング環境を大規模に用意しておくべきだった。
      この問題を避ける、あるいは少なくとも発生リスクを減らす方法はいくらでもあったが、いつものように利益が人より優先された。
    • 自組織で自社ソフトウェアを食べて試しているようには見えない。おそらく自社内でも、それほど有用なソフトウェアだとは思っていないのだろう。
    • スレッド内に答えがある。比較として、AVベンダーで働いていたときは、MSが報告した数字が正しいなら、はるかに大きな顧客基盤に1日4回ほど更新を押し込んでいた。
  • 今回の事態で Microsoft の役割がほとんど議論されていないのは驚きです。Microsoft は直接クラッシュを引き起こしたバグの責任者ではありませんが、Windows がこのような状況にしなやかに耐えられるようにするインセンティブ、つまり利益と競争が不足した環境を作ってきました
    Microsoft はワークステーション・コンピューティング領域で事実上の独占的地位にあり、今ではインフラに近い存在なので、製品のセキュリティ・信頼性・機能を保証する注意義務があります
    競争がないため、Microsoft は Windows の革新から手を引いており、その一部は今回の障害を防げたかもしれません。たとえば CrowdStrike は macOS と Linux ではユーザー空間で動作しますが、Windows は CrowdStrike がユーザー空間で動作するための機能を提供できないのでしょうか?
    アプリケーションのサンドボックス化の革新によって、CrowdStrike が要求するレベルの制御権の必要性を減らすこともできたのではないでしょうか?
    Microsoft は世界のコンピューティングインフラの鍵を、事実上競争なしに握っており、監督もほとんど受けていません。Windows はかつて Microsoft の売上の 80% 以上を占めていましたが、今では 10% 程度まで下がっています
    民間企業が利益を追求すること自体は問題ありませんが、その製品が病院・航空会社・重要インフラの運用に不可欠であるなら、収益性を高めるために AI アシスタントや広告だけに注力するわけにはいきません
    Microsoft は消費者に対する注意義務を果たせておらず、CrowdStrike はその症状だと思います。政府はデスクトップワークスペース市場の競争を真剣に促進するか、さもなければ Microsoft Windows 製品を規制すべきです

    • その通りです。複数の戦線での失敗であり、何十年にもわたる システムの腐敗の兆候です
      Windows の売上比率が下がったことの利点の一つは、MS がもはや Windows を触れてはならない聖域として抱え込み続けない可能性がある点です
  • CrowdStrike を直接使っておらず、私の知る限り自分のシステムにインストールしたこともありません。最後の会社の機器には似たものが動いていたようなので、間違っていたら訂正してください
    CS ドライバは先にインストールされ、削除できず、おそらくリモートモニターが検知し、署名済みドライバなので改変も難しくしようと相当な努力が払われているようです
    ところがそのドライバが、エンドユーザーが任意に削除できる 署名されていないデータファイルを読み込むのでしょうか? こうしたファイルをエンドユーザーが任意に追加して、ドライバに本来してはいけない形で動作させることもできるのでしょうか?
    悪意ある攻撃者が悪性のデータファイルを使ってさらに別の大規模障害を起こしたり、さらに悪いことにカーネル権限を得たりするのを、何が防いでいるのか気になります

    • これらのファイルは、管理者権限があってもユーザーが削除したり変更したりすることはできません。可能なら、アンチウイルスを無効化するのが簡単すぎることになります
      別のオペレーティングシステムでファイルシステムをマウントしなければできませんが、通常は BitLocker がそれを防ぎます
  • CrowdStrike の顧客には、こうしたアップデートが配信されることについて発言権があるのでしょうか。それとも、CrowdStrike が企業内のすべてのマシンに対して 完全なリモートコード実行を持つことを、そのまま受け入れているのでしょうか
    少なくとも認証局や暗号化関係の人たちは、こういうものを自分たちのシステムから外しておけることを望むでしょう

    • CrowdStrike のような第三者に継続的なエンドポイントセキュリティを外部委託しつつ、保護対象のすべてのエンドポイントに対する リモートコード実行と ring 0 権限を与えない方法があるのか分かりません
      CrowdStrike がその部分を自動化していること自体が製品の核心です
    • 私たちが生きているうちに、自動運転車の自動アップデートが何百万人も殺すことになるでしょう
      もしかするとそれを見ることはできないかもしれません。私たち自身がその何百万人の一人かもしれないからです
    • 「コンテンツ」、つまり何をマルウェアと見なすかについての自動アップデートは必須であり、アップデート遅延オプションを迂回します: https://twitter.com/patrickwardle/status/1814367918425079934
  • この「チャネルファイル」が CS ドライバによって署名・検証されているのか、知っている人がいるのか気になります。そうでないなら、ring 0 ルートキットにつながる大きな穴のように見えます
    チャネルファイルをインストールするには権限が必要でしょうが、いったん可能になれば、システムのはるか深い場所に潜むことができます。チャネルファイルがセグメンテーションフォルトを起こせるなら、おそらくもっと多くのこともできるはずです
    それほど高い権限で動作するものに入るすべての入力は、少なくとも完全性チェックを受けるべきです。これは基本です。単にチャネルファイルを削除できるという事実は、改ざん防止メカニズムすらないことを示唆しています