Writing a policy¶
A policy is the project's own statement of what it will act on. Verdis reads it, cites it, and quotes it back to reporters.
The file¶
.verdis/policy.yml in the root of the repository.
supported_versions: ['2.x']
in_scope: [parser, network-client]
out_of_scope: [documentation-only]
excluded_classes:
- id: needs-malicious-config
description: Requires attacker-controlled configuration files
- id: local-dos-cli
description: Denial of service from unbounded local CLI input
evidence_requirements:
poc_required: true
default_config_only: true
min_tested_version: '2.0'
requires_steps: true
sla:
first_response_days: 7
severity_rubric: docs/severity.md
The fields¶
| Field | Meaning |
|---|---|
supported_versions |
the versions you still act on. Patterns: 2.x, 2.3.1, >=2.0, <3.0, 2.0-2.5, 2.x \|\| 3.x. |
in_scope |
the components you act on. |
out_of_scope |
components you do not act on. Shorthand for an exclusion. |
excluded_classes |
classes of report you do not act on, each with an id and a description. |
evidence_requirements |
what a report must contain. |
sla |
your response times. Shown to you, not to reporters. |
severity_rubric |
where your severity rubric lives. |
How the tool matches a claim¶
- Component. A claim's component (function name, file, or both) is
matched against
in_scopeandout_of_scope. Matching is generous:parsermatchesparse_header, andnetwork-clientmatchesnetwork_client. - Version. The claimed version is matched against
supported_versions. - Exclusions. An excluded class matches when the claim's impact, component or preconditions overlap with the exclusion's description, or when the exclusion names the component explicitly.
What happens when a claim is out of scope¶
The tool still reproduces it first. A maintainer should see whether it
works, and then see that the project does not act on this class of
report. Only then is the verdict OUT_OF_SCOPE, with the clause cited.
What happens when evidence is missing¶
NEEDS_INFO, with the policy clause quoted, and a short checklist in the
draft reply. The reply never accuses the reporter of anything.
Deriving a policy from your documentation¶
If there is no .verdis/policy.yml, the tool reads SECURITY.md and
THREAT_MODEL.md and derives hints from the headings it recognises:
supported versions, in scope, out of scope, and requirements for reports.
Those hints are labelled derived, unverified until a maintainer confirms them, and the tool says so in the warnings. Derivation is a starting point, not a policy.
A worked example¶
supported_versions: ['2.x', '3.x']
in_scope:
- parser
- network-client
- tls
excluded_classes:
- id: needs-malicious-config
description: Requires attacker-controlled configuration files
components: [config-loader]
- id: local-dos-cli
description: Denial of service from unbounded local CLI input
evidence_requirements:
poc_required: true
default_config_only: true
min_tested_version: '2.0'
sla:
first_response_days: 7
triage_days: 3
Check it before you rely on it:
verdis policy check