Gentoo Bugzilla Security RSS Processor — Design

Overview

Fetches security vulnerability reports from the Gentoo Bugzilla Atom feed and creates first-class CVEMetadata rows (source=gentoo) with minted GENTOO-YYYY-{bugID} identifiers where {bugID} is the Gentoo Bugzilla bug number.

Only bugs with Product: Gentoo Security and Component: Vulnerabilities are processed — all other Bugzilla entries (build failures, feature requests, etc.) are skipped.

CVE IDs found in bug titles are extracted and stored as GcveAlias and CVEAlias records linking them to the minted GENTOO identifier.

Feeds

PropertyDaily FeedBackfill Feed
URLhttps://bugs.gentoo.org/buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=1d&ctype=atomhttps://bugs.gentoo.org/buglist.cgi?chfieldfrom=9999d&ctype=atom
AuthNone — fully publicNone — fully public
FormatAtom 1.0Atom 1.0
ScopeBugs created in last 24 hoursAll bugs ever created
UseECS daily scheduled taskLocal backfill via --backfill flag

Parsing

FieldSource
Bug IDExtracted from <link> URL parameter id=NNNNNN
Bug URL<link> href attribute (fallback: <id>)
Title<title> — e.g., [Bug 971278] dev-python/pyasn1-0.6.3: stack overflow
Package AtomRegex on title: category/package (e.g., dev-python/pyasn1)
Package VersionRegex on title: version after package name (e.g., 0.6.3)
ProductHTML <summary> table → Product row (must be “Gentoo Security”)
ComponentHTML <summary> table → Component row (must be “Vulnerabilities”)
StatusHTML <summary> table → Status row
ResolutionHTML <summary> table → Resolution row
Priority/SeverityHTML <summary> table → respective rows
AssignedToHTML <summary> table → AssignedToName row
ReportedByHTML <summary> table → ReportedByName row
Author<author><name> element
CVE IDsAll CVE-\d{4}-\d{4,} matches in title, deduped (usually empty)
Creation DateHTML <summary> table → Creation date row, with fallback to <updated>
Updated<updated> ISO 8601 timestamp
Content HashSHA1(id|updated|summary)

ID Generation

Each bug is assigned a GENTOO-{year}-{bugID} identifier:

  1. Extract bug ID from URL (e.g., 971278)
  2. Extract year from the creation date timestamp
  3. Build cveId: GENTOO-{year}-{bugID} (e.g., GENTOO-2026-971278)
  4. Build gcveId: GCVE-110-GENTOO-{year}-{bugID}
  5. Store GcveIssuance with sequenceNumber = bugID (integer)
  6. Link bug ID and any extracted CVE IDs as GcveAlias records

No sequence counter needed — bug IDs are deterministic from the feed.

Storage

No new tables or columns. All tables already exist.

TableRows inserted
CVEMetadataOne per security bug; source="gentoo", cveId="GENTOO-YYYY-{bugID}"
CVEDescriptionOne per bug; containerType="cna", lang="en"
CVEMetadataReferencesOne per bug; type="issue", referenceSource="gentoo"
CVEAffectedOne per bug (when package atom is extractable); vendor="Gentoo", product=packageAtom
GcveIssuanceOne per bug; gcveId="GCVE-110-GENTOO-YYYY-{bugID}"
GcveAliasBug ID + each extracted CVE ID linked to GCVE ID
CVEAliasExtracted CVE IDs linked to GENTOO identifier

Incremental Strategy

On startup, load all sourceAdvisoryRef values from CVEMetadata where source='gentoo' into a map[string]bool. Per bug: if the URL is in the set and --all is false, skip.

Flags

FlagDefaultDescription
--allfalseReprocess all bugs, not just new ones
--limit0Maximum bugs to process per run (0 = unlimited)
--backfillfalseUse backfill feed URL (all bugs) instead of daily feed

ECS Schedule

Runs weekly on Saturdays at 07:00 UTC (cron(0 7 ? * SAT *)).

Key Files

FilePurpose
cmd/gentoo-rss-processor/main.goMain processor
internal/gentoo/types.goAtom feed and advisory Go structs
internal/gentoo/parser.goFeed parsing, HTML table extraction, CVE extraction
internal/gentoo/mapper.goAdvisory → CVESourceData mapping
schemas/gentoo_rss_advisory.schema.jsonJSON Schema Draft 7 for parsed advisory object

S3 Persistence

Not used. This processor does not currently archive payloads or quarantine failures to S3. Per the S3 Persistence Contract this is non-compliant — see the compliance matrix for the implementation roadmap.

Expected paths when implemented:

  • Archive: gentoo/files/{sha256}/{filename}
  • Quarantine: failed-feeds/gentoo-processor/{YYYY-MM-DD}/{reason}/{filename}
  • Likely reasons: parse-error