Vet’s checks map to specific OWASP ASVS (Application Security Verification Standard) control IDs. This document explains what ASVS is, how it’s structured, and which controls vet covers.

What is ASVS?

The OWASP Application Security Verification Standard is a framework of security requirements for designing, developing, and testing web applications. It defines ~280 controls organized into 14 categories, each specifying a testable security property.

ASVS is not a tool or a scanner. It’s a checklist. Tools like vet automate the testable subset of that checklist.

Verification levels

ASVS defines three levels of verification depth:

LevelTargetEffort
Level 1All applications. Low assurance. Automated testing can cover most controls.Low
Level 2Applications handling sensitive data. Most controls require testing against a running application.Medium
Level 3High-value applications (banking, healthcare, critical infrastructure). Requires code review and architecture analysis.High

CASA Tier 2 maps to ASVS Level 2. Vet targets the automatable subset of Level 2 controls.

ASVS category structure

ASVS organizes controls by category prefix:

PrefixCategoryExample
V1Architecture, Design and Threat ModelingV1.1.1
V2AuthenticationV2.1.1
V3Session ManagementV3.1.1
V4Access ControlV4.1.1
V5Validation, Sanitization and EncodingV5.1.1
V6Stored CryptographyV6.1.1
V7Error Handling and LoggingV7.1.1
V8Data ProtectionV8.1.1
V9CommunicationV9.1.1
V10Malicious CodeV10.1.1
V11Business LogicV11.1.1
V12Files and ResourcesV12.1.1
V13API and Web ServiceV13.1.1
V14ConfigurationV14.1.1

Not all categories are automatable. V1 (architecture) and V11 (business logic) require human judgment. Vet focuses on the categories that can be tested by sending HTTP requests and inspecting responses.

How to read vet’s control IDs

Every check in vet’s output has an id field that maps to an ASVS control:

V9.1.1
│ │ │
│ │ └─ Specific requirement (1st check in subcategory)
│ └─── Subcategory (Security Headers)
└───── Category (V9 = Communication)

Vet uses its own numbering within each subcategory to keep IDs stable across versions. The mapping is consistent but not always 1:1 with the ASVS spec numbering — vet groups some checks differently for practical testing reasons.

Which ASVS categories vet covers

V5 — Validation, Sanitization and Encoding

Vet tests input validation by sending attack payloads and malformed data to every discovered endpoint.

Vet IDWhat it tests
V5.1.1Request size limits (1MB payload)
V5.1.2Malformed JSON handling (parse errors → 400, not 500)
V5.1.3Missing required fields (empty body → 4xx, not 5xx)
V5.1.4Wrong field types (string-as-number → 4xx, not 5xx)
V5.3.3Reflected XSS (payload echoed unescaped in HTML)
V5.3.4SQL injection (SQL error patterns in response to SQLi payloads)
V5.3.8Path traversal (filesystem content in response to ../../ payloads)
V5.3.10Null byte injection (null bytes passed through in responses)

What vet can detect: Error-based SQL injection, reflected XSS, basic path traversal, crash-inducing malformed input.

What vet can’t detect: Blind SQL injection, stored XSS, DOM-based XSS, second-order injection, business logic bypass through input manipulation.

V7 — Error Handling and Logging

Vet checks that error responses don’t leak internal information.

Vet IDWhat it tests
V7.4.1No stack traces (Node/Python/Java patterns)
V7.4.2No framework version strings (Express/, PHP/, nginx/)
V7.4.3No internal filesystem paths (/home/, /var/, C:\)
V7.4.4No database error strings or leaked SQL
V7.4.5No user-enumeration in auth errors (“user not found”, etc.)
V7.4.65xx responses are short and generic (no exception class names)

Vet triggers errors by sending: path traversal in query params, malformed JSON, non-existent paths, path traversal in URL, and invalid bearer tokens.

V8 — Data Protection (planned)

Will test that tokens don’t appear in redirect URLs, error messages, or GET parameters.

V9 — Communication

The largest category in vet. Covers security headers, HTTP methods, TLS, and CORS.

V9.1.x — Security Headers:

Vet IDWhat it tests
V9.1.1HSTS with max-age ≥ 31536000
V9.1.2X-Content-Type-Options: nosniff
V9.1.3X-Frame-Options or CSP frame-ancestors
V9.1.4Content-Security-Policy present, no unsafe-eval/unsafe-inline
V9.1.5Referrer-Policy (strict-origin-when-cross-origin or stricter)
V9.1.6Permissions-Policy restricts camera, microphone, geolocation
V9.1.7No Server version disclosure, no X-Powered-By
V9.1.8Cache-Control: no-store on auth endpoints

V9.2.x — HTTP Method Enforcement:

Vet IDWhat it tests
V9.2.1TRACE blocked (405)
V9.2.2TRACK blocked (405 or non-echo 2xx)
V9.2.3PROPFIND blocked (405 or non-2xx)
V9.2.4OPTIONS returns proper CORS preflight or 405

V9.3.x — TLS/SSL:

Vet IDWhat it tests
V9.3.1Target uses HTTPS
V9.3.2TLS certificate valid (handshake succeeds)
V9.3.3HSTS header on HTTPS root
V9.3.4No mixed content (http:// in src/href/action)
V9.3.5HTTP redirects to HTTPS (or port 80 closed)
V9.3.6TLS 1.0 rejected (via openssl s_client)
V9.3.7TLS 1.1 rejected (via openssl s_client)

V9.4.x — CORS:

Vet IDWhat it tests
V9.4.1Evil origin (https://evil.com) not reflected with credentials
V9.4.2Null origin not allowed
V9.4.3Wildcard (*) not combined with credentials
V9.4.4Preflight doesn’t allow dangerous methods from evil origin
V9.4.5Subdomain suffix origin (example.com.evil.com) not reflected

V10 — Malicious Code / Webhook Security (planned)

Will test webhook signature validation: missing signature rejected, invalid signature rejected, replayed timestamp rejected.

V13 — API and Web Service / Rate Limiting (planned)

Will test that rate limits are enforced and return structured 429 responses.

V2 — Authentication / OAuth (planned)

Will test OAuth-specific flows: state replay, code replay, redirect_uri enforcement, PKCE, missing client_secret.

Coverage summary

CategoryStatusChecks
V5 — Input ValidationImplemented8 checks per endpoint
V7 — Error HandlingImplemented6 checks per endpoint
V9.1 — Security HeadersImplemented8 checks per endpoint
V9.2 — HTTP MethodsImplemented4 checks per endpoint
V9.3 — TLS/SSLImplemented7 checks
V9.4 — CORSImplemented5 checks per endpoint
V2 — OAuth Authentication🚧 PlannedRequires —client-id/—client-secret
V8 — Data Protection🚧 PlannedToken exposure checks
V10 — Webhook Security🚧 PlannedSignature validation checks
V13 — Rate Limiting🚧 Planned429 enforcement checks

Total implemented: 38 unique check types, each run per discovered endpoint. A scan of an app with 10 endpoints produces ~300+ individual checks.

What ASVS doesn’t cover

ASVS focuses on application-level security. It does not cover:

  • Infrastructure security (firewall rules, network segmentation)
  • Physical security
  • Social engineering
  • Supply chain attacks (dependency vulnerabilities)
  • Privacy regulations (GDPR, CCPA)

These are out of scope for both ASVS and vet.