AIが生成したcronジョブが、あるスタートアップのすべての有効なStripeサブスクリプションを10秒足らずで削除し、同社の月間経常収益(MRR)を38ドルまで激減させた。この事件は、危険が潜んでいるのはコードを書いた言語モデルではなく、デプロイメント・パイプラインであることを示している。
何が起きたのか
先週、BridgeMindAIのチームが目覚めると、ダッシュボードに表示された月間経常収益(MRR)はわずか38ドルだった。AIモデルが生成したたった一行のコードを、スケジューラーが自動的に実行したのである。その一行は、すべての顧客レコードに対してStripeのサブスクリプション解約エンドポイントを呼び出していた。その呼び出しは7秒で完了し、顧客ベースを根こそぎ消し去った。
スクリプトは、空の削除キューを「すべてを削除せよ」という信号と誤読したのだ。この「空=すべて」というパターンは、生成AIが登場するずっと前、1980年代からプロダクションコードの中に存在している。
なぜモデルが犯人ではないのか
人々はすぐに、AIモデルが信頼できないとして非難した。しかし、モデルを入れ替えたとしても、この消失を防ぐことはできなかっただろう。なぜなら、欠陥はハルシネーション(幻覚)やバイアスではなく、人間が書いたロジックにあったからだ。
真の失敗はアーキテクチャ上のものだった:
- スクリプトに、サブスクリプションを解約できる本番環境用のStripe APIキーが保存されていた。
- 実行時の監視が全く行われずに実行された。
- コード生成と実行の間に、人間のチェックポイントが設けられていなかった。
これらの隙が、たった一つのバグによって、わずか数秒で収益源を破壊することを許してしまった。
自律型パイプラインにおける3つの安全上の問い
どの操作が不可逆か? サブスクリプションの解約、レコードの削除、返金などは取り消すことができない。これらは読み取り専用のクエリよりも強力な保護が必要である。
エージェントは何の認証情報を持っているか? 自律的なプロセスにStripeのマスターキーを渡すことは、無制限の権限を与えることと同じである。「最小権限の原則」を適用し、必要なタスクのみを実行できるスコープ付きのキーを使用すべきである。
人間のチェックポイントはどこにあるか? コードレビューだけでは不十分だ。コード生成の「後」、かつ破壊的なアクションの「前」にゲートを設置せよ。
実践的なセーフティレール
- ドライラン・ゲート – 削除や解約の呼び出しを行う前に、対象となるターゲットをログに記録する。リストが空であったり、異常に多かったりする場合は、処理を中断し人間にアラートを送信する。
- スコープ付きの認証情報 – デフォルトでは読み取り専用キーを使用する。タスクでサブスクリプションを解約する必要がある場合は、一度に単一の顧客IDに対してのみ操作できる制限付きキーを作成する。
- Human-in-the-loop(人間介在型)プロンプト – 「47件のサブスクリプションを解約しようとしています。よろしいですか?」といった短いメッセージをチャンネル(Slackなど)に送信する。コストは微々たるものだが、安全性への効果は絶大である。
これらの対策は、どのモデルがコードを書くかに関わらず有効である。なぜなら、これらは生成器(ジェネレーター)ではなく、実行環境を保護するものだからだ。
自律型エージェントのためのプロダクション・チェックリスト
- すべての操作を read、reversible、または irreversible に分類する。
- すべての irreversible なアクションに対して、明示的な人間の承認を必須とする。
- 認証情報を、タスクに必要な最小限の権限に制限する。
- レコードを削除または変更するループに対して、サイズ制限を設ける。
- まずは本番データを模したサンドボックス内でエージェントを実行し、本番データに触れる前に結果を確認する。
- 実行前にエージェントの計画を平易な言葉でログに記録し、レビュー担当者が意図を一目で把握できるようにする。
このチェックリストに従うことで、「一度実行したらあとはお任せ」というスクリプトを、監査可能で、異常があれば停止できる制御されたワークフローへと変えることができる。
教訓は明白である。モデルではなく、プロセスを信頼せよ。
