何を見るチェックか
Webhook は、リポジトリで何かが起きたとき(push、Issue の作成など)に、 指定した URL へ通知を送る仕組みです。CI や通知サービスとの連携に使われます。
このとき、受け取る側は **「その通知が本当に GitHub から来たものか」**を確認する必要があります。 そのために使うのが Webhook の secret(秘密鍵)です。 GitHub は secret を使って署名を付け、受け取る側はそれを検証します。
Scorecard は、リポジトリに設定されている Webhook を一覧し、 それぞれに secret が設定されているかを調べます。
この項目は実験的な扱いで、既定では実行されません。 総合スコアにも含まれないことがあります。
点が低いと何を意味するか
点が低いということは、Webhook の受け取り側が、送信元を検証できない可能性がある、 という意味です。
secret が無い場合、通知の URL さえ分かれば、 誰でも GitHub を装ったリクエストを送れます。受け取り側が その内容を信じて何か処理をしていれば、それを外部から起動できることになります。
- デプロイを起動する Webhook なら、任意のタイミングでデプロイを走らせられる
- 通知を流す Webhook なら、偽の通知を送り込める
ただし、これは受け取り側のサービスの作りの問題でもあります。 Webhook の URL が推測できない、受け取り側が別の方法で検証している、 といった構成であれば、実害は限定されます。
誤解しやすい点
この項目は、ほとんどの場合そもそも評価されません。
理由は2つあります。
-
リポジトリの管理者権限が無いと、Webhook の一覧を読めません。 OpenSSF が週次で回している公開スキャンは、他人のリポジトリの管理者ではないので、 この情報を取得できません。結果として判定不能になります。
-
既定では実行されない実験的なチェックです。 Scorecard を自分のリポジトリに対して、管理者権限のトークンで 明示的に実行したときにだけ意味を持ちます。
したがって、公開されている Scorecard の結果でこの項目を見かけたら、 それは判定不能を表している可能性が高いと考えてください。 「Webhook の設定に問題がある」という指摘ではありません。
また、Webhook を1つも使っていないリポジトリでは、検査対象がありません。 GitHub Actions は Webhook を使わないので、 CI が Actions だけのプロジェクトには、そもそも関係の無い項目です。
採用する側が確認すべきこと
利用者の立場では、この項目を見る意味はほとんどありません。
Webhook はそのリポジトリの運用に関わる設定で、 配布されるコードにもリリース成果物にも影響しません。 判定不能であることが大半なので、判断材料にもなりません。
もし総合スコアの内訳にこの項目が並んでいたら、 「読み取れなかった項目」として扱ってください。
意味を持つのは、あなた自身が管理しているリポジトリに対して Scorecard を実行したときです。その場合は次の項に進んでください。
メンテナーなら何を改善できるか
自分のリポジトリであれば、確認と修正はすぐにできます。
Settings → Webhooksを開く- 各 Webhook の設定で
Secret欄が空になっていないかを確認する - 空なら、十分に長いランダムな文字列を設定する
- 受け取り側でも署名を検証する
4 が本体です。secret を設定しただけで受け取り側が検証していなければ、
何も変わりません。GitHub は X-Hub-Signature-256 ヘッダに
HMAC-SHA256 の署名を付けて送るので、受け取り側で同じ計算をして比べます。
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
$expected = 'sha256='.hash_hmac('sha256', file_get_contents('php://input'), $secret);
// ★hash_equals を使う。== で比べると比較時間から情報が漏れる
if (! hash_equals($expected, $signature)) {
http_response_code(401);
exit;
}
あわせて確認したいこと。
- 使っていない Webhook を消す。 過去の連携が残っていることがあります
- 受け取り先の URL を推測しにくいものにする
- secret を定期的に入れ替える
なお、GitHub Actions を使っている場合、Actions 自体は Webhook を必要としません。 外部 CI から Actions へ移行したなら、古い Webhook が残っていないか見てください。