Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マッチポンプ開発のすすめ 〜Claude Codeで作って、壊して、直す〜

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

マッチポンプ開発のすすめ 〜Claude Codeで作って、壊して、直す〜

AIで作ったアプリを、AIで壊して、AIで直す。
セキュリティの知識がなくても「壊す→直す」サイクルを開発フローに組み込むことで、セキュアなプロダクトに近づけていくという話。

なごやクラメソゆる勉強会 #1 LT資料

Avatar for CM_石井悠汰

CM_石井悠汰

March 26, 2026
Tweet

Other Decks in Education

Transcript

  1. 石井 悠汰(Ishii Yuta) 経歴 福岡出身 / 高専(情報系)卒 前職:生産管理システム開発 Spring Boot(API)×

    React(UI)× Docker 2025年11月: クラスメソッドにジョイン TypeScript / HonoでAPI開発 趣味:飲み会、美味しいもの探し、ドライブ、旅行 現在の目標:AWS全冠(残り1つ — ANS) 自己紹介
  2. 通常: 作る → テスト → Review → Merge 今日の話: 作る

    → テスト → 壊す → 直す → Review → Merge 壊す → 直す を挟むだけ。これもAIにやってもらう セキュリティの知識がなくてもサイクルを回すことで セキュアなプロダクトに近づけていくという考え方です マッチポンプ開発とは 作る Create 壊す Break 直す Fix 7
  3. 1. Step 0: 作る — AIに丸投げでアプリを作成 2. Step 1: 壊す(1回目)

    — セキュリティレビューで脆弱性を洗い出す 3. Step 2: 直す(1回目) — 見つかった脆弱性を修正 4. Step 3: 壊す(2回目) — 修正後に再調査 5. Step 4: 直す(2回目) — 残存・新規の脆弱性を修正 すべてAI(Claude Code)で実施 今回の検証の流れ 9
  4. 経費一覧APIを叩くだけで、レスポンスにパスワードハッシュが含まれている { "submitter": { "name": "田中太郎", "password": "$2a$10$xxxxx..." ← bcryptハッシュが丸見え

    } } 問題は2つ: 1. APIレスポンスにパスワードハッシュが含まれていること 2. パスワードが password123 と脆弱なこと この組み合わせにより、辞書攻撃で数秒で解読されてしまう → 本来は select で返却フィールドを明示し、 password を除外すべき 脆弱性①:パスワードハッシュが丸見え 14
  5. ① IDOR で他人の経費を取得 ② レスポンスからパスワードハッシュを入手 ③ password123 → 数秒で解読 ④

    他人のアカウントでログイン ⑤ APPROVERなら全経費の承認・却下が可能 1つ1つは「よくある脆弱性」でも、連鎖すると致命的になる → 個別の修正だけでなく、連鎖を断ち切る視点が重要 脆弱性の連鎖:アカウント乗っ取りまで到達 16
  6. 先ほど見つけた脆弱性を全て修正してください。 修正内容と、なぜその修正が必要なのかをマークダウンファイルに出力してください。 → 14件中10件が修正 パスワードハッシュ漏洩 → select でフィールド除外 IDOR →

    所有権チェック追加 JWT有効期限 → 8時間に設定 金額上限 → 1,000万円に制限 残り4件は「設計判断が必要」とAIが判断して残した 領収書の公開アクセス → フロントへの影響大、設計見直しが必要 NEXTAUTH_SECRET → 運用(環境変数)で対応すべき問題 レートリミット → ミドルウェアや外部サービスの導入が必要 監査ログ → ログ基盤の設計・DBスキーマ変更が必要 Step 2: 直す(1回目) 17
  7. 修正後のコードを改めて読んで、まだ残っている脆弱性や 新たに気になる点があれば列挙してください。 → 前回未修正の残存5件 + 新たに9件 = 計14件 承認者に下書きが見える問題、一覧APIは直したが詳細APIが漏れていた title

    / description などフィールド長の上限なし(数MBの文字列送り放題) CSRF対策・セキュリティヘッダーが未設定 1回の修正で完璧にはならない。だからサイクルを回す意味がある Step 3: 壊す(2回目) 18
  8. SECURITY_REPORT_2.mdに記載された脆弱性をすべて修正してください → 14件中13件が修正完了 領収書の公開アクセス → 認証付きプロキシエンドポイントを新設 レートリミット → ログイン15分10回 /

    API 1分60回 監査ログ → ログイン・承認・却下などを記録 CSRF対策・セキュリティヘッダーも追加 1回目で残した設計判断が必要な4件中3件もここで解消 唯一の未修正:next-authがベータ版 Step 4: 直す(2回目) 19
  9. 14件 7件 0件 14件 壊す① 10件修正 残4件 直す① 残5件 +新9件

    14件 壊す② 13件修正 残1件 直す② 発⾒された脆弱性 修正済み 1回の修正で完璧にはならない。だからサイクルを回す意味がある サイクルの成果 20
  10. 作る Create 壊す Break 直す Fix 機能A 機能B 機能C 時間

    作る Create 壊す Break 直す Fix 作る Create 壊す Break 直す Fix 機能単位で小さく回す。日々の開発に組み込む 実践での回し方① — 日常サイクル 21
  11. 通常開発 基盤強化 機能A 作る → 壊す → 直す 機能B 作る

    → 壊す → 直す 機能C 作る → 壊す → 直す 「壊す」で発⾒ 壊すフェーズで発⾒した 横断的な課題はバックログに積む ・セキュリティヘッダー未設定 ・レートリミットなし ・監査ログなし ・CSRF 対策なし スプリント対応 まとめて壊す → 直す 基盤的な課題を ⼀括で修正 強化後に 通常開発に復帰 時間 「壊す」で発⾒ 放置するほど影響範囲が広がって直しづらくなる 逐一チェックして、直せるうちに直す 実践での回し方② — スプリントサイクル 22