5 ポイント 投稿者 GN⁺ 2025-08-05 | 3件のコメント | WhatsAppで共有
  • 2025年8月3日、DrawAFish!のウェブサイトで約6時間にわたり大規模なセキュリティインシデントが発生した
  • 管理者パスワードの流出、認証漏れのAPI、JWT脆弱性など主要なセキュリティ脆弱性が複数重なり攻撃に晒された
  • その結果、すべてのユーザー名が侮辱的な表現に変更され、不快な画像が承認されると同時に、既存の安全な画像が削除された
  • 手作業による復旧、認証ロジックの修正、バックアップの確認などで問題の解決を進めた
  • 主な教訓は、高速開発(“vibe-coding”)とテスト・コードレビュー不足が、セキュリティ上重大な結果を招く可能性があること

DrawAFish.comの概要と2025年8月3日の事故要約

  • DrawAFish.com は、ユーザーが自分で魚を描き、他のユーザーと一緒に水槽で泳がせる楽しさのあるウェブサイト
  • 2025年8月1日、Hacker News 1位に入り大きな注目を集めた。開発者はCopilotなどのツールで機能を素早く実装する“vibe-coding”方式を採用していた
  • しかし2025年8月3日の未明、深刻なセキュリティ事故が発生した
  • 約6時間にわたり、あらゆるユーザー名が低俗な表現に変更され、不適切な画像が承認されるなど混乱が起きた
  • 最終的に管理者が手動でロールバック作業を実施した

脆弱性の詳細分析

1. 過去に流出した6桁の管理者パスワード

  • 開発者は当初、自分の幼少期のIDとパスワード(6桁)を管理者アカウントに使用していた
  • このパスワードは、過去にNeopetsなどのサイトデータ流出を通じてすでにオンライン上で公開されていた
  • 開発者はその後Google Authを使うようにしたが、以前のパスワードを削除しなかったため、攻撃者にとって脆弱性が残っていた
  • 攻撃者は流出した情報を使って管理者認証に成功し、侮辱的な画像の承認や正常画像の削除などの悪意ある行為を行った

2. 認証なしのユーザー名変更API

  • プロフィールのバックエンド開発時に“高速開発”を優先するあまり、認証確認機能なしでユーザー名変更APIを実装した
  • 実質的に誰でも任意のユーザー名を変更できた

3. JWT検証の不備

  • JWTトークンベースの認証で、トークンとuserId/emailの照合なしに管理者作業を実行可能に実装していた
  • つまり攻撃者は、管理者認証情報で発行されたトークンだけで誰のリクエストにも管理者権限を使うことができた
  • 興味深いことに、あるHacker Newsユーザーがこの脆弱性を使って侵入者より先に不適切な資料を削除し、緊急対応に貢献した

復旧プロセス

  • 開発者は午前7時45分ごろに異常状況を認識し、すぐにデスクトップから対処を開始した
  • Firebaseのバックアップが未設定だったためバックアップに依存できず、コードを迅速に修正して認証を強制適用した
  • すべてのモデレーションログを追跡し、悪意のある作業をキャンセルするスクリプトを開発した(これもvibe-coding方式で作成)
  • 緊急時に管理者権限を使った第三者(Hacker Newsユーザー)のアクセスアカウントも遮断し、連絡してコードベースのセキュリティリファクタリングに関するフィードバックを受け追加パッチを実施した

開発文化と教訓

  • 開発者は“vibe-coding”、すなわち高速プロトタイプ作成と最小限のレビュー文化が楽しさと高い生産性をもたらす一方、実際には深刻なセキュリティ脆弱性につながる可能性があることを経験した
  • LLM(Copilot)は高速なコード生成に非常に有用だが、コードの品質とセキュリティ責任は開発者自身にあることを示した
  • テスト、認証ロジック、コードレビューなどの基本的なセキュリティ手順を省くと、スモールプロジェクトでも外部攻撃に対して極めて脆弱になり得ることを示した事例である

