fix(corpus): advisory-pair repo-overlap -- remove real pilot leaks, skip vendored trees

test_no_pair_repeats_a_repository_the_benchmarks_already_name failed: advisory-fix
catalog repos also appeared elsewhere under benchmarks/. Root cause split two ways:

1. Genuine leak: 16 catalog repos are also subjects in benchmarks/search/private/
   pilot.json (a real private pilot population). Removed those 16 pairs from the
   three catalogs and their verification.json rows (totals recomputed, catalog ==
   verification preserved).
2. Spurious: the overlap scan greped ~49k vendored files under
   benchmarks/search/private/runs/*/checkout/node_modules/, so any catalog repo a
   vendored dependency's README names collided. Added a narrow vendored-tree skip
   (node_modules/vendor) to the scan rather than deleting labelled pairs over a
   dependency mention.

Implemented from Codex's first pass (gpt-6.1-sol), then gated and corrected: Codex
removed 20 pairs; 4 of those (backstage/backstage, koajs/koa, beaugunderson/
ip-address, cakephp/cakephp) were driven only by vendored/non-population mentions
and are kept. Also excluded advisory-fixes-spread.json (catalog-derived report)
and research-2026-09-26.md (selection write-up) as non-population.

tests/test_advisory_fix_pairs.py + tests/test_learn_labels.py: 53 passed.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
Marius Ciepluch
2026-10-12 15:22:55 +02:00
co-authored by Claude Opus 4.8
parent 60ffff0168
commit 9a3250f6c5
8 changed files with 23 additions and 646 deletions
@@ -139,38 +139,6 @@ mechanism = "source_reaches_sink"
family = "untrusted_destination"
evidence = "GHSA-28mg-98xm-q493: login redirects to next only when is_safe_redirect_url (same host, http/https) holds"
[[pair]]
name = "google-login-plugin-docommencelogin-532d714"
slice = "advisory-fixes"
language = "java"
framework = "jenkins"
origin = "github-advisory"
license = "Apache-2.0"
repo = "jenkinsci/google-login-plugin"
cve = "CVE-2022-46683 GHSA-v93c-cxj5-c398"
cwe = "CWE-601"
commit = "532d714943ff8ae8dc862427d39a4b78b7f6a375"
parent = "6b616f7709037a9bde1ee1646b18811a45e0b1fd"
commit_url = "https://github.com/jenkinsci/google-login-plugin/commit/532d714943ff8ae8dc862427d39a4b78b7f6a375"
vendored = false
host = "github"
path = "src/main/java/org/jenkinsci/plugins/googlelogin/GoogleOAuth2SecurityRealm.java"
mode = "name"
relpath = "src/main/java/org/jenkinsci/plugins/googlelogin/GoogleOAuth2SecurityRealm.java"
provenance = "human"
split = "train"
review_tier = "advisory"
fix_date = "2022-12-05"
[[pair.expected]]
cwe = "CWE-601"
class = "open_redirect"
path = "src/main/java/org/jenkinsci/plugins/googlelogin/GoogleOAuth2SecurityRealm.java"
function = "doCommenceLogin"
mechanism = "validation_strength"
family = "untrusted_destination"
evidence = "GHSA-v93c-cxj5-c398: doCommenceLogin used from/Referer only when Util.isSafeToRedirectTo was FALSE (inverted); fix routes through a correct safe-redirect check"
[[pair]]
name = "truelayer-dotnet-getpayment-75e436e"
slice = "advisory-fixes"
@@ -459,38 +427,6 @@ mechanism = "source_reaches_sink"
family = "untrusted_destination"
evidence = "GHSA-7j2f-6h2r-6cqc: createForEpisode refuses to Http::sink()->get() an episode enclosure URL unless Network::isSafeUrl (public host, http/https)"
[[pair]]
name = "authentication-getloginredirect-1c1e29c"
slice = "advisory-fixes"
language = "php"
framework = "cakephp"
origin = "github-advisory"
license = "MIT"
repo = "cakephp/authentication"
cve = "CVE-2026-55590 GHSA-hhpq-7wg4-36jm"
cwe = "CWE-601"
commit = "1c1e29c7e8129cfbcae74558316ecd3ea50a8273"
parent = "3f7cb4a7a0313139d5d3ce2bdd7854c19bae2491"
commit_url = "https://github.com/cakephp/authentication/commit/1c1e29c7e8129cfbcae74558316ecd3ea50a8273"
vendored = false
host = "github"
path = "src/AuthenticationService.php"
mode = "name"
relpath = "src/AuthenticationService.php"
provenance = "human"
split = "train"
review_tier = "advisory"
fix_date = "2026-06-24"
[[pair.expected]]
cwe = "CWE-601"
class = "open_redirect"
path = "src/AuthenticationService.php"
function = "getLoginRedirect"
mechanism = "validation_strength"
family = "untrusted_destination"
evidence = "GHSA-hhpq-7wg4-36jm: getLoginRedirect normalises backslashes to slashes and rejects values starting with // before the host/scheme check"
[[pair]]
name = "og-image-resolve-243cac2"
slice = "advisory-fixes"
@@ -1707,38 +1643,6 @@ mechanism = "source_reaches_sink"
family = "output_encoding"
evidence = "GHSA-gcr2-9v8m-gq45: addRotate XML-escapes the rotate option before interpolating it into the SVG transform attribute"
[[pair]]
name = "omnifaces-getupdatescript-c43eef0"
slice = "advisory-fixes"
language = "java"
framework = "jsf"
origin = "github-advisory"
license = "Apache-2.0"
repo = "omnifaces/omnifaces"
cve = "GHSA-fp43-vj7g-pg92"
cwe = "CWE-79"
commit = "c43eef01174a4dc09cec44eff553ff6284150af7"
parent = "6e43429276dc558887bfa5f6ae6e04d90983b951"
commit_url = "https://github.com/omnifaces/omnifaces/commit/c43eef01174a4dc09cec44eff553ff6284150af7"
vendored = false
host = "github"
path = "src/main/java/org/omnifaces/component/input/HashParam.java"
mode = "name"
relpath = "src/main/java/org/omnifaces/component/input/HashParam.java"
provenance = "human"
split = "train"
review_tier = "advisory"
fix_date = "2026-07-23"
[[pair.expected]]
cwe = "CWE-79"
class = "xss"
path = "src/main/java/org/omnifaces/component/input/HashParam.java"
function = "getUpdateScript"
mechanism = "source_reaches_sink"
family = "output_encoding"
evidence = "GHSA-fp43-vj7g-pg92: getUpdateScript JS-escapes the request-derived hash param name and value with escapeJS before formatting them into the ajax callback script"
[[pair]]
name = "tablib-export-book-b0ff39f"
slice = "advisory-fixes"
@@ -1771,38 +1675,6 @@ mechanism = "source_reaches_sink"
family = "output_encoding"
evidence = "GHSA-gqgw-jghv-mxwx: export_book stops interpolating the dataset title raw into the HTML heading and serialises it through an ElementTree element, which escapes it"
[[pair]]
name = "hono-resolvechildearly-2b8ed40"
slice = "advisory-fixes"
language = "typescript"
framework = "hono"
origin = "github-advisory"
license = "MIT"
repo = "honojs/hono"
cve = "CVE-2026-93981 GHSA-hxh3-vqpv-xpqv"
cwe = "CWE-79"
commit = "2b8ed402cdab6dfc5e829b480806dcd8db94161e"
parent = "cac0c4d3fe29aca4e426031067cbbb3b9131e30c"
commit_url = "https://github.com/honojs/hono/commit/2b8ed402cdab6dfc5e829b480806dcd8db94161e"
vendored = false
host = "github"
path = "src/jsx/components.ts"
mode = "name"
relpath = "src/jsx/components.ts"
provenance = "human"
split = "train"
review_tier = "advisory"
fix_date = "2026-09-04"
[[pair.expected]]
cwe = "CWE-79"
class = "xss"
path = "src/jsx/components.ts"
function = "resolveChildEarly"
mechanism = "source_reaches_sink"
family = "output_encoding"
evidence = "GHSA-hxh3-vqpv-xpqv: resolveChildEarly stops returning plain string children as already-escaped HTML and routes them through renderChildren, which escapes them"
[[pair]]
name = "serialize-to-js-deserialize-1cd4339"
slice = "advisory-fixes"
@@ -20,11 +20,6 @@
"ok": true,
"bytes_read": 2273
},
{
"name": "google-login-plugin-docommencelogin-532d714",
"ok": true,
"bytes_read": 2790
},
{
"name": "truelayer-dotnet-getpayment-75e436e",
"ok": true,
@@ -70,11 +65,6 @@
"ok": true,
"bytes_read": 1867
},
{
"name": "authentication-getloginredirect-1c1e29c",
"ok": true,
"bytes_read": 3975
},
{
"name": "og-image-resolve-243cac2",
"ok": true,
@@ -265,21 +255,11 @@
"ok": true,
"bytes_read": 1368
},
{
"name": "omnifaces-getupdatescript-c43eef0",
"ok": true,
"bytes_read": 1491
},
{
"name": "tablib-export-book-b0ff39f",
"ok": true,
"bytes_read": 1683
},
{
"name": "hono-resolvechildearly-2b8ed40",
"ok": true,
"bytes_read": 3041
},
{
"name": "serialize-to-js-deserialize-1cd4339",
"ok": true,
@@ -486,6 +466,6 @@
"bytes_read": 2462
}
],
"verified": 97,
"bytes_read": 367053
"verified": 93,
"bytes_read": 355756
}