更新日:2026年8月17日

3分で読めます

GitLabはリファクタリングと再フォーマットを越えて脆弱性をどう追跡するのか

改良版のScope+Offsetフィンガープリントにより、コメントの追加や空行の挿入、ファイルの再フォーマットが行われても脆弱性の追跡は途切れません。GitLabの新しい正規化手法と、その評価結果を解説します。

セキュリティスキャンには、日々同じ問題がつきまといます。エージェントやデベロッパーがコメントを1行足す、ファイルを再フォーマットする、関数を別の場所へ移す。たったそれだけで、単純な脆弱性トラッカーは同じ検出結果を二重に報告してしまいます。セキュリティチームは、一度却下したはずの問題を再びトリアージする羽目に。無駄な監査工数が積み上がり、スキャン結果への信頼も損なわれていきます。

GitLabは2022年、このコードの変動性(code volatility)という課題に正面から取り組むため、高度な脆弱性追跡機能を導入しました。その基盤にあるのがScope+Offsetフィンガープリント方式です。検出結果をファイル名と行番号で識別するのではなく、その検出結果を囲む最も内側のスコープ(モジュール、クラス、関数)と、スコープ内での行オフセットで識別する。この方式なら、コードがファイル内を移動しても追跡は途切れません。行ベースの追跡と比べ、無駄な再監査は約30%削減されました。

ただし、それでも取りこぼされる編集が1種類だけ残っていました。機能に影響しない変更です。オフセットは、スコープの境界から検出結果までのすべての行を、コメントも空行も含めて数える。脆弱性のある文の上にコメントを1行加えるだけでオフセットはずれ、トラッカーには「新しい」脆弱性として映ります。しかし利用者にとっては、単なる重複でしかありません。

改良版の手法では、フィンガープリントを計算する際に、機能に影響しないコード(コメントと空行)を単純に無視します。これらの行はプログラムの挙動を変えません。であれば、脆弱性の同一性を左右する理由もないはず。この正規化により、コメントを追加してもファイルを再フォーマットしてもフィンガープリントは変わらなくなりました。追跡の精度は従来どおりのまま。手法の詳細は、本記事と併せて公開している研究論文で解説しています。

正規化した手法の評価には、目的に特化したベンチマークを用いました。対象は、C/C++、C#、Go、Java、JavaScript、Python、Rubyにまたがる439本のソースファイル。既知の脆弱性の直前にコメントまたは空行を1行だけ挿入するコミットを2,247件生成し、履歴を再生しながらコードをスキャンしました。すべてのコミットが検出結果のすぐ隣で行われる非機能的な編集という、意図的に最悪のケースを突いた設計です。

このベンチマークにおいて、従来のScope+Offset方式は1,361件の重複フィンガープリントを蓄積し、ベースラインからの増加率は77%に達しました。一方、正規化した手法では重複はゼロ。固有フィンガープリントの数も全体で43%減少しています。

正規化Scope+Offsetは、scope_offset_compressedトラッキングアルゴリズムとしてGitLabに搭載されています。対応言語はC#、C/C++、Go、Java、JavaScript、Python、Ruby、PHP。スキャナーがすでに構築している構文解析木を再利用するため、スキャン時間への影響はありません。セキュリティレポートの形式も変更されていないため、複数のSASTツールを組み合わせた混在環境にもそのまま組み込めます。

本研究「Vulnerability Tracking using Normalized Scope+Offset」(著者:Julian Thome、Hua Yan、Lucas Charles、Craig Smith、Jason Leasure)のプレプリントは、ASE 2026 Industry Showcaseで発表される予定です。

本記事および本研究には、Hua Yan氏、Lucas Charles氏、Craig Smith氏、Jason Leasure氏が貢献しました。

ご意見をお寄せください

このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。

フィードバックを共有する

今すぐ開発をスピードアップ

DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。