OWASP ASVS for Enterprises: A Technical Guide to Application Security Verification
Prerequisites
- Familiarity with secure SDLC and CI/CD pipelines
- Basic knowledge of application security testing and YAML
Steps
OWASP ASVS provides a structured, testable baseline for verifying application security controls across design, development, and operations. Enterprises use it to standardize secure SDLC gates, map requirements to risk, and produce auditable evidence for governance and compliance.
Overview
OWASP Application Security Verification Standard (ASVS) is a vendor-neutral framework for defining and verifying security requirements for web applications and APIs. It translates broad security goals into testable controls across areas such as authentication, access control, validation, cryptography, configuration, and logging.
Enterprises adopt ASVS because it creates a common language between architects, developers, AppSec teams, QA, and auditors. Instead of relying on ad hoc checklists, teams can align application assurance to ASVS Level 1, 2, or 3 based on business criticality and threat exposure.
Key enterprise use cases:
- Establishing secure SDLC entry and exit criteria
- Mapping security requirements into user stories and CI/CD policies
- Normalizing third-party application assessments
- Producing evidence for internal audit, ISO 27001, PCI DSS, and regulatory reviews
Architecture
ASVS is not a runtime product; it is a control framework integrated into delivery workflows.
Core components
- ASVS control set: Verifiable requirements grouped by domain
- Verification level model: Level 1 for basic assurance, Level 2 for most business apps, Level 3 for high-value targets
- Assessment workflow: Requirement selection, evidence collection, validation, exception handling
- Toolchain integration: SAST, DAST, SCA, IaC scanning, test management, and GRC platforms
Deployment models
- Centralized AppSec model: A platform team owns the ASVS baseline and enforces policies across business units
- Federated model: Security champions map ASVS controls into product backlogs and pipelines
- Third-party assurance model: Procurement and vendor risk teams require ASVS-aligned attestations
Data flow
- Architects classify the application and select the ASVS level.
- Security requirements are mapped into backlog items and CI/CD checks.
- Automated tools generate evidence from code, build, and runtime tests.
- Manual reviewers validate controls not fully covered by automation.
- Results are stored in ticketing, GRC, or compliance systems for auditability.
Implementation Guide
1. Obtain the ASVS source
git clone https://github.com/OWASP/ASVS.git
cd ASVS/5.0
ls -la
2. Convert ASVS requirements into a machine-readable baseline
python3 - <<'PY'
import csv, json
rows=[]
with open('OWASP Application Security Verification Standard 5.0.0-en.csv', newline='', encoding='utf-8') as f:
for r in csv.DictReader(f):
if r.get('Level 2') == '✓':
rows.append({"id": r.get('ID'), "description": r.get('Requirement Description'), "domain": r.get('Section')})
print(json.dumps(rows[:5], indent=2))
PY
3. Add ASVS gates to CI/CD
Create .gitlab-ci.yml:
stages:
- sast
- sca
- dast
- verify
verify_asvs:
stage: verify
image: python:3.12-slim
script:
- pip install pyyaml
- python scripts/check_asvs_evidence.py evidence/asvs-level2.yaml
artifacts:
paths:
- reports/
only:
- merge_requests
- main
4. Store evidence as code
Create evidence/asvs-level2.yaml:
application: customer-portal
asvs_level: 2
controls:
- id: V2.1.1
status: pass
evidence: "OIDC enforced via Azure AD; MFA policy CA-017"
- id: V3.3.2
status: pass
evidence: "RBAC integration test tests/test_rbac.py"
- id: V9.1.1
status: pass
evidence: "TLS 1.2+ enforced at ingress-nginx"
- id: V10.2.1
status: fail
evidence: "Missing server-side validation for profile update API"
5. Validate in pipeline
python3 scripts/check_asvs_evidence.py evidence/asvs-level2.yaml
6. Enforce policy in deployment
Example admission rule with Open Policy Agent in CI:
conftest test kubernetes/deployment.yaml --policy policy/
Code Examples
Example 1: Bash evidence validation
#!/usr/bin/env bash
set -euo pipefail
yq '.controls[] | select(.status == "fail") | .id' evidence/asvs-level2.yaml | tee /tmp/asvs_fails.txt
if [[ -s /tmp/asvs_fails.txt ]]; then
echo "ASVS verification failed"
exit 1
fi
Example 2: Kubernetes ingress hardening
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: customer-portal
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/proxy-body-size: "1m"
spec:
tls:
- hosts: ["portal.example.com"]
secretName: portal-tls
Example 3: Python control status report
import yaml
from collections import Counter
with open('evidence/asvs-level2.yaml') as f:
data = yaml.safe_load(f)
counts = Counter(c['status'] for c in data['controls'])
print({"application": data['application'], "level": data['asvs_level'], "summary": counts})
Security Hardening
- Encrypt evidence repositories using platform-managed keys and restrict access with least privilege
- Sign pipeline artifacts and store immutable attestations for audit chains
- Use SSO and MFA for AppSec tooling, issue trackers, and GRC systems
- Separate duties: developers provide evidence, AppSec validates, risk owners approve exceptions
- Protect logs from tampering and redact secrets before exporting evidence
- Version ASVS mappings so requirement changes are traceable across releases
Comparison
| Capability | OWASP ASVS | NIST SSDF | BSIMM |
|---|---|---|---|
| Pricing | Free | Free | Commercial participation model |
| Deployment | Framework integrated into SDLC | Practice framework for software producers | Benchmarking program and maturity model |
| Scalability | High; works across portfolios with automation | High; strong for enterprise governance | High for large organizations with mature programs |
| Security focus | Testable application verification requirements | Secure development practices | Observed software security initiatives and maturity |
| Best use | App-level verification and release gates | Program-level policy and governance | Benchmarking AppSec maturity against peers |
Troubleshooting
1. Missing evidence file
Log sample:
python3: can't open file 'scripts/check_asvs_evidence.py': [Errno 2] No such file or directory
ERROR: Job failed: exit code 2
Fix: Ensure the repository path is correct and the script is included in the CI image or checked into source control.
2. YAML parsing failure
Log sample:
yaml.scanner.ScannerError: mapping values are not allowed here
in "evidence/asvs-level2.yaml", line 8, column 13
Fix: Validate indentation with yamllint evidence/asvs-level2.yaml and quote strings containing colons.
3. Policy gate blocks deployment
Log sample:
FAIL - kubernetes/deployment.yaml - main - Container customer-portal is missing securityContext.readOnlyRootFilesystem
Fix: Update the manifest to include securityContext and rerun conftest test locally before merge.
Best Practices
Do
- Map ASVS Level 2 as the default for internet-facing enterprise applications
- Convert controls into backlog items with owners, due dates, and evidence links
- Combine automated checks with manual verification for logic flaws and authorization paths
- Track exceptions with expiry dates and compensating controls
Don't
- Do not treat ASVS as a one-time audit checklist; enforce it continuously in CI/CD
- Do not rely only on SAST results as proof of compliance with access control or crypto requirements
- Do not apply Level 3 universally; use threat modeling and data sensitivity to scope effort
Concrete example: require merge requests to attach evidence for V2 authentication and V3 access control controls before promoting to production.
Have a project in mind?
Get an instant AI price estimate for it, or talk directly to our team.
One email a month on what we learn building with AI