そのランサムウェアにオペレーターはいなかった
7月初旬、Sysdigは、AIエージェントが端から端まで実行した初のランサムウェア攻撃と呼ぶものを記録した——偵察、認証情報の収集、横展開、そして本番データベースの削除まで、キーボードの前に人間は一人もいなかった。コーディングエージェントを動かす者にとって興味深いのは、攻撃者がモデルを使ったことではない。連鎖のすべてが、環境内の秘密情報を探し出すことから始まる、という点だ。Bromure Agentic Codingは、まさにそれを行うエージェントを想定して作られている。
私たちは二年間、コーディングエージェントに認証情報を託せるかどうかを 論じてきた。Sysdigはこの問いのもう半分を公表した。あるランサムウェア集団が、 見知らぬ他人のサーバーにエージェントを向け、侵入のすべてをそれ自身に 行わせたのだ——声に出して推論し、自らのログイン失敗を三十一秒で修正し、 済んだらデータベースを削除した。誰も操縦していなかった。この種の攻撃に 必要な技能の下限は、いまやモデルを動かす費用そのものになった。
ある晩の19:34:24 UTC、自動化された侵入者が本番データベースに裏口の管理者 アカウントを挿入した。十二秒後、そのログインは失敗した。さらに十二秒後、 それはデフォルトの認証情報を試すと同時に、新しいパスワードハッシュを 生成した——二つの可能な原因を並行して診断していたのだ。最初の失敗から 三十一秒後、それは複数段階の修正を投入した。壊れたサブプロセスへ呼び出すのを やめ、暗号ライブラリを直接インポートし、不正な行を削除し、それを入れ直す。 次の試行はログインに成功した。
人間のインシデント対応者はこのタイムラインを読めば、何を見ているのか分かる。
PATHの問題を診断し、自分のエクスプロイトを書き直し、それを三十秒で再実行する
人間などいない。これはエージェントだった。
JADEPUFFERが行ったこと
この攻撃を、Sysdigの脅威リサーチ チーム はJADEPUFFERと名付け、7月初旬に報じた。侵入口はインターネットに晒された Langflow サーバー——LLMアプリを構築するツール——であり、CVE-2025-3248、すなわち認証を 欠いたことで未認証のリクエストが任意のPythonを実行できてしまう不備が使われた。 その部分はありふれている。何千ものLangflowインスタンスが晒されている。足場を 得た後に起きたことこそが本題だ。
エージェントはホストを列挙し、そして今やあらゆるポストエクスプロイトの
定石が始める通りのことをした。マシンを秘密情報のために探索したのだ。並行して、
LLMプロバイダーのキー(OpenAI、Anthropic、DeepSeek、Gemini)、AWS・Google・
Azureおよび複数の中国系プロバイダーにまたがるクラウド認証情報、暗号通貨の
ウォレット、データベースのログインを狙った。保存された鍵を求めてLangflowの
バックエンドDBをダンプした。工場出荷時のパスワードをまだ使っている内部の
オブジェクトストアを発見し——minioadmin:minioadmin——terraform-stateを含む
すべてのバケットを列挙し、そこから.envとcredentials.jsonを引き出した。ある
ストレージ要求が期待したJSONではなくXMLで返ってくると、それはその場で自らの
パーサーを書き直し、続行した。
それから本命——MySQLとNacos構成サービスを動かす別のサーバー——へ横展開し、
Nacosの周知のデフォルト署名鍵で管理者トークンを偽造し、上記のログイン失敗の
連鎖をくぐり抜け、仕事を仕上げた。それは1,342件すべてのNacos構成項目を、
コンソールにちょうど一度だけ表示して二度と保存しなかった鍵で暗号化し、元の
テーブルを削除し、Bitcoinアドレスと Proton Mailの連絡先を記した
README_RANSOMテーブルを作成した。鍵はどこにも保存も送信もされなかったため、
身代金を払ってもデータは戻らなかっただろう。
終始その手掛かりはコードそのものだった。ペイロードはなぜを説明する平易な 言葉のコメントで埋め尽くされていた——標的を価値で格付けし、「これが最大だ、 これも削除しろ」と語り、各段階に、声に出して考えるモデルのように注釈を付ける。 実際それがまさに起きていたことだからだ。
開発者が心配すべき部分
これをサーバーセキュリティの話と呼ぶこともできる——Langflowにパッチを当て、
デフォルトのNacos鍵を持つデータベースをインターネットに晒さず、オブジェクト
ストアをminioadminから移す——そしてそれは正しく、しかもすべて誰か他人の
リストだ。それがコーディングエージェントについての記事に属する理由は、
ステップ2にある。
その環境で到達可能なあらゆる秘密情報は、エージェントがコード実行を得た瞬間に
弾薬となった。それが探索した鍵は、あなたのコーディングエージェントが仕事を
するために必要とするのと同じ鍵だ。モデルを呼ぶためのAPIトークン、デプロイを
確認するために使うAWSの認証情報、プッシュに使うGitHubトークン、.envの中の
データベースURL。JADEPUFFERは、エージェントがあなたのために働くのをやめた
瞬間にそれらをどう扱うかを示している——そして、あなたのエージェントが働くのを
やめさせられうることを、私たちはすでに知っている。
これは憶測ではない。この夏だけでも、研究者たちは、エラー監視のフィードに 仕込まれた偽のバグ報告 によって攻撃者のコードを実行させられたコーディングエージェントと、信頼できない リポジトリの一見ありふれたセキュリティレビュー の最中にペイロードの実行へ誘導されたエージェントを示した。どちらでも、 エージェントはそうでなくなる瞬間まで丁寧で協力的なままだ。JADEPUFFERの自律性を これらの乗っ取りの隣に置けば、形は明白になる。あなたのセッションの内側の敵は、 今やあなたが招き入れたエージェントそのものになりうる。そして一度それが翻れば、 偵察を行い、到達できるあらゆる認証情報を収穫し、動く——それ自身で、機械の 速度で。
だから有用な問いは「私のエージェントは信頼できるか」ではない。「信頼できない とき、エージェントは何に到達できるか」だ。エージェントに行儀よくするよう 求めることで答えるあらゆる防御——入念なシステムプロンプト、ファインチューン、 信頼ダイアログ——は、JADEPUFFERがまさにそうしないよう作りうると証明したものに 賭けているのだ。
Bromureはエージェントがすでに敵対的だと前提する
Bromure Agentic Codingは、あなたのコーディングエージェントを使い捨ての Linux VMの中で動かし、それが行うあらゆるネットワーク要求は、そのVMから ホスト上のプロキシを通って出ていく。この設計は、業界が繰り返し痛い目を見て 辿り着く前提から出発する。エージェントは遅かれ早かれ、あなたが意図しなかった 何かを実行する、と。だから守るに値するものは、エージェントの推論が届かない 場所に置かれる——箱の中ではなく、ホストに。
認証情報は最も明快な事例だ。侵入者が最初に手を伸ばすものだからだ。Bromureでは、
本物の秘密はVMに決して入らない。プロファイルにAnthropicの鍵、
AWS_SECRET_ACCESS_KEY、GitHubトークン、データベースの認証情報を与えると、
エージェントの環境にはその代わりに偽物が入る——brm_…というプレースホルダーだ
——そしてホストのプロキシが、それを受け取るべきプロバイダーへの送信要求のときだけ、
通信路上で偽物を本物の値に差し替える。エージェントは認証し、仕事をする。ただ
その材料を握ることは決してない。エージェント自身を動かし続けるAPIキーですら、
環境を読む何ものにとってもおとりなのだ。
さて、JADEPUFFERのステップ2をそれに対して走らせてみよう。エージェントは
マシンを探索し、鍵を予想通りの場所に見つける——そしてそのどれもが偽物だ。
それらをダンプし、束ね、コマンド&コントロールサーバーへビーコンとして送る。
そして向こう側の攻撃者が受け取るのは、何も認証しないbrm_…という文字列の山だ。
攻撃の最も貴重な一分、その後のあらゆる段階を燃やす認証情報の収穫が、空手で
終わる。
同じ姿勢が連鎖の残りも鈍らせる。偵察は使い捨ての箱に対して走る。マシンを 地図化し秘密情報を探索しても、見つかるのは共有ベースから複製された使い捨ての VMであって、あなたのノートパソコンでもネットワークでもない。JADEPUFFERが 仕込んだ永続化——三十分ごとに自らのサーバーへビーコンを送るcrontabの項目——は そのVMの中に生き、あなたがプロファイルのホームを消すかベースにリセットした 瞬間に死ぬ。それはインシデントではなく、メニューの一項目だ。そしてあらゆる 要求はホストのプロキシから出ていくため、攻撃者のアドレスへのビーコンは 不可視ではない。それはセキュリティログに記録された一行であり、それを行った セッションに帰属できる。
破壊的なフィナーレ——削除されたテーブル——には、Bromureのホスト側の
Guardrailsが防波堤となる。それは、理解しているプロバイダーへのエージェントの
呼び出しを分類し、破壊的なものには通信路上で厳格な403を返す。VM内の
侵害されたエージェントがそれをオフにできない場所で、だ。私たちはこの境界に
ついて、あるCursorのエージェントが本番データベースを九秒で削除した
後に詳しく書いた。正直なエージェントのミスを止めるのと同じ仕組みが、敵対的な
エージェントのDelete*やTerminate*を止める。
これが直さないもの、はっきりさせておくために
Bromureが注入する認証情報を差し替える
差し替えが及ぶのは、プロファイルで設定する秘密——モデルの鍵、クラウドと gitのトークン、コンテナレジストリ、マネージドなデータベースのエンドポイント ——だ。VMの中のファイルに手で貼り付けたパスワードや、リポジトリに置かれた ウォレットのシードは、ただのファイルにすぎない。プロキシにはその代わりに 置く偽物がない。秘密はワークスペースではなく、認証情報ブローカーに入れて おくこと。
Guardrailsは解析できるプロバイダーしか防がない
破壊的呼び出しのブロックが分類するのは、Kubernetes、AWS、DigitalOcean、 主要なgitフォージ、コンテナレジストリ、そしてMongoDB・ClickHouse・ Elasticsearchのような HTTPSデータベースだ。マネージドでない箱への生の MySQLソケット——JADEPUFFERがテーブルを削除した、まさにそのプロトコル——は、 今日プロキシが読むものではない。カバレッジは現実の一覧であって、全知では ない。
送出はデフォルトで禁止ではなく記録される
ビーコンはセキュリティログに現れる。それは帰属であって、防止ではない。 認証情報が偽物だから本物は何も出ていかないが、VMが任意のホストと話すのを 禁じる必要があるなら、それはあなたがなお設定すべきネットワークポリシーだ。
あなたが晒したサーバーにはパッチを当てない
Bromureはあなたのエージェントが動くマシンを守る。インターネットに面した
Langflow、デフォルトのNacos鍵、あるいはあなたの資産のどこか別の場所にある
minioadmin:minioadminのオブジェクトストアには、何もしない。この物語の
初期アクセスの半分は、依然としてありふれた衛生管理だ。
一般化する部分
LangflowとNacosと特定のあの晩を取り除けば、JADEPUFFERは、エージェントで 構築する誰もが立っている地面の予告編だ。本物の認証情報を握り、機械の速度で 推論し、適応し、行動できるエージェントは、いまや安く借りられ、容易に向けられる。 それはあなたの問題になるためにあなたの攻撃者である必要はない——ただあなたの セッションに紛れ込みさえすればよく、この夏の乗っ取り研究はそれが可能だと言う。 そうなったとき、それが最初にすることは、あなたの環境を読むことだ。
Bromure Agentic Codingは、エージェントをより行儀よくすることでそれを防ごうとは しない。それは、正当な仕事をするエージェントにとってのみ読む価値のある環境に する。本物の鍵はホストに、おとりは箱に、使い捨てのVM、そして出ていこうとした すべての記録。エージェントは敵対的になり、JADEPUFFERの定石をまるごと走らせる ことができる——そして、盗んだ認証情報が何も開けず、潜り込んだ箱が次のリセットで 消され、本物の秘密がかつて存在した唯一の場所こそ、それが決して到達できない 唯一の場所だったと知る。それはフリーでオープンソースだ。