未来を形作るテクノロジーの深掘り記事。

Bitcoinを盗めるか:PHP脆弱性の誇大広告と現実

開発者が脆弱なPHPサーバーに約500ドル分のBitcoinを置き、盗めるものなら盗んでみろと挑発。返ってきたのは沈黙だった。

サーバーラックの棚に置かれたガラス瓶の中の金貨。周囲にはケーブルと点滅するライト。
500ドルが、簡単に侵害できるはずのマシンの中で、堂々と見えるところに置かれている。

セキュリティ界隈のSNSを少しでも眺めていたなら、この主張を目にしたはずです。新しいPHPのリモートコード実行の脆弱性は簡単すぎて、AIエージェントがすでに数千台の脆弱なサーバーを自律的に攻撃している、という話です。群れのように押し寄せ、止められない、と。ある開発者がこの騒ぎにうんざりし、実に率直なやり方で応えました。パッチ適用前のPHPバージョンを動かすサーバーを立て、成功した攻撃者が手の届く場所に約500ドル相当のBitcoinの秘密鍵を隠し、「盗んでみろ」という二語の招待状付きでリンクを投稿したのです。PHPの脆弱性を悪用するなど、チャットボットが昼飯前に吐き出せる程度のものだったはずです。サイトのタイマーが時を刻み始めました。さて、そこで面白いことが起きました。何も起きなかったのです。

数時間が過ぎました。コインはそのまま残っています。コメント欄には、特有の沈黙が広がりました。何日もエクスプロイトは子どもの遊びだと言い張ってきた人たちが、急に実証できない切実な事情を思い出したかのような沈黙です。このやり方をどう評価するにせよ、セキュリティの議論では珍しいことを成し遂げました。バズった主張を、反証可能なものにしてみせたのです。

強奪されるために作られたサーバー

この仕掛けはCTF(Capture The Flag)コンテストの仕組みを借りています。Bitcoinの秘密鍵はWebルートのファイルや環境変数に置かれているわけではなく、PHPの実行ユーザーがアクセスできるprint-flagバイナリが保持しています。つまり、成功させるには情報漏えいやパストラバーサルでは足りず、マシン上で実際にコードを実行できる必要があります。シェルを奪い、バイナリを実行して鍵を読み出し、他の誰よりも先にウォレットから送金しなければなりません。PHPのビルドは、最近のCVEパッチ適用前のものをあえて選んであり、「すべての通信はログに記録されており、このマシン上のものは一切プライベートだと思わないでください」という陽気な注意書きも添えられていました。

このサーバーには、約502ドル相当のBitcoin秘密鍵が隠されています。PHPの実行ユーザーは、print-flagバイナリを通じてこれにアクセスできます。最初にウォレットを手に入れた人の勝ちです。

作者は少し洒落た一言も加えていました。お金が必要ない人は、慈善団体への寄付を検討してほしい、と。さらにサイトには、ライブカウンターとして「成功した侵入がなかった時間」が表示され、ページ全体がスコアボードのようになっていました。時間が経過するたびに、それ自体が一つのデータになりました。一日も経たないうちに、このカウンターはインターネット上で最も興味深いセキュリティ指標になりました。人々が評判を賭けた予測を、まさに測定していたからです。

500ドルの懸賞が反証可能性の装置になる理由

セキュリティの主張の多くは、設計上、反証できないものです。「攻撃者はすでに実環境でこれを悪用している」――根拠は、あなたには見えないテレメトリです。「どんな若手アナリストでも午後のうちに兵器化できる」――実証されたことはありません。「当社のエージェントが自律的に動作するエクスプロイトを発見した」――デモ動画を信じろ、というわけです。負のことは証明できないので、主張は積み重なっていくだけです。パニックは安上がりです。誰にも説明責任がないからです。

公開された懸賞と公開されたタイマーは、この帳簿の付け方を変えます。もし数千の自律エージェントが本当にインターネットを這い回り、パッチ未適用のPHPマシンを片っ端から乗っ取っているなら、まさにその脆弱性を掲げ、現金の賞金と明示的な許可まで付いたこのマシンは、数分で落ちるはずです。数時間ではなく、数分です。インセンティブは完全に一致しています。合法で、奨励されていて、しかも報酬が出る。ところが実際にはカウンターが上がり続けました。結果として、「自律型攻撃が大規模にすでに行われている」という特定の主張が直撃を受けました。あるコメント投稿者が言ったように、目に入るものすべてを侵害するエージェントの群れという話が実際に起きていないのは明らかで、そうでなければコインはもうなくなっているはずです。

