GHSAセキュリティアドバイザリIDを誤検知リストに追加
GitHub Security Advisory(GHSA)識別子がコントリビューター名として誤認識される問題を修正しました。既存のCVE識別子パターンと同様の仕組みで、GHSAパターンをfalse positives(誤検知)リストに追加しています。
背景
rails-contributorsは、Railsのコミットメッセージからコントリビューターの名前を抽出するシステムですが、セキュリティ修正コミットに含まれるアドバイザリ識別子を名前として誤検知する問題がありました。これまでCVE識別子(例: CVE-2024-12345)については誤検知対策が施されていましたが、GitHub独自のセキュリティアドバイザリ形式であるGHSA識別子(例: GHSA-xxxx-yyyy-zzzz)は対象外でした。
最近のRailsのセキュリティ修正コミットにGHSA識別子が含まれていたことで、これらのIDがコントリビューター名としてクレジットページに表示される事態が発生しています。PR内のスクリーンショットは、GHSA識別子がコントリビューターとして一覧に現れている様子を示しています。
技術的な変更
app/models/names_manager/false_positives.rb の handle_false_positives メソッドに、GHSAパターンを検出する正規表現が1行追加されました。
変更前:
when /\ACVE-[\d-]+\z/i
when 'and'
変更後:
when /\ACVE-[\d-]+\z/i
when /\AGHSA-[\w-]+\z/i
when 'and'
追加されたパターン /\AGHSA-[\w-]+\z/i は、文字列の先頭から末尾まで GHSA- で始まり、その後に英数字・アンダースコア・ハイフンが続く形式にマッチします。CVEパターンが数字とハイフンのみを許容する [\d-]+ を使うのに対し、GHSAパターンは英数字も含む [\w-]+ を使用しており、GHSA-xxxx-yyyy-zzzz のような英数字混在のIDに対応しています。
テストファイル test/credits/false_positives_test.rb にも対応するテストケースが追加されました。コミット 4df8089 を対象に、コントリビューターが John Hawthorn 単独として認識されることを確認しています。
test 'GHSA-\w+' do
assert_contributor_names '4df8089', 'John Hawthorn'
end
設計判断
既存のCVEパターンと対称的な構造を踏襲することで、将来的な識別子形式の追加時にも見通しの良いコードになっています。
when 節の並びはCVEパターンの直後にGHSAパターンを配置しており、セキュリティ関連の識別子がグループとして読みやすくなっています。また、実際に問題が発生したコミットハッシュを使ったテストケースを追加することで、リグレッションを防ぐ設計になっています。
パターンマッチング方式による誤検知の除外は、コミットメッセージのパース処理に手を加えることなく、識別子の形式ごとにルールを追加できる拡張性の高いアプローチです。
まとめ
最小限の1行追加で、セキュリティアドバイザリIDがコントリビューターとして誤ってクレジットされる問題を解消しました。CVEとGHSAという2種類のセキュリティ識別子パターンが揃ったことで、今後のセキュリティ修正コミットに対しても正確なコントリビューター表示が維持されます。