Scan policies
A scan policy is the rulebook every scan of a tenant is judged against. It turns the findings of a scan into one verdict, pass or fail, with the reasons. That verdict is what a pipeline's exit code, a pull request check and the console's pass/fail badge show.
Each tenant has one active policy. Choose it under Settings, Scan policy. It applies to every scan that tenant starts afterwards: from the console, from the CLI, from a pipeline, and scheduled rescans.
#What a policy checks
A scan fails when any of these is exceeded:
| Rule | Fails when |
|---|---|
| Critical, high, medium vulnerabilities | the count is above the limit. A limit of 0 means none allowed; any means that severity is not limited |
| Highest severity score (CVSS) | any vulnerability scores above the limit |
| Overall risk score | the combined risk score of the scan (0 to 100) is above the limit |
| Critical and high with a known exploit | the count is above the limit |
| Known exploited (CISA KEV) | any finding is on the KEV list, when this rule is on |
| Unfixed vulnerabilities | a finding of a chosen severity has no fixed version yet, when this rule is on |
| Strong copyleft licences | a package uses one (GPL and similar), when they are not allowed |
| Unknown licences | a package's licence could not be identified, when they are not allowed |
| Maintenance | a package looks abandoned or poorly maintained beyond the policy's tolerance |
The Scan policy page shows these as plain numbers for every profile, and, when you select another profile, exactly which rows would change and whether each becomes stricter or looser.
#Built-in profiles
There are 35 built-in profiles. The names that refer to a framework or regulation mean the limits follow the intent of that framework's vulnerability-management expectations. They help you meet a standard; they do not certify anything.
#General (8)
| Profile | Critical | High | Medium | Max CVSS | Notes |
|---|---|---|---|---|---|
Standard - Balanced Security (standard) |
0 | 5 | 20 | 9 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
Enterprise - Corporate Standard (enterprise) |
0 | 3 | 15 | 8 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
Startup - Fast Development (startup) |
2 | 10 | 50 | 9 | fails on known-exploited; fails on unfixed critical |
Open Source Project (opensource) |
1 | 8 | 30 | 9 | fails on known-exploited; fails on unfixed critical |
SaaS - Cloud Service (saas) |
0 | 3 | 12 | 8 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
Development & Testing (development) |
5 | 20 | any | 10 | |
Strict - Maximum Security (strict) |
0 | 0 | 0 | 6.5 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Permissive - Minimal Security (permissive) |
3 | 15 | any | 10 | fails on known-exploited; fails on unfixed critical |
#Compliance (7)
| Profile | Critical | High | Medium | Max CVSS | Notes |
|---|---|---|---|---|---|
SOC 2 - Vulnerability Management (soc2) |
0 | 2 | 12 | 8 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
ISO/IEC 27001 - Technical Vulnerabilities (iso27001) |
0 | 3 | 15 | 8 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
NIST SSDF - Secure Software Development (nist-ssdf) |
0 | 2 | 10 | 8.5 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
EU NIS2 and Cyber Resilience Act (nis2-cra) |
0 | 0 | 8 | 7.5 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
EU DORA - ICT Risk for Financial Entities (dora) |
0 | 0 | 4 | 7.5 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Medical Devices - FDA and IEC 62304 (medical-device) |
0 | 0 | 2 | 7 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Aerospace - DO-326A and DO-356A (aerospace) |
0 | 0 | 2 | 7 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
#Industry (11)
| Profile | Critical | High | Medium | Max CVSS | Notes |
|---|---|---|---|---|---|
Automotive - ISO 26262 (automotive) |
0 | 0 | 3 | 7 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Financial Services - PCI-DSS (financial) |
0 | 0 | 5 | 7.5 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Healthcare - HIPAA (healthcare) |
0 | 0 | 5 | 7.5 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Government - FedRAMP (government) |
0 | 0 | 0 | 7 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Defense & Military - DoD (defense) |
0 | 0 | 0 | 6 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
E-Commerce - PCI-DSS (ecommerce) |
0 | 2 | 10 | 7.5 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
Telecommunications - Network Security (telecommunications) |
0 | 1 | 5 | 7.5 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Energy & Utilities - Critical Infrastructure (energy) |
0 | 0 | 2 | 7 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
Education - FERPA (education) |
0 | 5 | 15 | 8.5 | fails on known-exploited; fails on unfixed critical/high |
Gaming & Entertainment (gaming) |
1 | 8 | 25 | 9 | fails on known-exploited; fails on unfixed critical |
IoT Devices (iot) |
0 | 1 | 5 | 7 | fails on known-exploited; fails on unfixed critical/high/medium; no strong copyleft; no unknown licences |
#Workflow (7)
| Profile | Critical | High | Medium | Max CVSS | Notes |
|---|---|---|---|---|---|
Pull Request Gate (pr-gate) |
0 | 20 | any | 10 | fails on known-exploited; fails on unfixed critical |
Production Release Gate (release-gate) |
0 | 2 | 10 | 8 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
Known Exploited Only (kev-only) |
any | any | any | 10 | fails on known-exploited |
Legacy Burn-Down (legacy-burn-down) |
2 | 15 | any | 10 | fails on known-exploited |
Internet-Facing Services (internet-facing) |
0 | 1 | 10 | 8 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
Internal Tools (internal-tools) |
1 | 8 | 40 | 9 | fails on known-exploited; fails on unfixed critical |
Supply Chain Hardened (supply-chain) |
0 | 3 | 15 | 8.5 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft |
#Licences (2)
| Profile | Critical | High | Medium | Max CVSS | Notes |
|---|---|---|---|---|---|
Licence Compliance - No Copyleft or Unknown (license-compliance) |
0 | 5 | 20 | 9 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft; no unknown licences |
Publishing Open Source or Redistributing (oss-distribution) |
0 | 3 | 15 | 9 | fails on known-exploited; fails on unfixed critical/high; no strong copyleft; no unknown licences |
#Choosing one
| Situation | Start with |
|---|---|
| No idea yet | Standard |
| A pull request check that must not be blocked by old backlog | Pull Request Gate |
| The build that ships to customers | Production Release Gate |
| A large backlog you want to burn down without blocking everyone | Known Exploited Only, then Legacy Burn-Down, then tighten |
| An internet-facing API or site | Internet-Facing Services |
| You redistribute the software | Publishing Open Source or Redistributing |
| Licences matter more than vulnerabilities | Licence Compliance |
| An auditor asks for a framework | the matching Compliance profile, or a custom one |
| Safety-critical or regulated sector | the Industry profile, or Strict |
Move towards stricter profiles in steps. Going from a permissive profile straight to Strict will fail almost every project on day one.
#Custom policies
When no profile fits, build your own. Owners and admins can:
- New custom policy (top right of the page): starts from the profile you choose;
- Customise this profile: copies the profile you are looking at.
A custom policy has a name, an optional description, a profile it starts from, and any of these limits changed:
| Limit | Range |
|---|---|
| Critical, high, medium vulnerabilities | 0 to 998, or no limit |
| Critical and high with a known exploit | 0 to 998, or no limit |
| Highest severity score | 0 to 10 |
| Overall risk score | 0 to 100 |
| Fail on CISA KEV | on or off |
| Fail on unfixed critical, high, medium | on or off each |
| Allow strong copyleft, allow unknown licences | on or off each |
While you edit, the editor shows how strict the result is and lists every difference from the profile it started from. Only the differences are stored, so everything you did not change is inherited.
Rules for custom policies:
- Names are unique within a tenant. A tenant can have up to 50.
- Edits apply to scans started after you save.
- A policy that is active cannot be deleted: switch to another first.
- A custom policy belongs to its tenant and is invisible to others.
- If an active policy is ever removed, scans fall back to Standard rather than failing.
#Through the API
All of this needs the admin role.
# List built-in and custom policies, each with its limits
curl -H "Authorization: Bearer $TOKEN" https://api.dpndncy.example.com/api/admin/policies
# Create
curl -X POST https://api.dpndncy.example.com/api/admin/policies -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"name":"Payments service","baseId":"release-gate","limits":{"maxHigh":0,"maxCvss":7}}'
# Change one (PUT /api/admin/policies/<id>), delete one (DELETE ...), or make one active:
curl -X POST https://api.dpndncy.example.com/api/admin/policy -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"policyId":"policy_1793969812737"}'baseId is the id of a built-in profile from the tables above. Invalid limits are refused with the reason, for example maxHigh must be a whole number from 0 to 999.
#How a pipeline sees it
The CLI in --ci mode exits 0 when the policy verdict is pass and 1 when it is fail, and prints the violations. Changing the tenant's policy changes what pipelines do from the next run, with no change to the pipeline. See The dpndncy command line.