これは自分の仕事にも取り入れる価値のあるやり方です。次にベンダーやインフルエンサーが「この脆弱性はあちこちで悪用されている」と言ってきたら、どんな観測結果があれば彼らが間違っていると証明できるのかを尋ねてみてください。答えがないなら、それは分析ではなく、マーケティングを聞かされているのです。Bitcoinの懸賞がうまくいったのは、雰囲気を賭けに変えたからであり、賭けには決着をつけられるという素晴らしい性質があるからです。

エクスプロイトの経済学:本物の攻撃者が参加しない理由

反論もあります。そしてそれは的確な反論です。沈黙が示す意味は見た目ほど大きくないかもしれません。新しいCVEに対する動作するエクスプロイトは、500ドルよりはるかに価値がありますが、それは秘密のままであればの話です。標的に一度エクスプロイトを撃ち込めば、ログに記録され、リバースエンジニアリングされ、使い捨てになるリスクがあります。しかも、オーナーがすべての通信がログに記録され、インターネット全体が見ていると事前に宣言しているサーバーに撃ち込むのでしょうか。それは懸賞ではなく、焚き火です。

暗い水面の上で釣り針にぶら下がる金貨。その下で魚たちが用心深く旋回している。
挑戦のすべての試行を記録する賞金は、もはや賞金ではなく餌です。そして賢い魚はそれを知っています。

このスレッドでは、この論理が両陣営から示されました。攻撃側の主体にとって、500ドルのウォレットより価値の高い標的がありますし、ログを読んでいる相手に自分のツールを渡す理由もありません。防御側の研究者は、脆弱性に関する特権的な情報を持ち、守るべきパッチの適用期間があります。あるセキュリティ企業のCEOは、動作するRCEを持っているものの、人々がまだパッチを当てている最中に詳細が出回れば実害が出るため、あえて実演しないと公に述べました。両者は同じ計算をしていました。コインを取る期待値は500ドルであり、その期待コストは、はるかに価値のあるものを燃やすことです。割に合わない取引です。だから、未請求の懸賞から素直に読み取れるのは「エクスプロイトは存在しない」ではありません。「エクスプロイトを持つ者は、秘密を守ることより500ドルを優先しない」ということです。これらはまったく違う結論ですが、裁判にかけられていたのは片方だけでした。

AIエージェントの現実チェック

スレッドで最も面白かったのは、AIに関する主張が実際の標的とぶつかる場面を見ることでした。あるコメント投稿者は、5つの最先端モデルにこの挑戦を向け、その結果を投稿しました。2つのモデルは、これを正当な公開チャレンジ(実際そうでした)と解釈し、作業に取りかかりました。1つはサイバーセキュリティ関連の依頼としてフラグを立て、審査プログラムへ誘導しました。1つは明確に拒否しました。1つは回答する前にプロバイダー側のコンテンツフィルターに止められました。つまり、最先端のシステム5つのうち、試みることに同意したのは2つだけで、序盤の段階では、どちらもフラグを手に入れられませんでした。

この混在した結果は、どちらの極端な主張よりも重要です。「AIはハッキングなど決してできない」という反射的な意見は間違っています。モデルは実際に取り組みましたし、既知の脆弱性を持つCTF形式の標的に対するエージェント的なエクスプロイトは、確かに向上しています。しかし「自律型の群れが、パッチ未適用のサーバーを片っ端から空にしている」という立場はもっと強い主張をしていて、その強い主張こそが、公開され、許可され、現金の懸賞が付いたハニーポットによって検証されるのです。一方、あるよく知られたペンテスト系の人物は、チャットボットを使って2時間で汎用的な動作するPoCを作ったと主張したばかりでした。そして、関係のない偶然だと思いますが、話題をAIペンテストのプラットフォーム宣伝に切り替えました。もしその主張が本当なら、タイマーが1時間を迎える前に懸賞は消えていたはずです。実際には消えませんでした。似たパターンは以前にも見てきました。デモやリーダーボードは、実際の作業に触れた途端に崩れる能力を持ち上げるものです。これはまさにAIベンチマークが実務の大部分を捉えられない理由で取り上げたギャップです。

