API Security Review Template (OWASP API Top 10 2023, ASVS 5.0)
API scope, method and rating, inventory and shadow endpoints, trust boundaries, API1 to API10 review, ASVS 5.0 API checklist, findings, decision, retest
使用方法: Use it to review one API release against the OWASP API Security Top 10 2023 and the API chapters of ASVS 5.0.0. Fill the inventory from spec, gateway and traffic first, then work risk by risk with two users and two tenants. The main pitfall is testing only the documented endpoints while shadow and older versions stay reachable.
预览
API Security Review: [API name and version]
Security review record for one API (REST, GraphQL, gRPC gateway or WebSocket): scope and context, review method and evidence, API inventory and exposure, data flow and trust boundaries, a structured review against each of the ten risks of the OWASP API Security Top 10 2023, a checklist of the API-relevant chapters of the OWASP Application Security Verification Standard (ASVS) 5.0.0 (May 2025), a scored findings register, risk summary, remediation plan, retest and sign-off. Versions as checked in October 2026. The questions, structure and examples are original. Replace every
[bracketed]value and every row marked Example.
Document control
| Field | Value |
|---|---|
| Document ID | [APISR-2026-001] |
| Version | [1.0] |
| Status | [Draft / In review / Approved / Superseded] |
| Owner (API product owner) | [@api-owner] |
| Reviewer(s) | [@appsec-reviewer], [@second-reviewer] |
| Approvers | [@engineering-lead], [@security-lead] |
| Last updated | YYYY-MM-DD |
| Classification | [Confidential: contains unremediated findings] |
| API under review | [Parcel Booking API] version [2.4.0] |
| Review type | [Design / Pre-release / Periodic / Post-incident] |
| Review window | YYYY-MM-DD to YYYY-MM-DD |
| Baselines | OWASP API Security Top 10 2023; OWASP ASVS 5.0.0, target level [L2] |
| Related threat model | [TM-API-007] |
Approvals
| Role | Name | Decision | Date |
|---|---|---|---|
| Lead reviewer | [@name] | [Submitted] | YYYY-MM-DD |
| API product owner | [@name] | [Accepted / Accepted with conditions / Rejected] | YYYY-MM-DD |
| Security lead | [@name] | [Approved / Changes requested] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|---|---|---|
| 0.1 | YYYY-MM-DD | [@name] | Scope and inventory drafted |
| 0.9 | YYYY-MM-DD | [@name] | Example: Review complete, 10 findings recorded |
| 1.0 | YYYY-MM-DD | [@name] | Example: Owner decision and remediation dates agreed |
| 1.1 | YYYY-MM-DD | [@name] | Example: Retest results for APISR-001 to APISR-003 added |
Contents
1. Scope and context
| Item | Value |
|---|---|
| API style | [REST over HTTPS / GraphQL / gRPC with HTTP gateway / WebSocket] |
| Specification | [OpenAPI 3.1 document parcel-booking-v2.yaml, commit [hash]] |
| Consumers | Example: Customer web app, Android and iOS apps, 14 partner integrations, internal pricing service |
| Authentication | Example: OAuth 2.0 authorization code with PKCE for apps, client credentials for partners, JWT access tokens (15 minutes) |
| Data classes | Example: Personal data (names, addresses, phone numbers), commercial data (rates, contracts) |
| Hosting and gateway | [Cloud region], [API gateway product and version], [WAF] |
| Environments reviewed | [Staging with production configuration; read-only checks in production] |
| Tenancy | Example: Multi-tenant: one partner must never see another partner's shipments |
| Business criticality | [High: booking outage stops dispatch] |
In scope: [all operations under /v2/, the webhook delivery service, the GraphQL tracking endpoint, gateway policies, token validation].
Out of scope (with reason): [the identity provider itself (reviewed in IAM review IAM-2026-03), the mobile app binaries (covered by the mobile app security assessment), denial-of-service load testing (scheduled separately)].
Rules of engagement: testing accounts [list], allowed time windows, production actions limited to [read-only requests with test tenants], emergency contact [@on-call].
2. Method, evidence and rating
The review combines four evidence sources. Record which ones you used for each risk in section 5.
| Source | What it shows | Used |
|---|---|---|
| Specification review | Declared operations, schemas, security schemes, scopes | [Yes / No] |
| Code and configuration review | Authorization checks, field binding, outbound calls, gateway policies | [Yes / No] |
| Dynamic testing | Behaviour with two users and two tenants, manipulated IDs, fields, rates | [Yes / No] |
| Production telemetry | Operations actually called, versions in use, error and rate patterns | [Yes / No] |
Rating method. Rate each finding for likelihood (1 to 5) and impact (1 to 5) and multiply them. Use your organisation's risk method if it has one, and record the mapping here.
| Score (likelihood x impact) | Severity | Target fix time (Example policy) |
|---|---|---|
| 20 to 25 | Critical | Before release, or 7 days in production |
| 10 to 16 | High | 30 days |
| 5 to 9 | Medium | 90 days |
| 1 to 4 | Low | Next planned release |
Where your vulnerability management policy requires CVSS, add a CVSS v4.0 vector in the finding detail and keep this score as the business rating. Test accounts used: [User A in Tenant 1, User B in Tenant 1, User C in Tenant 2, Partner client P1, administrator ADM1].
3. API inventory and exposure
| Host and base path | Version | Status | Audience | In spec | In gateway | Seen in traffic (30 days) | Owner |
|---|---|---|---|---|---|---|---|
Example: api.[example].com/v2 | 2.4.0 | Current | Public and partners | Yes | Yes | Yes | [@booking-team] |
Example: api.[example].com/v1 | 1.9.3 | Deprecated (sunset YYYY-MM-DD) | Partners | No | Yes | Yes (2 partners) | [@booking-team] |
Example: api.[example].com/graphql | n/a | Current | Web app | Partly | Yes | Yes | [@tracking-team] |
Example: staging-api.[example].com | 2.5.0-rc | Pre-release | Internal | n/a | Yes | Yes (from internet) | [@platform-team] |
Example counts for the /v2 surface: 46 operations were seen in gateway logs over 30 days and 41 of them are in the specification, so 5 operations (10.9%) are undocumented and documentation covers 89.1% of the live surface. Each undocumented operation is listed below and either documented, retired or raised as a finding.
| Operation | Why undocumented | Decision |
|---|---|---|
Example: GET /v2/admin/rates/export | Internal tool route | Move behind internal gateway (APISR-004) |
Example: POST /v2/debug/replay | Left from incident analysis | Remove (APISR-004) |
4. Data flow and trust boundaries
| Boundary | Crossing | Control expected | Evidence |
|---|---|---|---|
| TB1 Internet to gateway | Client request | TLS, token validation, rate limits, schema validation | [Gateway policy file, test results] |
| TB2 Gateway to service | Verified claims | Service re-checks authorization; does not trust client-supplied headers | [Code reference] |
| TB3 Service to third party | Outbound request | TLS validation, timeouts, response validation | [Code reference] |
| TB4 Webhook to customer URL | Outbound request to user-supplied URL | Allow-list, private address blocking, no redirects | [Code reference] |
5. Review against the OWASP API Security Top 10 2023
The OWASP API Security Top 10 2023 is still the current edition of the list as of October 2026 (owasp.org/API-Security). Risk IDs and short names are cited for mapping.
5.1 API1:2023 Broken Object Level Authorization
Questions:
- Does every operation that takes an object identifier (path, query, body, header) check that the caller may access that specific object, in the service and not only in the client?
- With User A's token, can you read, change or delete an object that belongs to User C in another tenant by changing the identifier?
- Are identifiers random, and does the design still check authorization (random IDs reduce guessing, they do not replace the check)?
- Are bulk and list operations filtered by the caller's tenant on the server?
ASVS 5.0.0: 8.2.2, 8.3.1, 8.4.1. Result: Example: Finding APISR-001 (GET /v2/shipments/{id} returns another tenant's shipment).
5.2 API2:2023 Broken Authentication
Questions:
- Which operations accept no authentication, and is each one intended (list them)?
- Are access tokens validated for signature, allowed algorithm, issuer, audience and expiry on every request?
- Are credential and token endpoints protected against brute force and credential stuffing?
- How long do access and refresh tokens live, and can they be revoked?
ASVS 5.0.0: 6.3.1, 9.1.1, 9.1.2, 9.2.1, 9.2.3, 10.3.1. Result: Example: Finding APISR-009 (partner access tokens valid for 24 hours, no revocation).
5.3 API3:2023 Broken Object Property Level Authorization
Questions:
- Do responses return only the fields the caller may see, or whole database objects filtered by the client?
- Can a caller set fields they should not control (role, price, status, owner, tenant) by adding them to a request body?
- Are read and write field rules documented per role?
ASVS 5.0.0: 8.1.2, 8.2.3, 15.3.1, 15.3.3. Result: Example: Finding APISR-002 (PATCH /v2/accounts/{id} accepts role).
5.4 API4:2023 Unrestricted Resource Consumption
Questions:
- Are there limits on request rate, payload size, page size, upload size, query depth and execution time?
- Which operations trigger paid third-party calls (SMS, email, maps, rating engines), and is each one limited per caller?
- Do timeouts and limits exist on outbound calls so a slow partner cannot exhaust threads?
ASVS 5.0.0: 2.4.1, 4.3.1, 15.1.3, 15.2.2. Result: Example: Finding APISR-003 (POST /v2/quotes calls a paid rating engine without a per-client limit).
5.5 API5:2023 Broken Function Level Authorization
Questions:
- Can a normal user call administrative operations by guessing paths or changing the HTTP method?
- Are administrative operations on a separate path, audience or gateway, with role checks in the service?
- Are unused HTTP methods rejected?
ASVS 5.0.0: 8.2.1, 4.1.4, 8.4.2. Result: Example: Pass for /v2/; admin export route covered by APISR-004.
5.6 API6:2023 Unrestricted Access to Sensitive Business Flows
Questions:
- Which business flows would hurt the business if automated at scale (booking scarce slots, creating accounts, redeeming credits, scraping prices)?
- What limits each flow (per account, per device, per payment instrument), and is the limit enforced on the server?
- Do high-value flows need step-up authentication or a second approver?
ASVS 5.0.0: 2.3.2, 2.3.4, 2.3.5, 2.4.1. Result: Example: Pass: pickup slot booking is locked per slot and limited to 20 bookings per account per hour.
5.7 API7:2023 Server Side Request Forgery
Questions:
- Where does the API fetch a URL supplied or influenced by the caller (webhooks, image import, document fetch, OAuth metadata)?
- Is the destination checked against an allow-list of schemes, hosts and ports, with private, link-local and metadata addresses blocked after DNS resolution?
- Are redirects disabled for outbound calls unless needed?
ASVS 5.0.0: 1.3.6, 15.3.2. Result: Example: Finding APISR-005 (webhook URL accepts http://169.254.169.254).
5.8 API8:2023 Security Misconfiguration
Questions:
- Are TLS settings, CORS policy, security headers and content types correct on every host?
- Do error responses hide stack traces, framework versions and internal hostnames?
- Are debug modes, introspection and documentation endpoints disabled or protected in production where not meant to be public?
ASVS 5.0.0: 4.1.1, 4.3.2, 12.2.1, 13.4.2, 13.4.5, 13.4.6, 16.5.1. Result: Example: Findings APISR-006 (GraphQL introspection enabled) and APISR-007 (stack traces in 500 responses).
5.9 API9:2023 Improper Inventory Management
Questions:
- Does the inventory in section 3 match the specification, gateway and traffic?
- Do deprecated versions have a sunset date, an owner and the same controls as current versions?
- Are non-production hosts reachable from the internet, and do they hold production data?
ASVS 5.0.0: 13.1.1, 13.4.5, 15.2.3. Result: Example: Finding APISR-004 (five undocumented operations, including a debug route).
5.10 API10:2023 Unsafe Consumption of APIs
Questions:
- Which third-party APIs does this API call, and is each response validated against a schema and treated as untrusted input?
- Are TLS certificates of partners validated, and are redirects from partners refused?
- What happens if a partner returns a huge, slow or malformed response?
ASVS 5.0.0: 1.2.4, 12.3.2, 13.1.3, 15.3.2. Result: Example: Finding APISR-008 (carrier client disables certificate validation in one code path).
5.11 Summary of results
| Risk | Result | Finding IDs |
|---|---|---|
| API1:2023 | Example: Finding | APISR-001 |
| API2:2023 | Example: Finding | APISR-009 |
| API3:2023 | Example: Finding | APISR-002 |
| API4:2023 | Example: Finding | APISR-003 |
| API5:2023 | Example: Pass | (see APISR-004 for admin route) |
| API6:2023 | Example: Pass | none |
| API7:2023 | Example: Finding | APISR-005 |
| API8:2023 | Example: Finding | APISR-006, APISR-007 |
| API9:2023 | Example: Finding | APISR-004 |
| API10:2023 | Example: Finding | APISR-008 |
6. ASVS 5.0.0 API checklist
ASVS 5.0.0 has 17 chapters (V1 to V17). The API-relevant sections are listed below with an original one-line description of what to check. Read the requirement text in ASVS itself.
| ASVS section | What to check (own wording) | Result | Finding |
|---|---|---|---|
| V4.1 Generic Web Service Security | Correct content types, header handling through intermediaries, only supported HTTP methods | Example: Pass | |
| V4.2 HTTP Message Structure Validation | Consistent message framing across proxies, no request smuggling, safe outbound request building | Example: Pass | |
| V4.3 GraphQL | Query cost, depth or allow-list limits, introspection off where not public | Example: Finding | APISR-006 |
| V4.4 WebSocket | WSS only, origin check on handshake, dedicated session tokens | [N/A: no WebSocket] | |
| V8.1 to V8.4 Authorization | Documented function, object and field rules, enforcement in a trusted layer, cross-tenant isolation | Example: Finding | APISR-001, APISR-002 |
| V9.1 and V9.2 Self-contained Tokens | Signature check, algorithm allow-list, trusted keys, expiry, type and audience checks | Example: Finding | APISR-009 |
| V10.3 OAuth Resource Server | Accepts only tokens meant for this API, decisions based on token claims and scopes | Example: Pass | |
| V2.3 and V2.4 Business Logic and Anti-automation | Step order, business limits, locking of scarce resources, anti-automation | Example: Finding | APISR-003 |
| V1.2 and V1.3 Injection and Sanitization | Parameterised queries, SSRF protection on outbound URLs | Example: Finding | APISR-005 |
| V12.2 and V12.3 Secure Communication | TLS for external and service-to-service traffic, certificate validation | Example: Finding | APISR-008 |
| V13.4 Unintended Information Leakage | Debug off, internal docs and monitoring endpoints not exposed, no version disclosure | Example: Finding | APISR-007 |
| V15.3 Defensive Coding | Field subsets in responses, mass assignment protection, redirects not followed | Example: Finding | APISR-002 |
| V16.3 Security Events | Authentication, authorization failures and control bypass attempts logged | Example: Finding | APISR-010 |
Example coverage: 13 sections listed, 1 not applicable, 12 reviewed, 3 passed, 9 with at least one finding.
7. Findings register
| ID | Title | Top 10 | ASVS 5.0.0 | Operation | L | I | Score | Severity | Owner | Due |
|---|---|---|---|---|---|---|---|---|---|---|
| APISR-001 (Example) | Shipment read without tenant check | API1 | 8.2.2, 8.4.1 | GET /v2/shipments/{id} | 4 | 5 | 20 | Critical | [@booking-team] | YYYY-MM-DD |
| APISR-002 (Example) | Role field writable through account update | API3 | 8.2.3, 15.3.3 | PATCH /v2/accounts/{id} | 3 | 4 | 12 | High | [@account-team] | YYYY-MM-DD |
| APISR-003 (Example) | Paid rating calls not limited per client | API4 | 2.4.1, 15.2.2 | POST /v2/quotes | 4 | 3 | 12 | High | [@pricing-team] | YYYY-MM-DD |
| APISR-004 (Example) | Undocumented admin and debug routes reachable | API9 | 13.4.5, 15.2.3 | 5 operations (section 3) | 3 | 3 | 9 | Medium | [@platform-team] | YYYY-MM-DD |
| APISR-005 (Example) | Webhook URL can target internal addresses | API7 | 1.3.6 | PUT /v2/webhooks/{id} | 2 | 5 | 10 | High | [@integration-team] | YYYY-MM-DD |
| APISR-006 (Example) | GraphQL introspection enabled in production | API8 | 4.3.2 | POST /graphql | 3 | 2 | 6 | Medium | [@tracking-team] | YYYY-MM-DD |
| APISR-007 (Example) | Stack traces in server error responses | API8 | 13.4.2, 16.5.1 | All /v2/ on 500 | 3 | 2 | 6 | Medium | [@platform-team] | YYYY-MM-DD |
| APISR-008 (Example) | Certificate validation disabled in carrier client fallback | API10 | 12.3.2 | Carrier rate client | 2 | 4 | 8 | Medium | [@pricing-team] | YYYY-MM-DD |
| APISR-009 (Example) | Partner access tokens live 24 hours without revocation | API2 | 9.2.1, 10.4.9 | Token issuance for partners | 2 | 3 | 6 | Medium | [@iam-team] | YYYY-MM-DD |
| APISR-010 (Example) | Authorization failures not logged | API8 | 16.3.2 | All /v2/ | 2 | 2 | 4 | Low | [@platform-team] | YYYY-MM-DD |
Detail for each finding (repeat the block):
| Field | APISR-001 (Example) |
|---|---|
| Description | The service loads the shipment by ID and returns it without comparing the shipment tenant with the tenant in the access token. |
| Reproduction | With User C (Tenant 2) token, request a shipment ID created by User A (Tenant 1); the API returns 200 with the full record. |
| Impact | Any partner can read names, addresses and phone numbers of other partners' customers. |
| Recommendation | Enforce the tenant check in the data access layer for every shipment query; add a cross-tenant test to the API test suite. |
| References | OWASP API1:2023; ASVS 5.0.0 8.2.2 and 8.4.1 |
| Evidence | [Request and response IDs in the test log, redacted] |
8. Risk summary and decision
| Severity | Count (Example) | Share |
|---|---|---|
| Critical | 1 | 10% |
| High | 3 | 30% |
| Medium | 5 | 50% |
| Low | 1 | 10% |
| Total | 10 | 100% |
Example summary: the API has one Critical object level authorization flaw that exposes personal data across tenants, so release is blocked until APISR-001 is fixed and retested. The three High findings (APISR-002, APISR-003, APISR-005) must be fixed before partner onboarding opens. Medium and Low findings follow the target fix times in section 2.
| Decision | Conditions | Decided by | Date |
|---|---|---|---|
| [Release / Release with conditions / Do not release] | Example: APISR-001 fixed and retested; APISR-002, APISR-003 and APISR-005 fixed within 30 days | [@api-owner] | YYYY-MM-DD |
Any finding the owner chooses to accept rather than fix needs a security exception with an expiry date, recorded through the security exception request process.
9. Remediation plan and retest
| ID | Fix | Regression test added | Fixed in | Retest date | Retest result | Status |
|---|---|---|---|---|---|---|
| APISR-001 (Example) | Tenant filter in repository layer | shipments_cross_tenant_test | 2.4.1 | YYYY-MM-DD | Pass: 404 for other tenant | Closed |
| APISR-002 (Example) | Explicit allow-list of writable fields per role | account_patch_fields_test | 2.4.1 | YYYY-MM-DD | Pass | Closed |
| APISR-003 (Example) | Per-client quota of 600 quotes per hour at gateway | Gateway policy test | 2.4.2 | YYYY-MM-DD | [Pending] | Open |
| APISR-005 (Example) | Resolve and block private ranges, disable redirects | webhook_ssrf_test | 2.4.2 | YYYY-MM-DD | [Pending] | Open |
Preventive actions beyond the individual fixes:
- Example: Add an authorization test matrix (role x operation x tenant) to the API contract tests.
- Example: Generate the gateway route list from the specification so undocumented routes fail the build.
- Example: Add the review checklist in section 6 to the API design review gate.
10. Sign-off and next review
| Item | Value |
|---|---|
| All Critical and High findings closed or excepted | [Yes / No] |
| Residual risk accepted by | [@api-owner], YYYY-MM-DD |
| Next periodic review | YYYY-MM-DD (at least yearly) |
| Earlier review triggers | New authentication method, new consumer type (for example AI agents), new tenant model, new third-party dependency, major version, security incident |
11. Glossary and references
| Term | Meaning |
|---|---|
| BOLA | Broken object level authorization: access to an object without a check that the caller may access that object |
| BOPLA | Broken object property level authorization: reading or writing fields the caller should not see or set |
| Mass assignment | Binding all request fields to an internal object, including fields the client should not control |
| SSRF | Server-side request forgery: making the server send a request to a destination chosen by the attacker |
| Shadow API | An operation that is reachable in production but not documented or owned |
| Sender-constrained token | An access token bound to a key held by the client, so a stolen token alone cannot be used |
| Reference | Version (as checked October 2026) | Official page |
|---|---|---|
| OWASP API Security Top 10 | 2023 (current edition) | https://owasp.org/API-Security/editions/2023/en/0x11-t10/ |
| OWASP Application Security Verification Standard | 5.0.0 (30 May 2025) | https://github.com/OWASP/ASVS/releases/tag/v5.0.0_release |
| OWASP REST Security Cheat Sheet | Living document | https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html |
| OWASP GraphQL Cheat Sheet | Living document | https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html |
Standard and licence note
Based on the OWASP API Security Top 10 2023 and the OWASP Application Security Verification Standard 5.0.0, both published by the OWASP Foundation under CC BY-SA 4.0. Risk IDs and short names and ASVS chapter, section and requirement numbers are cited for mapping only; the review questions, structure and examples are original and no OWASP description or requirement text is reproduced, so no ShareAlike obligation arises from this template. If you paste OWASP text into your copy, that adapted material is under CC BY-SA 4.0, must credit OWASP and must be shared alike. Check the current OWASP versions at owasp.org before relying on the mapping. Template licence: MIT.
相关模板
Cloud Security Posture Review Template (CSA CCM v4.1)
Periodic cloud posture review: scope, shared responsibility, CSPM findings by CCM v4.1 domain, identity, exposure, data, logging, drift, risks, actions, trend
安全工程Firewall Rule Review Template (PCI DSS 1.2.7)
Periodic network rule review: scope and cadence, review criteria, rule register with owner, justification, hits and expiry, results, actions, process findings
安全工程Security Design Review Template (OWASP ASVS 5.0)
Design-time security review by the 17 OWASP ASVS 5.0 chapters: scope, DFD, threats, level, findings, remediation, sign-off