GoogleはPython向けVertex AI SDKの欠陥にパッチを適用したと報告されています。この脆弱性を悪用されると、モデルのアップロードが乗っ取られ、テナントをまたいだリモートコード実行(RCE)が引き起こされる可能性がありました。
AIエージェントの構築・トレーニング・デプロイを行うGoogleのマネージドプラットフォーム「Google Cloud」が提供するPython向けVertex AIソフトウェア開発キット(SDK)に、設計上の欠陥が発見されました。この欠陥により、開発者自身のGoogle Cloudプロジェクト外にあるモデルの乗っ取りや汚染が可能になる恐れがあります。
Unit 42の研究者によると、バケット命名ロジックの不備と認証機能の欠如が組み合わさることで、攻撃者はプロジェクトIDとリージョンを知るだけで被害者のプロジェクトを乗っ取れる状態になっていたとのことです。
「Google Cloud全体でバケット名は重複できないため、バケット名を予測できた攻撃者は、自分のプロジェクトで先にそのバケットを作成することができます」と研究者たちはブログ投稿で述べています。「その後、別のプロジェクトから同名のバケットを使おうとしても、攻撃者のバケットに静かにフォールバックしてしまいます。」
研究者たちは、これはクラウドストレージのバケット名がグローバルに一意であることを「悪用する」既知の脆弱性クラスだと指摘し、「バケットスクワッティング」と呼んでいます。
悪用に成功した場合、Vertex AIインフラに読み込まれる悪意あるモデルが注入され、テナントをまたいだコード実行につながる可能性があります。この欠陥はGoogleに報告され、根本的な問題が修正されたと伝えられています。
GoogleはCSOからのコメント要請に対し、即座に回答しませんでした。
クロステナントRCEを可能にするpickleデシリアライゼーション
Unit 42によると、Vertex AI SDK for Pythonのバージョン1.139.0および1.140.0における脆弱なモデルワークフローでは、ステージングバケット名が顧客のプロジェクトIDとリージョンのみから生成されていました。同名のバケットが既に存在する場合、SDKはその存在を確認するだけで、所有権の検証は行っていませんでした。
これにより、攻撃者が被害者の想定するステージングバケット名と一致するバケットをあらかじめ作成し、モデルのアップロードがそこに誘導されるのを待つというバケットスクワッティングのシナリオが成立します。モデルのアーティファクトが攻撃者の管理するバケットにアップロードされると、Vertex AIのサービスエージェントが取得するまでの短い競合状態の窓を利用して、攻撃者はそれを悪意あるバージョンに差し替えることができます。
この攻撃がRCEに発展し得るのは、PythonにおけるMLモデルがpickleやJoblibなどのシリアライゼーション形式で保存されることが多いためです。pickleのデシリアライゼーションは、特別に細工されたオブジェクトを通じて任意のコードを実行できるため、汚染されたモデルがVertex AIの推論インフラに読み込まれた際にリモートコードが実行される可能性があります。
このクロステナント攻撃手法は、Pythonの組み込みモジュールであるpickleのデシリアライゼーションに部分的に依存していることから、研究者たちによって「Pickle in the Middle(中間にいるPickle)」と名付けられました。
GoogleがAI活用で発見されたバグを修正
今回の調査においてUnit 42は、大規模言語モデル(LLM)をコード解析ワークフローに組み込み、脆弱性の発見を加速させました。
「かつては数日を要していた解析作業が、今では大幅に短時間で実行できるようになりました」と研究者たちは述べています。「モデルの焦点を絞り込みながら特定のパターンを探すよう指示することで、ユーザー制御または派生したプロジェクト入力によって影響を受ける、クラウド上にプロビジョニングされたリソースへの経路を発見することができました。」
Googleは対象のワークフローを修正し、ステージングバケットが使用前に検証されるようになったと報告されています。これにより、攻撃者が他のプロジェクトのリソースと誤認させるようなバケット名を登録することが防がれます。
修正はSDKバージョン1.144.0および1.148.0で展開されており、ユーザーはいずれかのパッチ済みバージョンにアップグレードする必要があります。