実験は仕組まれていたという主張

タイマーを科学的な実験だと持ち上げる前に、真剣に検討すべき技術的な反論があります。特定のサーバー構成は、問題のCVEで実際には攻撃できないかもしれないのです。鋭いコメント投稿者がこの点を詳しく説明しました。このマシンは従来のCGI構成ではなくPHPのCLIサーバーを使い、リクエストを1 MiBに制限し、ほぼ何もないページを配信し、高いメモリ上限を許可しています。脆弱性がどのコードパスに存在するかによっては、この組み合わせが、エクスプロイトに必要なプリミティブを塞いでしまう可能性があります。言い換えれば、このハニーポットは、バグが難しいからではなく、このマシンが脆弱な表面を露出していないからこそ、攻撃されないのかもしれません。

それが事実だとしても、実験には有用な役割があります。脆弱な構成に対する概念実証の試行を集めることができ、汎用的で、どこでも動く、自明なエクスプロイトという主張を反証しているからです。ただし、堅牢化されたCTFマシンとは似ても似つかない、実環境のデプロイに対して動作するエクスプロイトが存在するという可能性までは反証できません。これはセキュリティにおける負の結果に関する一般的な教訓です。その強さは、テスト環境の忠実度に依存します。証拠がないことが不在の証拠になるのは、正しい場所で正しい計器を使って実際に探していた場合だけです。このタイマーが測っているのは、インターネットがこのサーバーを攻撃できる能力であり、それは皆が議論していた問いよりも、狭く、しかしより興味深い問いだと分かります。

防御側が実際に持ち帰るべきこと

これは油断を勧める話ではありません。PHPのRCEが公開された直後のパッチ適用期間は、本当に危険です。前回のPHP CVEの期間には巧妙な回避策よりも、まず接続を切ることが勝った理由について書きましたが、その助言は今も有効です。この懸賞が変えたのは、恐怖の較正です。インターネットに公開されたRCEは存在を脅かすものだからパッチを当てるべきであり、スレッドで空が落ちてきていると言われたからではありません。

  • 反証可能性を求める。 誰かが大規模な悪用が進行中だと主張したら、何があればそれを決着させられるのかを尋ねてください。タイマー付きの公開ハニーポットは粗削りですが、千回のリツイートよりは厳密です。
  • 自分でカナリアを置く。 あるコメント投稿者は、「自分は侵害されているか」という雰囲気の問いを、テレメトリの問いに変えるための罠として、何年も暗号化されていないBitcoinウォレットを個人のマシンに置いていると書いていました。カナリアトークン、ハニークレデンシャル、おとりファイルは、安価な早期警戒システムです。
  • 経済性を理解する。 熟練した攻撃者はエクスプロイトを温存し、声の大きい解説者は恐怖を収益化します。どちらのグループのインセンティブも、正確な脅威評価を必要とするあなたの都合とは一致しません。だから、コメントよりも一次データのテレメトリを重視してください。
  • 主張を切り分ける。「エクスプロイトは存在する」「悪用が起きている」「自律エージェントがすべてを悪用している」は、それぞれ異なる証拠のハードルを持つ三つの別の主張です。パニックはそれらを一つにまとめてしまいます。そうさせないでください。
  • それでも迅速にパッチを当てる。 静かなハニーポットは、静かな露出を意味しません。本番のマシンは500ドルの賞金を掲げていませんが、そのことが逆に、動作するエクスプロイトを握っている者にとっては、より魅力的な標的になるのです。

このスタント全体で最も良い点は、作者にほとんどコストをかけさせず、実質的なシグナルを生んだことです。VPS、脆弱なPHPビルド、フラグバイナリ、そして500ドルで、議論全体が必要としていた計測結果が得られました。「エクスプロイトは存在する」と「エクスプロイトはどこにでもある」のあいだのギャップこそパニックが生まれる場所であり、今やそのギャップの真ん中で、タイマーが静かに時を刻み、誰かにそれを埋めてみろと挑発しています。