世界を動かす技術を、日本語で。

「Copilot」をルート化する方法

概要

  • 2025年4月、Microsoft Copilot Enterpriseに Jupyter NotebookベースのPythonサンドボックス が密かに導入された事例
  • サンドボックスは Linuxコマンド実行やファイル操作 が可能で、特定の脆弱性も存在
  • パスの設定ミス によりroot権限で任意コード実行が可能だった
  • 脆弱性は 報告後に修正 されたが、報奨金の対象外
  • 詳細な調査内容と今後の講演案内

Microsoft Copilot EnterpriseのJupyter Notebookサンドボックス調査

  • 2025年4月、 Copilot Enterprise にJupyter Notebookベースの ライブPythonサンドボックス が導入
  • ユーザーは %command構文 でバックエンドにコード実行指示が可能
  • 実行環境は Linuxのubuntuユーザー、miniconda環境
  • ubuntuユーザーは sudoグループ所属 だが、sudoバイナリは未配置
  • Python 3.12 採用(ChatGPTは3.11)、新しいカーネルバージョンで稼働
  • 主な機能は Jupyter Notebook とTikaサーバの実行
  • OverlayFS を利用し、/legion配下からファイルシステムをマウント
  • カスタムスクリプトは /appディレクトリ に配置
  • ファイル操作は /mnt/data で行い、blob:https://outlook.office.com/<guid>形式で外部からダウンロード可能
  • goclientappバイナリ が6000番ポートでWebサーバを起動し、/executeエンドポイントでコード実行
  • httpproxyバイナリ も存在し、将来的な外部HTTP通信に備えた構成

サンドボックスの動作と制限

  • 初回コマンドでのファイルダウンロード要求は失敗、セッションの状態に依存
  • バイナリファイルは破損しやすい が、base64エンコードを使えば多くの場合正常に取得可能
  • テキストファイルやコマンド出力は問題なく取得 可能
  • /mnt/data ディレクトリが作業領域として利用される

脆弱性の発見と検証

  • entrypoint.shスクリプト がroot権限で実行され、途中で 権限をubuntuユーザーにドロップ
  • pgrepコマンド がフルパス指定なしで実行され、$PATH内の先頭にある /app/miniconda/bin がubuntuユーザーから書き込み可能
  • 悪意あるpgrepスクリプト を配置することで、root権限で任意コード実行が可能
  • 実際の攻撃例として、/mnt/data/inのコマンドを読み取り、出力を/mnt/data/outに書き込むPythonスクリプトを作成
  • root権限取得後も コンテナの分離は強固 で、/rootや重要ログにはアクセス不可
  • 既知のコンテナブレークアウト手法は全て対策済み

Microsoftへの報告と対応

  • 2025年4月18日 にMicrosoftに脆弱性を報告
  • 2025年7月25日 に修正済み通知、同日ケースクローズ
  • 中程度(moderate) の脆弱性として扱われ、バグバウンティ対象外
  • Microsoft Online ServicesのSecurity Researcher Acknowledgments にて謝辞のみ

講演案内と今後の調査

  • BlackHat USA 2025 での講演「Consent & Compromise: Abusing Entra OAuth for Fun and Access to Internal Microsoft Applications」
    • 日時:2025年8月7日(木)13:30~、ラスベガス
    • Responsible AI Operationsコントロールパネル や21の内部Microsoftサービスへのアクセス詳細を解説予定

Eye Securityについて

  • ヨーロッパ拠点のサイバーセキュリティ企業
  • 24/7の脅威監視、インシデント対応、サイバー保険サービスの提供
  • 積極的な脅威情報収集とリサーチ活動 を展開
  • 詳細はhttps://eye.security/、LinkedInでも情報発信

Hackerたちの意見

以前のLLMは、会社の秘密を学習してしまう金のなる木だったよね(公開インターネットに載せるべきじゃない文書を学習してた)。今はほとんどが削除されたみたいだけど。

僕の経験から言うと、会社の秘密って他の会社にはほとんど役に立たないよ。

具体的な例とかある?自分は見たことないんだけど。

ソースは?

企業(非「テック」)がそれを取り入れ始めたとき、彼らはその製品の意図以外のコンテンツに対する「ガードレール」が全くなかったんだよね(これに対する標準的な用語は知らないけど)。以前、サインイン不要の無料LLMを持っていたタピオカティーの会社があって、ChatGPTの無料プランが始まる前にいくつかのbashスクリプトを生成するのに使ったことがある。

以前のLLMは企業の秘密の金脈だった(公開インターネットに載せるべきでない文書を学習していたとき)。それ、信じられない。LLMは通常、トレーニングセットに一度だけ現れたものを記憶することはないし、非公開データを誤って学習する大きな問題についても聞いたことがない。でも、LLMがこういう風に真実のように見える幻覚を起こすことがあるから、信じる人がいるのもわかる。

これ、Pythonのサンドボックスからコンテナに抜け出すってことだと思う。MSFTが「中程度」の深刻度をつけたのも納得だね。

4月にマイクロソフトに脆弱性を報告したんだけど、それ以来「中程度」の脆弱性として修正されたよ。重要な脆弱性とクリティカルな脆弱性だけがバウンティの対象になるから、何ももらえなかった。マイクロソフトオンラインサービスのセキュリティリサーチャーの認識ページに名前が載っただけだね。マイクロソフトみたいな小さなインディー企業がバグバウンティを払えないのは分かるけど、これで悪いことは起きないだろう。

