Skip to content

Curation and indicators

Mark malware as a false positive or confirm it in the console, what one decision changes for the package firewall and the CLI, and how to manage your organisation's own indicators.

Updated 02 Nov 2026Checked against vdb-site@1a06d67, website@ad775f3, saas@50cedf3, package-firewall@333285f, vdb-manager@1cb0079, cli@2449840, vdb-api@4145f0a

Malware verdicts come from the Vulnetix VDB pipeline and from your own malscan runs. Curation is how a person overrules them. It happens in the console, on two pages:

Page Use it to
Malware See the malicious packages in your dependencies, with the advisory and threat actor behind each, and record a decision from the finding.
Malware curation Configuration group. Tabs: Decisions (every decision, with change and retract), Indicators (your organisation’s own IOCs, and a read-only list of the ones your malscan runs found), Activity (the audit log).

Any signed-in member of the organisation can use both pages, on any plan including Community. Every query is scoped to your organisation.

Decisions

A decision is a verdict on one subject:

Verdict Meaning
false_positive This is not malware.
confirmed This is malware. Recorded for your organisation; it does not raise a verdict for others.

You can only decide on a subject your organisation has met. The API checks this before writing and returns 403 otherwise.

Subject Your organisation must have Effect of a false positive Reach
Package version Scanned the package (ecosystem and name) with the CLI Consensus fp_cleared Every customer
Indicator (type and value) Owned the IOC, or a malicious finding on the advisory it belongs to Consensus fp_cleared; the indicator is disabled Every customer
Threat actor A malicious finding on an advisory attributed to the actor One organisation: downgraded. Three: allowed Every customer, escalating
Advisory A malicious finding carrying the advisory id or alias Your findings and triage Your organisation
Finding The finding That finding’s triage Your organisation

A false positive also sets analysisState = not_affected on your organisation’s matching findings, so the next API or console read shows them resolved. A newer decision on the same subject replaces the older one; retracting a decision recomputes the consensus without it.

What reads the consensus

Consumer What changes
Package firewall Stops blocking an fp_cleared package version or indicator. An fp_cleared file hash is left out of its known-bad hash set. Downgraded and allowed threat actors are relaxed.
vulnetix malscan Before reporting, fetches the consensus from POST /v2/cli.malware-curation-get and drops findings and IOCs whose indicator is fp_cleared, printing N malware indicator(s) cleared by false-positive curation. Package-version decisions do not filter local findings; use an ignore rule for those. Offline runs skip this step.
VDB processors The AUR and OSM malware processors skip subjects the consensus has cleared when they mint advisories.

Your organisation’s indicators

The Indicators tab adds, edits and deletes IOCs your organisation tracks itself, stored as MalwareIoc rows with managedByOrg = true.

Field Values Limit
Type domain, url, ipv4, ipv6, file-hash, email, wallet, exfil-endpoint, install-command, package-name 64 characters; stored lower-case
Value The indicator 4,096 characters
Ecosystem Optional, e.g. npm 128 characters

Each new indicator gets an advisory id MAL-ORG-<uuid> and source vulnetix-org-ioc; an id you supply is ignored. Adding a type and value your organisation already has returns the existing row. Only indicators you created can be edited or deleted. The ones malscan found (source vulnetix-cli-malscan) are listed read-only.

Activity log

Every write is audited. Actions: fp_set, fp_confirm, fp_reason (a reason-only edit), fp_retract, ioc_add, ioc_edit, ioc_delete. The actor is recorded as the signed-in principal’s organisation email label, because the console token carries no member id. Times are Unix seconds.

API

The console calls these endpoints on the account API (https://www.vulnetix.com/api/site/v1) with your session. Bodies are JSON, at most 16 KiB.

Method and path Body or query Returns
POST /malware/fp subjectType (package_version, ioc, threat_actor, advisory, finding), verdict (false_positive, confirmed), the subject fields (ecosystem, packageName, packageVersion; iocType, iocValue; threatActorUuid; cveId; findingUuid), optional repositoryFullName, reason (at most 1,000 characters) 200 {"ok":true,"uuid":…}; 400 for a missing field; 403 when your organisation has not met the subject
GET /malware/curation Paginated {"entries":[…],"pagination":{…}}
POST /malware/curation/retract uuid 200 {"ok":true}; 404 active decision not found
GET /malware/curation/audit Optional action, subjectType filters {"entries":[…],"pagination":{…}}
GET /malware/iocs {"iocs":[…]}, newest first, at most 2,000
POST /malware/iocs iocType, value, optional ecosystem 200 {"uuid":…}, or {"uuid":…,"existing":true}
PATCH /malware/iocs/{uuid} Any of iocType, value, ecosystem 200 {"ok":true}; 404 if not yours
DELETE /malware/iocs/{uuid} 200 {"deleted":true}; 404 if not yours

An unauthenticated request gets 401.

Edit this pageSources: vdb-site/api/internal/handler/malware_curation.go, vdb-site/api/main.go, website/.repo/malware-curation.md, website/src/components/malware/MalwareIocManager.vue, website/src/pages/resolve/malware-curation.vue, saas/prisma/models/malware-actor.prisma, package-firewall/internal/curation/curation.go, package-firewall/internal/badhash/badhash.go, vdb-manager/scripts/go-processors/cmd/malscan-stix-processor/main.go, cli/cmd/malscan_curation.go, vdb-api/internal/handler/v2_cli_malware_curation.go
esc
↑ ↓ move↵ openSearches in your browser. A key like autonomy.max or a code like threshold_required jumps straight to it.