結論と洞察

  • DrawAFish.comの事例は、実サービス運用環境でしばしば見落とされる基本的なセキュリティ対策の重要性を示す
  • オープンソースツールや高速開発ツールに依存する場合でも、必ずテスト、認証、コードレビュー、パスワード管理などの基本的課題を確認しなければならない
  • 想定外の規模の注目(例:Hacker News上位ランク)により、攻撃対象面とリスクが急激に拡大する可能性がある
  • Postmortemを透明性を保って記録することで、今後の類似のスタートアップや個人開発者に現実的なセキュリティの教訓を伝える

3件のコメント

 
crawler 2025-08-06

vibe-coded の「S」は「Security」の略語です。

 
wkbae 2025-08-06

興味深いことに、あるHacker Newsユーザーがこの脆弱性を利用して、侵入者より先に不適切なデータを削除し、緊急対応に貢献した。

 
GN⁺ 2025-08-05
Hacker News のコメント
  • 私も速いペースで物事を進めるのが本当に楽しく、コードレビューみたいな作業をせず、その場でいきなりプッシュするのが好きだ。今回のポストモーテムを見て、自分のサイドプロジェクトがなぜ頻繁に中断されるのか分かった。最後には地味で退屈な実作業にぶつかり、そこを越えられず止まってしまうからだ。
  • Firebase かどうかが気になる。無料ティアを使い続けた結果なのか、あるいは誰かが悪意を持って攻撃し、翌朝起きたら五桁の請求書が来ていたのか。
  • 私はスワーフィッシュ事件を直接経験した「運のいい」側の一人で、セキュリティ業務をしているからこそその露骨さを見て笑えていたが、HNにはすぐにこの件をしっかり助けてくれる人が現れるだろうとも分かっていた。vibe-coded なプロジェクトでも、こうしたポストモーテムが丁寧に公開されているのは良いことだ。最近はプロダクションにもノリだけで書かれたコード(vibe-coded)が IR(インシデントレスポンス)業務でかなり目立つが、このような小規模プロジェクトでここまで整理されているのは印象的だ。
    • 人々は問題は「vibe coding」にあったと言うが、最低でも二つの問題――「テスト用 admin アカウントを残してしまうこと」と「トークンは検証したが、クロスチェックしないこと」――は、AI や vibe coding を使わなくても一般的に起こることだ。
    • スワスティカ形状の魚(「スワスティカフ」)のスクリーンショットがあればよかったのに、実際に見られなくて残念だ。
  • 誰かがセキュリティ脆弱性を悪用して、実際の攻撃を止めようとしたという点が本当に驚きだ。
    • こういうのは以前にもよくあった。ワーム/エクスプロイト自体が脆弱性を修正して塞ぐこともあった。
    • 数年前、FBI が EternalBlue エクスプロイトを封じるために似たような方法を取ったという記事を見たことがある(エクスプロイト名は正確でない可能性がある)。
    • 人間は本当に驚くべき存在だ。
  • vibe-coded の「S」は Security の略だ。
    • 「S」はヘビ……もしくは龍(たつ)の略なのかもしれない。
  • 全く新しいアイデアを思いつき、実際に作って、多くのことを学びながら、専門家らしく失敗した部分を恥じることができる人こそ本当のプロだ。もし 10 万ドルを失わず、ネットワークを壊さず、職を失わなければ、1 年後にはこれらを笑って思い出せるだろう。
  • 現在、そのサイトにはスワスティカ魚がアップされていて、誰かが魚の形に入れてフィルタを回避していた。問題の画像リンク、現在は削除済み。
    • 「Balls」と書かれた魚もあった。こちらで見ることができる。これは思ったより深刻な問題ではないと思う。
    • あの魚はまるで仏の手が入ったレベルだ。
  • 現在、認証なしでどの魚にも投票できる(分あたり最大20回/IP)。POST で次の API を使える。投票 API リンク {"fishId":"xxxx","vote":"up"}
    • 実際にそう設計した。ある魚は少しだけ好きで、ある魚は本当にたくさん好きになることもあるので、好き・嫌いを自由に表明できるようにした。
  • vibe-coded ウェブサイトのポストモーテムを残してくれて本当に良かった。多くの人が技術を真面目すぎる視点で見る中で、こうして軽やかで楽しく見る目線は新鮮で、小さなサイドプロジェクトとしてはとても興味深く、有意義だ。