Advisories¶
Advisories are how you tell end customers that a product they own is affected and what to do about it. They sit downstream of triage: an advisory is drafted only once a decision exists that the product is genuinely affected, and there is a fix, a mitigation, or a documented reason to inform without one.
This is a different duty from exploit reporting. Reporting goes to CSIRT and ENISA on a 24h/72h clock. Advisories go to customers, later, on your schedule.
Where it lives¶
| Page | Path |
|---|---|
| Advisory queue (org-wide) | /advisories |
| Advisory editor | /advisories/:advisoryId |
| Per-product advisories | /products/:productId/advisories |
| Public portal (unauthenticated) | /o/:orgSlug/advisories |
| ID scheme, public portal toggle, alert emails | /settings/notifications |
Advisory IDs¶
Every advisory gets a human-facing public ID that your organisation controls:
- Prefix: 2–16 characters, letters and digits, must start with a letter. Defaults to
ADV. - Year and month segments are each optional; turn them off for a flat
PSIRT-001scheme. - Sequence restarts per year/month bucket.
You can preview the next ID before committing, so it can be reserved or referenced in other systems. IDs are unique per organisation, not globally.
The lifecycle¶
Two orthogonal state axes. This trips people up, so it is worth stating plainly:
| Axis | Values | Question it answers |
|---|---|---|
status |
draft → sent |
Have we delivered this to recipients? |
is_published |
false / true | Is it visible on the public portal? |
An advisory can be published without ever being emailed, and emailed without being published.
Publishing increments the document version, rendered as 1.0, 2.0, … and recorded in the
revision history shown on the public page.
1. Draft¶
Create an advisory against a release, either from the queue or directly from a finding. Prefill populates the document from what alloy-it already knows: the release, its findings, affected components and versions, and available fixed versions.
2. Write the document¶
The advisory is a structured document, not a single text blob. Each section is markdown and maps onto the shape a CSAF consumer expects:
| Section | Purpose |
|---|---|
| Summary | What happened, in two sentences |
| Affected products | Which products and releases are in scope |
| Vulnerable products | The subset actually vulnerable |
| Not vulnerable | Explicitly out of scope, as valuable as the affected list |
| Details | Technical description |
| Workarounds | What to do before the fix lands |
| Fixed software | Where the patched version is |
| Exploitation | Known exploitation status |
| Source | Credit and references |
Alongside these, a CVE entries table carries per-CVE rows: CVE ID, CVSS score, severity, summary, affected component name and version, and fixed version.
Operational fields (separate from the document) are recommended version, apply by date, and guidance markdown.
3. Notify customers¶
Notification sends to your PSIRT alert addresses and, when customer notification is enabled, to the organisation's configured recipients (deduplicated against the alert list).
Customer notification is gated
The send is refused unless both hold:
- a recommended version is set, or delayed-inform is explicitly chosen, the documented case where you inform without a fix; and
- at least one linked finding resolves to an exploitable analysis state.
The second condition means an advisory cannot be sent on the strength of an untriaged scan result. If triage has not concluded the product is exploitable, there is nothing to tell a customer yet.
On success, status becomes sent and per-recipient delivery records are marked.
4. Publish to the public portal¶
Publishing makes the advisory readable at /o/:orgSlug/advisories/:publicId with no login.
Unpublish removes it again; the revision history keeps the record that a version existed.
The public portal¶
Off by default. Enable it with public advisories under Settings → PSIRT alerts.
While disabled, every public route for the organisation, including the logo, returns 404
rather than an "access denied" that would confirm the organisation exists.
| Route | Returns |
|---|---|
GET /api/v1/public/orgs/:slug/advisories |
Published advisory list |
GET /api/v1/public/orgs/:slug/advisories/:publicId |
One advisory |
GET /api/v1/public/orgs/:slug/advisories/:publicId/csaf |
CSAF JSON |
GET /api/v1/public/orgs/:slug/advisories/:publicId/pdf |
Rendered PDF |
GET /api/v1/public/orgs/:slug/logo |
Organisation logo |
All are unauthenticated, GET-only, and rate-limited per client IP: 60 requests/minute for
list, detail, CSAF, and logo; 10 requests/minute for PDF, which is CPU-heavy to generate.
Exceeding the budget returns 429 with Retry-After: 60.
Upload your logo under Settings → Organization profile; it brands the public page.
CSAF export¶
The CSAF document is generated from the structured sections above. This matters for two reasons: downstream consumers can ingest it automatically, and CRA Annex I Part II expects machine-readable vulnerability information rather than a PDF a human has to read.
A published portal with a CSAF feed is also what satisfies the disclosure policy and security contact item on the conformity checklist.
Practical sequence¶
- A scan produces findings on a release.
- Triage decides the component is exploitable in this product.
- A fix ships as a new release, or you decide to inform without one.
- Draft the advisory, prefill, write the sections, set recommended version and apply-by.
- Publish to the portal, notify customers, or both.
- If the document changes materially, publish again: the version increments and the revision history shows it.
Related¶
- Reporting (Article 14): the authority-facing notify path
- Triage: the gate an advisory depends on
- Conformity: the CVD policy checklist item this supports
- Dashboard tour