v2 で検出された CRITICAL 3件・HIGH 5件を含む15件の脆弱性のうち、
リリースブロッカーとなる10件はすべて修正済みです。
残る5件(MEDIUM 3件・LOW 2件)は運用に支障のない改善項目であり、
下記「残課題」を認識した上で、限定リリース(1店舗)は可能と判断します。
飲食店向け Instagram 自動投稿アプリ insta-auto について、 v2 資料で指摘された脆弱性の修正状況を報告し、リリース可否の最終判断をいただくための資料です。
| 項目 | 内容 |
|---|---|
| アプリ名 | insta-auto |
| 対象ユーザー | 飲食店オーナー・スタッフ(非エンジニア) |
| 主機能 | 料理写真アップ → AIキャプション+ハッシュタグ自動生成 → Instagram投稿 |
| 現在の状態 | 本番環境稼働中・セキュリティ修正適用済み・テスト投稿成功 |
| 本番URL | https://insta-auto.pages.dev/ |
| # | 修正内容 | 旧深刻度 | 修正方法 | 検証 |
|---|---|---|---|---|
| 1 | パスワードハッシュを PBKDF2 に変更 旧: HMAC-SHA256(ソルトなし・計算コストなし) |
CRITICAL | PBKDF2 / SHA-256 / 100,000 iterations / ランダムソルト16byte | OK |
| 2 | IGアクセストークンを AES-256-GCM で暗号化 旧: D1に平文保存 |
CRITICAL | AES-256-GCM / IV 12byte / 暗号化キーは Cloudflare Secrets | OK |
| 3 | .dev.vars の本番APIキーをプレースホルダーに置換 旧: 本番 Anthropic APIキーが平文記載 |
CRITICAL | プレースホルダー化済み。キーローテーション(手動)が残存 | 一部 |
| 4 | 認証なしエンドポイント /api/generate-direct を削除 旧: 誰でもAI APIを呼べた |
HIGH | エンドポイント・ルートファイル・フロント側分岐をすべて削除 | OK |
| 5 | Content-Type インジェクション対策 旧: ユーザー指定の mediaType をそのまま出力 |
HIGH | ホワイトリスト(jpeg/png/webp/gif)+ X-Content-Type-Options: nosniff | OK |
| 6 | 画像アップロードのマジックバイト検証追加 旧: file.type のみチェック(偽装可能) |
HIGH | JPEG/PNG/GIF/WebP のファイルヘッダ(マジックバイト)を検証 | OK |
| 7 | ログインのレート制限 旧: ブルートフォース対策なし |
HIGH | IP+storeId あたり5回/15分。KV で管理。6回目から 429 返却 | OK |
| 8 | SELECT * を必要カラムのみに変更 旧: password_hash も含めて全カラム取得 |
HIGH | 11カラムを明示指定(password_hash を除外) | OK |
| 9 | セキュリティヘッダー 4種追加 旧: ヘッダーなし |
MEDIUM | X-Content-Type-Options, X-Frame-Options, HSTS, Referrer-Policy | OK |
| 10 | CORS ワイルドカードサブドメイン許可を削除 旧: *.insta-auto.pages.dev を許可 |
MEDIUM | localhost:5173 と insta-auto.pages.dev のみ許可 | OK |
localStorage に保存。XSS があればトークン窃取のリスク。| 項目 | v2(修正前) | v3(修正後) |
|---|---|---|
| パスワードハッシュ | HMAC-SHA256(ソルトなし) | PBKDF2 / 100K iterations / ソルト付き |
| IGトークン保存 | D1に平文 | AES-256-GCM 暗号化 |
| 認証なしAIエンドポイント | /api/generate-direct が存在 | 削除済み(404) |
| ブルートフォース対策 | なし | IP+storeId 5回/15分 |
| Content-Type検証 | ユーザー入力をそのまま出力 | ホワイトリスト + マジックバイト検証 |
| セキュリティヘッダー | なし | 4種(nosniff, DENY, HSTS, Referrer) |
| CORSポリシー | *.insta-auto.pages.dev | 本番ドメインのみ |
| エラーメッセージ | 「店舗が見つかりません」/「パスワードが正しくありません」 | 統一(情報漏洩防止) |
| DBクエリ | SELECT *(password_hash含む) | 必要カラムのみ明示指定 |
| シークレット管理 | .dev.vars に本番キー | プレースホルダー化 + Cloudflare Secrets |
| 依存先 | 停止時の影響 | 復旧見込み |
|---|---|---|
| Cloudflare (Pages/Workers/D1/KV) | 全機能停止 | Cloudflare SLA 99.99% |
| Anthropic Claude API | AI生成のみ停止。手動投稿は可能 | Anthropic status page 参照 |
| Instagram Graph API | 投稿のみ停止。AI生成・プレビューは可能 | Meta status page 参照 |
| 項目 | 値 |
|---|---|
| 本番URL | https://insta-auto.pages.dev/ |
| API URL | https://insta-auto-api.yuya-takagi0520.workers.dev |
| D1 Database | insta-auto-db (c1639e6f-1bd0-4be1-8721-8c40cbd3b21b) |
| KV Namespace | TEMP_IMAGES (a8381fbb02d849f49034642957deda7a) |
| Metaアプリ | food-autov2 (App ID: 26224106680550189) |
| IGアカウント | @ramen_yakiniku_demo (ID: 17841441738205808) |
| IGトークン期限 | 2026-05-28 |
| Secrets登録済み | ANTHROPIC_API_KEY, JWT_SECRET, TOKEN_ENCRYPTION_KEY |