脆弱性の詳細を公開Issueへ投稿しないでください。GitHubの Private vulnerability reporting から、再現方法、影響、確認した環境、可能であれば修正案を報告してください。
非公開報告画面を利用できない場合は、詳細を含めずにIssueを作成し、非公開で連絡できる方法を確認してください。認証トークン、個人情報、実在する利用者のAIコードを添付しないでください。
囲みコードでは、次をセキュリティ上の重要な境界として扱います。
- デスクトップ画面と
127.0.0.1のローカルAPI versions/と、それ以外のファイルシステム- 親アプリと、対戦AI・Codex・Claude Code・OpenCodeの子プロセス
.envの認証情報と画面・ログ・スクリーンショット- 囲みマスAPIおよびクライアント参照ソースへのネットワーク接続
- ローカルAPIはループバックだけで待ち受け、Host、Origin、起動ごとのAPIトークンを検証します。
- APIの状態変更はJSONのPOSTだけで受け付けます。
- APIのJSON本文は読み込み中も12 MiBを上限とします。
versions/ルートを含む実パスとファイル種別を検証し、symlinkではない直下の管理対象だけへ バージョン操作を制限します。- 対戦AIは別プロセスで、読み取り、ネットワーク、環境変数の権限を限定して実行します。
- 対戦AIは隔離した一時フォルダーのコピーを実行し、静的module graphのローカルパスと通信先を検証します。
- 対戦前の依存取得はコードを実行しない
deno infoとdeno cacheで行い、npmを無効化して接続先をjsr.ioとraw.githubusercontent.comに限定します。 - 内蔵ブラウザを開くときは
https://kakomimasu.com/gameの対戦URLだけを開始URLとして許可し、iframeをsandbox化します。 - 対戦AIを
deno run -Aで実行しません。 - コーディングAIは一時作業フォルダで動かし、正常終了した通常ファイルの
main.tsだけを選択中の版へ反映します。Webアクセスを無効化し、親環境をそのまま継承せず、対戦用トークンを 子プロセスへ渡しません。 - OpenCodeの変更は、アプリ側の型チェック前にも静的module graphを検証します。npmを無効化し、
import先を
jsr.ioとraw.githubusercontent.comに限定します。 - コーディングAIの停止は参照取得と型チェックにも適用し、CLIが起動した子孫プロセスもまとめて終了します。
- 外部プロセス出力、生成された
main.ts、チャット履歴は、全文をメモリへ読み込む前にもサイズを制限します。 - 静的画面ファイルはURLと実パスの両方を検証し、
dist/外のファイルやsymlink先を配信しません。 .env、versions/、ビルド成果物はGitの追跡対象外です。
開発用の e2e:install と test:e2e は、PlaywrightがLinuxの /proc を参照するため --allow-all
で実行します。信頼できるテストコード・依存関係を前提にした開発用の例外です。
E2Eは一時フォルダーを使い、対戦AIやコーディングAIを起動しません。本番の子プロセスの権限制限には適用しません。
BEARER_TOKENなどの値は.envに保存し、コミットしないでください。- ログ、Issue、チャット、スクリーンショットへトークンを貼らないでください。
- 誤って公開したトークンはファイルから消すだけでなく、発行元で直ちに失効・再発行してください。
次を変更する場合は、通常の動作確認に加えて回帰テストを追加してください。
- ローカルAPIのホスト、Origin、認証
- ファイルパスの検証、名前変更、削除
- 子プロセスへ渡す権限、環境変数、通信先
- Codex / Claude Code / OpenCodeのサンドボックスや許可ツール
- ログ、履歴、リクエスト本文のサイズ上限
設計上の詳細は docs/architecture.md を参照してください。