You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Every Intigriti program ended up with Handle="detail" because fetchITPrograms parsed
webLinks.detail (".../programs/<company>/<handle>/detail") with a plain LastIndex("/")
and grabbed the literal trailing path segment. So programScopeCacheKey("it", "detail")
returned "it:detail" for ALL IT programs — they shared one program_assets row, each
sweep overwrote the prior program's assets, and the next program's full asset set
read as "new". Endless alert flood (NVIDIA: 11 new, Salto: 14 new, repeat).
Fixes:
- programs_api.go fetchITPrograms: strip a trailing "/detail" before extracting the
last segment. Unit-tested: nvidiapublicbugbounty/detail -> "nvidiapublicbugbounty"
(was "detail"), trailing-slash + legacy "=" form both pass.
- program_monitor.go: programMonitorKey(p) prefers platform:id:<UUID> when p.ID is
set (defense in depth — any future handle-parsing bug can't collide programs).
- program_monitor.go: safety cap — if newAssets >= 20 OR equals the full asset set,
log a warning and silently re-baseline instead of alerting. Real scope additions
are 1-5 assets at a time; a huge delta almost always means a key collision.
- app.go boot: one-shot cleanup deletes program_assets WHERE program_key='it:detail'
(the poisoned bucket). H1/BC programs re-baseline silently under their new ID keys.
Reviewed: no runtime bugs across parser correctness, key-transition, cap, cleanup
safety, DB impls, concurrency.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
0 commit comments