セキュリティ
Pointsman は、ほかのシステムが送るケースを判定します。ケースは、組織の外の人が書いたものであることも少なくありません。このページでは、Pointsman が守るものと守らないものをまとめます。詳しい分析は脅威モデル(英語)にあります。
API トークン
Section titled “API トークン”- HTTP API(
/v1/)と MCP へのリクエストには、どれもトークン(MCP では GitHub でのサインインでもよい)が必要です。有効なものがなければ 401 が返り、ほかには何も起きません。サインインのページそのものは、意図して公開しています。内部呼び出しにはトークンは要りません。 - トークンは、作ったときに指定したプロファイルにだけ使えます(すべてのプロファイル用に
--profiles '*'で作った場合を除きます)。それ以外のプロファイルは、その判定やレビューも含めて、存在しないものとして扱われます。 - 保存するのは、各トークンの SHA-256 ハッシュだけです。トークンそのものは、作ったときに 1 回だけ表示します。
- トークンには期限を付けられます。
--expiresを付けないトークンは、取り消すまで使えます。取り消しがすべての場所に届くまで、最大で 60 秒ほどかかります。 - テスト用トークンは判定とプロファイルの一覧しかできず、その判定は記録されず、レビューの待ち行列にも入りません。トークンの入れ替え方は Pointsman をデプロイするにあります。
MCP を使う人
Section titled “MCP を使う人”人は GitHub でサインインします。入れるのは、デプロイが許可した GitHub の組織のメンバーだけです。組織に属しているかはサインインのときに確かめるため、組織を離れた人も、サインインが切れるまで(最大 7 日間)使えます。サインインした人は、MCP で公開されているプロファイルをすべて使えます。GitHub のトークンは、ログイン名と組織への所属を読むためだけに使い、保存しません。
内部呼び出し
Section titled “内部呼び出し”GitHub のコネクターは、同じ Cloudflare アカウントの中で、トークンなしでエンジンを呼び出せます。そのアカウントでエンジンへのバインディングを持つ Worker は、どれも決まった 1 つのクライアントとして、決まったプロファイルだけを、期限なしで判定します。つまり、そのアカウントにコードをデプロイできる人なら誰でもこの呼び出しを使えます。この権限は、エンジンを運用する人だけに与えてください。
外部の人が書いた入力
Section titled “外部の人が書いた入力”ケースの文章は送った人が書いたもので、AI を誘導しようとすることがあります。Pointsman は、これを防げるとは主張しません。プロファイルを書く人は、AI の回答を判定を厳しくする方向にだけ使い、満たすべき条件はファクトで確かめるようにしてください(理由)。Pointsman がこれを強制するわけではありません。AI の回答だけで承認するプロファイルでは、プルリクエストの作成者がその承認を誘導できます。Pointsman は、リクエストの内容を形式以外では確かめません。プロファイルの入力の対応づけはフィールドを選ぶだけで、その中身は検証しません。
ファクトと外部のサービス
Section titled “ファクトと外部のサービス”- ファクトは調べるもので、推測しません。読めなかったファクトは「欠けた」ものになります。
- ファクトの正しさは、その出どころと同じです。国土地理院と OpenStreetMap のデータ、GitHub がプルリクエストについて返す内容、npm の依存関係の更新では registry.npmjs.org の公開日時(トークンなしで読みます)です。
- GitHub のファクトは、デプロイの認証情報で、必要なものだけを読み取り専用で読みます。トークンはログに残しません。
- 判定ログを読むファクトが見られるのは、問い合わせたクライアント自身の判定だけです。
ファクトによる承認
Section titled “ファクトによる承認”デプロイで GitHub のコネクターに承認を許すと、プロファイルは人が見ないまま、ファクトだけでプルリクエストを承認できます。そのため、ファクトが誤っていれば(たとえば元のデータが誤っていれば)、実際に使っているリポジトリのプルリクエストが承認されることがあります。その承認だけでマージできるかは、リポジトリの持ち主が決めるルールセットによります。Pointsman でプルリクエストをレビューするを参照してください。
レビューの最終結果を送るコールバックには署名を付け、コネクターは GitHub から届くすべての Webhook の署名を確かめます。
記録するもの
Section titled “記録するもの”判定ログに何が残るかは、判定ログで説明しています。リクエストは単純な SHA-256 ハッシュで残すため、同じリクエストからは同じハッシュになります。ログが示すのは、エンジンが何を受け取り何をしたかで、リクエストの内容が正しかったことではありません。ログには署名もハッシュの連鎖もないため、デプロイを運用する人は書き換えられます。レビューを決めた人(by)は、クライアントが送る名前で、確かめていません。
約束しないこと
Section titled “約束しないこと”Pointsman は、AI の回答が正しいこと、クライアントごとのリクエスト数の制限、コールバックの送り先の許可リスト(プライベートなアドレスへは送りません)、コールバックがちょうど 1 回だけ届くことを約束しません。脅威モデルに、それぞれの理由とともに挙げています。
問題を報告する
Section titled “問題を報告する”セキュリティの問題は、公開の Issue には書かないでください。報告の方法はセキュリティポリシー(英語)にあります。