Nozomi Networks PSIRT RSS Processor — Design

Overview

Fetches Nozomi Networks PSIRT security advisories from the public RSS 2.0 feed (https://security.nozominetworks.com/rss.xml) and creates first-class CVEMetadata rows (source=nozomi) for every advisory. The feed contains ICS/OT security bulletins for Nozomi Networks products (Guardian, CMC, Arc, Vantage, N2OS).

Feed

PropertyValue
URLhttps://security.nozominetworks.com/rss.xml
AuthNone — fully public
FormatRSS 2.0 with dc, content, atom namespaces
Items~20–50 advisories
GeneratorNozomiNetworksRSS

Parsing

FieldSource
Advisory ID<title> (e.g. NN-2025:16-01) — validated against ^NN-\d{4}:\d+-\d+$
Advisory URL<link> (e.g. https://security.nozominetworks.com/NN-2025:16-01)
Description<description> CDATA text
ProductBest-effort extraction from description: Guardian, CMC, Arc, Vantage, N2OS
Published<pubDate> parsed as RFC 2822 → Unix seconds
Content HashSHA1 of `title

Storage

No new tables or columns. All tables already exist.

TableRows inserted
CVEMetadataOne per advisory; source="nozomi", cveId = advisory ID (e.g. NN-2025:16-01)
CVEDescriptionOne per advisory; containerType="nozomi", lang="en"
CVEMetadataReferencesOne per advisory; type="advisory", referenceSource="nozomi"
CVEAffectedOne per advisory (when product is detected); vendor="Nozomi Networks"

Incremental Strategy

On startup, load all sourceAdvisoryRef values from CVEMetadata where source='nozomi' into a map[string]bool. Per advisory: if the advisory ID is in the set and --force is false, skip. After successful processing, add the advisory ID to the in-memory set.

Flags

FlagDefaultDescription
--forcefalseReprocess all advisories, not just new ones
--limit0Maximum advisories to process per run (0 = unlimited)

ECS Schedule

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

Key Files

FilePurpose
cmd/nozomi-rss-processor/main.goMain processor
internal/nozomi/types.goRSS XML structs and Advisory type
internal/nozomi/parser.goFeed parsing and product extraction
internal/nozomi/mapper.goAdvisory → CVESourceData mapping
schemas/nozomi_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: nozomi/files/{sha256}/{filename}
  • Quarantine: failed-feeds/nozomi-rss-processor/{YYYY-MM-DD}/{reason}/{filename}
  • Likely reasons: parse-error