セキュリティ
最終更新日: 2026年06月13日
Miseru は、配信する画像とアカウント情報の安全性を重視しています。本ページは実装に基づくセキュリティ仕様を記載します。
インフラストラクチャ
Section titled “インフラストラクチャ”Miseru は Cloudflare のグローバルインフラ上で稼働しています。サーバーレス(Cloudflare Workers)で稼働するため、OS やミドルウェアの管理が不要で攻撃面を最小化しています。Cloudflare のコンプライアンス認証(SOC 2 Type II / ISO 27001 等)はインフラ層に適用されます。
| 対象 | 方式 |
|---|---|
| 保存時(At Rest) | Cloudflare による自動暗号化(R2 / D1 / KV) |
| 通信時(In Transit) | TLS(Cloudflare エッジ終端) |
| Upload Token | SHA-256 ハッシュで保存(平文は発行時に一度のみ表示し保持しない) |
認証・セッション管理
Section titled “認証・セッション管理”- ダッシュボードログイン: GitHub OAuth(GitHub App の user-to-server フロー)。
stateを短命の HttpOnly Cookie に紐付けてログイン CSRF を防止します。 - セッション: Cloudflare KV に 7 日間 TTL で保存。Cookie は
HttpOnly/Secure/SameSite=Lax。セッション ID は 256bit ランダム。 - Upload Token:
msr_プレフィックス + 256bit(64桁 HEX)。D1 には SHA-256 ハッシュのみを保存し、平文は発行直後に一度だけ表示します。失効・最終使用日時を管理します。 - 配信 URL の署名: 推測不能な 128bit ID +
kid付き HMAC-SHA256 署名 + 有効期限(exp)。検証はタイミングセーフ比較で行います。kid(鍵バージョン)により鍵ローテーション時も既存 URL を壊しません。
アプリケーションセキュリティ
Section titled “アプリケーションセキュリティ”- アップロードは Content-Type(PNG / JPEG / WebP のみ)とサイズ(5MB 未満)を検証します。
commit_sha(HEX 7〜40桁)・viewport(幅x高さ)・pr_number(正の整数)を形式検証します。- PR コメントに埋め込むユーザー入力(論理名・viewport)は markdown 構文を壊す文字を除去します(注入対策)。
| エンドポイント | リクエスト数 | ウィンドウ | キー |
|---|---|---|---|
アップロード(/v1/upload) | 120 回 | 60 秒 | プロジェクト |
Webhook セキュリティ
Section titled “Webhook セキュリティ”- GitHub Webhook を
X-Hub-Signature-256(HMAC-SHA256)で検証します。検証はタイミングセーフ比較で行います。
配信と秘匿性の限界
Section titled “配信と秘匿性の限界”本サービスは PR への画像表示を成立させるため、GitHub の画像プロキシ(Camo)を通す必要があり、配信 URL は認証なしで取得可能です。秘匿は「推測不能 ID + HMAC 署名 + 失効ポリシー」で担保しており、URL を知る者は閲覧できます(利用規約 §2)。これは設計上の仕様であり脆弱性ではありません。
セキュリティプラクティス
Section titled “セキュリティプラクティス”- すべてのコード変更にレビューサイクル(自動レビュー)を適用
- 依存パッケージの定期更新
- 最小権限の原則に基づくバインディング(各 Worker は必要なリソースのみをバインド)
脆弱性の報告
Section titled “脆弱性の報告”セキュリティ上の問題を発見された場合は、Issue には書かず、以下へご連絡ください。責任ある開示に感謝します。
- GitHub Security Advisories: Report a vulnerability(推奨)
- メール: security@miseru.dev(miseru.dev の Email Routing 設定後に有効)
深刻な脆弱性(認証バイパス・署名偽造・データ漏洩等)は優先対応し、48 時間以内(暦日)に初回返答します。