重要な部分: > ルートアクセスを持ってコンテナで何を得たのか? > まったく何もない! > このアクセスを使って、以前はアクセスできなかったコンテナの部分を探検できるようになったけど、ファイルシステムを調べても/rootにはファイルがなかったし、面白いログも見つからなかった。コンテナの抜け出しは無理そうで、既知の抜け出し方法はすべてパッチが当てられてたからね。ルートを取得する方法はもっとあると思うけど、マイクロソフトが一つに対してバウンティを払ったら、すべてに払わなきゃいけなくなるし、ちょっと意図しないけど危険じゃないものに対してそれをするのは馬鹿らしいよね。

なんで人々が多国籍の兆ドル企業のために無料で開発作業をするのか、全く理解できない。

他のところでも見たけど、「root」を取っても何も得られなかったよ。試みたけど、何もなかった。

M$: お金を送らないなら、何かグッズを送ってよ。かっこよくして、ハッカーたちが着るようにすれば、彼らがあなたの宣伝をしてくれるし、もしかしたら働きたいと思うかもしれない。文化は道具だから、ハッカーたちの文化を学んで使いこなそう。

なるほど、これが何についての話か分かった気がする。報告された脆弱性(マイクロソフトが修正したやつ)は、コンテナ内でルート権限で自分のコードを実行できるトリックがあったってことだね。本来は非ルートユーザーとしてしかコードを実行できないように設計されてたのに。でも、結局あまり関係なかったみたい。コンテナ自体はまだ安全だったから、ネットワークリクエストもできないし、抜け出すこともできなかった。だから、ルート権限でできることは、結局自分だけがアクセスできるコンテナをめちゃくちゃにすることくらいだった。

現代の世界では、脆弱性はスタックのようなものだね。「コンテナ自体はまだ安全だった」というのは、攻撃者がそこに何も見つけられなかったっていうだけの話。だけど、コンテナのブレイクアウトやVMのブレイクアウトはよく知られてることだし、設定ミスやvirtioドライバーのバグなんかがあれば簡単に起こる。これは本当に重要な結果だよ。

このコンテナが具体的にどう実装されているかはわからないけど、マイクロソフトには隔離されたPythonサンドボックスを作る標準的な方法があるよ。https://learn.microsoft.com/en-us/azure/container-apps/sessi... これがその機能を使っているか、似たようなものだといいな。

ここはMicrosoftを褒めるべきだね。ほとんどの企業はちゃんとセキュリティを強化しないけど、彼らは徹底してた。

コパイロットが時々コードを実行するのを拒否したり、時々許可したりするのが変に思える。彼らは一体何を目指してるんだろう?

コパイロットにsudoバイナリをbase64で使わせることで、ショートカットできたんじゃないかな。

ファイルの所有権をrootに変更する必要もあるよ。

何か見落としてるのかな?それとも「外部」世界へのネットワーク接続を作ることができたの?(明らかにローカルネットワークをうまく利用して?ルーターのエンドポイントをファジングしたりとか。)それとも、マイクロソフトは顧客がリスクなしにrootアクセスを得られるようなコンテナを提供できるのかな?

OpenAIがPythonの解釈をリリースしたとき、彼らがやったことは簡単だったよ。オープンネットワークアクセスはなかったし、興味深いのは開発者がどうプログラムしてるかのちょっとした洞察だけだった。内部の設定ファイルがいくつかあったけど、これと全く同じだね。

これって本当に脆弱性って言えるのかな?システムの安全性は、コードがコンテナ内で実行されることにあるよね。

コンテナが隔離されてたと仮定すると、たぶんそうだったと思うけど。

彼はその応答がただの幻覚じゃないってどうやって知ってるの?私はそこで働いてるから言うけど、そのプロセスは全然わからないよ。実際、public repoにkeepAliveJupyterSvc.shっていうスクリプトを見つけたんだ: https://github.com/shivamkm07/code-interpreter/blob/load-tes...

うーん、これは本当に幻覚っぽいね。みんな、チャットボットはほとんどトークン生成器だから、プログラムを実行して応答を返すわけじゃないんだよ…シンプルなシェルプログラムじゃなくて、GPUで計算してトークンを返して、それが英語に翻訳されるんだ。

あのリポジトリとその貢献者は、Pythonコードをコンテナで実行するサービスに取り組んでいるMS/Azureの社員なんだよね。なんで個人アカウントの下にあるのかはわからないけど、オフィスのリポジトリからのフォークって書いてあるのに、そのリポジトリが見つからないんだよね。

それは幻覚じゃないかもしれないね。もしかしたら、CopilotのコードはGitHubのトレーニングセットから生成されたのかも?

「How We Rooted Copilot」っていう投稿があるのが信じられない。実際には、すごく制限された一時的なPythonサンドボックスコンテナでrootを取っただけなのに。俺は「rooted copilot」って聞くと、コパイロット自体のコアとなるVMでrootを取ったのかと思っちゃう。もっと正確なタイトルは「How We Rooted the Copilot Python Sandbox」だと思う。