Skip to content

Commit b5fd950

Browse files
tatianabTatiana Bradley
authored andcommitted
internal/worker: prevent duplicates for GHSAs
This is a quick fix to prevent the worker from filing issues for duplicate GHSAs. The check for duplicates should eventually be moved to the triage stage. For golang/go#54049 Change-Id: I902c64f032fc66c15b7fe62787ecb0520e446216 Reviewed-on: https://go-review.googlesource.com/c/vulndb/+/461237 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Damien Neil <dneil@google.com> Reviewed-by: Tatiana Bradley <tatiana@golang.org> Run-TryBot: Tatiana Bradley <tatiana@golang.org>
1 parent 84266dd commit b5fd950

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

internal/worker/worker.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,24 @@ func createGHSAIssues(ctx context.Context, st store.Store, client *issues.Client
365365
if limit > 0 && numCreated >= limit {
366366
break
367367
}
368+
// TODO(https://github.com/golang/go/issues/54049): Move this
369+
// check to the triage step of the worker.
370+
if isDuplicate(ctx, gr.GHSA, allReports) {
371+
// Update the GHSARecord in the DB to reflect that the GHSA
372+
// already has an advisory.
373+
if err = st.RunTransaction(ctx, func(ctx context.Context, tx store.Transaction) error {
374+
r, err := tx.GetGHSARecord(gr.GetID())
375+
if err != nil {
376+
return err
377+
}
378+
r.TriageState = store.TriageStateHasVuln
379+
return tx.SetGHSARecord(r)
380+
}); err != nil {
381+
return err
382+
}
383+
// Do not create an issue.
384+
continue
385+
}
368386
ref, err := createIssue(ctx, gr, client, allReports)
369387
if err != nil {
370388
return err
@@ -389,6 +407,16 @@ func createGHSAIssues(ctx context.Context, st store.Store, client *issues.Client
389407
return nil
390408
}
391409

410+
func isDuplicate(ctx context.Context, sa *ghsa.SecurityAdvisory, allReports map[string]*report.Report) bool {
411+
r := report.GHSAToReport(sa, "")
412+
for _, aliases := range report.XRef(r, allReports) {
413+
if slices.Contains(aliases, sa.ID) {
414+
return true
415+
}
416+
}
417+
return false
418+
}
419+
392420
func CreateGHSABody(sa *ghsa.SecurityAdvisory, allReports map[string]*report.Report) (body string, err error) {
393421
r := report.GHSAToReport(sa, "")
394422
rs, err := r.ToString()

internal/worker/worker_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,20 @@ func TestCreateIssues(t *testing.T) {
175175
},
176176
TriageState: store.TriageStateAlias,
177177
},
178+
{
179+
GHSA: &ghsa.SecurityAdvisory{
180+
ID: "g5",
181+
Vulns: []*ghsa.Vuln{{Package: "p1"}},
182+
Identifiers: []ghsa.Identifier{{Type: "GHSA", Value: "g5"}},
183+
},
184+
TriageState: store.TriageStateNeedsIssue,
185+
},
178186
}
179187
createGHSARecords(t, mstore, grs)
180188

181-
if err := CreateIssues(ctx, mstore, ic, map[string]*report.Report{}, 0); err != nil {
189+
// Add an existing report with GHSA "g5".
190+
allReports := map[string]*report.Report{"data/reports/GO-1999-0001": {GHSAs: []string{"g5"}}}
191+
if err := CreateIssues(ctx, mstore, ic, allReports, 0); err != nil {
182192
t.Fatal(err)
183193
}
184194

@@ -209,6 +219,9 @@ func TestCreateIssues(t *testing.T) {
209219
wantGHSARecs[0].TriageState = store.TriageStateIssueCreated
210220
wantGHSARecs[0].IssueReference = "https://github.com/test-owner/test-repo/issues/1"
211221

222+
// A report already exists for GHSA "g5".
223+
wantGHSARecs[4].TriageState = store.TriageStateHasVuln
224+
212225
gotGHSARecs := getGHSARecordsSorted(t, mstore)
213226
fmt.Printf("%+v\n", gotGHSARecs[0])
214227
if diff := cmp.Diff(wantGHSARecs, gotGHSARecs,

0 commit comments

Comments
 (0)