SAST fails where security depends on live application behaviour rather than code patterns. That includes object-level authorisation, workflow sequencing, concurrent request handling, and hidden endpoints that only exist at runtime. If the exploit requires identity context, request order, or production state, static analysis can flag the code but not prove how an attacker will use it.
Why static analysis misses runtime-only security failures
SAST is strongest where a vulnerability is visible in source code structure, data flow, or known insecure patterns. It becomes much weaker when the security decision depends on runtime context that does not exist in the code alone, such as which user is active, which object is being targeted, how requests are ordered, or what the application state looks like after deployment.
That is why issues like object-level authorisation, multi-step workflow abuse, race conditions, and hidden endpoints often sit outside SAST’s reach. The code may look valid in isolation, but the security outcome depends on live behaviour, server state, and interaction between requests rather than on a single flawed line.
In practice, this boundary is what separates static code defects from runtime container security concerns: SAST can describe the implementation, but it cannot prove the application behaves safely once it is running under real traffic and real identity context.
Which runtime issues are most likely to evade SAST?
Authorisation flaws are a common blind spot. A code scan may confirm that a handler exists and that input is validated, yet it still cannot prove that every object, action, or workflow step is checked against the current user’s rights at the moment the request executes. Broken object-level authorisation is especially hard to infer statically because the vulnerable behaviour emerges from application logic, not from syntax alone.
Request sequencing and concurrency are another problem. If an attacker can change state by sending requests in a particular order, or by racing two requests against each other, the defect may not appear in a linear scan of the code. SAST does not observe timing, contention, retries, queueing, or state transitions in a live system, so it cannot reliably model those exploit paths.
Runtime-only endpoints and conditionally exposed functions create a similar gap. Some code paths are only reachable after configuration, feature flags, tenancy context, or authentication state are resolved at runtime. SAST may still find the code, but it cannot confirm whether the endpoint is reachable, exposed, or exploitable in production without complementary testing and deployment-aware review. The same is true for API-style abuse patterns documented in OWASP API Security Top 10, where broken authorisation and sensitive-flow abuse are often runtime questions first.
What should practitioners use alongside SAST?
SAST should be treated as one layer in a broader verification stack, not as proof that runtime security is sound. Dynamic testing, authenticated end-to-end testing, and abuse-case review are the checks that expose state-dependent behaviour, while code review is still useful for identifying whether the right control exists in the first place.
For identity-sensitive paths, the best control is to verify the actual enforcement point. A scan may find a permission check, but practitioners should confirm it is evaluated after authentication, against the correct subject, and for every object or action that matters. That distinction is why runtime identity and access control is often the real issue behind “SAST missed it” findings, even when the defect presents as an application bug.
Where workflow or concurrency bugs are suspected, test the sequence, not just the endpoint. Reproduce the same action under different ordering, with parallel requests, and with stale or refreshed state. If the security property depends on production timing, transaction boundaries, or state change, the issue is better validated with runtime testing than with static analysis alone.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
OWASP API Security Top 10 addresses the attack and risk surface, while NIST SP 800-53 Rev 5 and OWASP ASVS set the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| OWASP API Security Top 10 | API1 — Broken Object Level Authorization | Runtime object access control is a central blind spot for static analysis. |
| Recommendation — Test object-level access decisions with authenticated runtime checks, not SAST alone. | ||
| NIST SP 800-53 Rev 5 | SI-2 — Flaw Remediation | Static analysis findings still need validation and remediation for code defects that reach runtime. |
| AC-6 — Least Privilege | Runtime authorisation failures often surface when effective privileges exceed the code's assumptions. | |
| Recommendation — Track and remediate analysis findings with verified fix evidence before release. Verify that each execution path enforces least privilege at runtime. | ||
| OWASP ASVS | V8 — Authorization | The question is about security checks that depend on live authorisation decisions beyond static code patterns. |
| Recommendation — Verify that authorisation is enforced for every protected object and action path. | ||
Practitioner Guidance
What to verify: Treat any control that depends on the current user, object, or state as a runtime check and validate it with authenticated tests. If a defect only appears when requests are reordered, repeated, or raced, assume SAST will be insufficient on its own.
Decision rule: If the security question is “does the code contain the right check?”, SAST helps. If the question is “does the running system enforce the check for every real request?”, add dynamic testing or runtime inspection before you trust the result.
What practitioners underestimate: The most common mistake is assuming that a clean static scan means the business workflow is safe. Static analysis can reduce obvious coding defects, but it does not prove correct enforcement of authorisation, sequencing, or reachability in production.
Practitioner takeaway: Use SAST to find latent implementation weakness, then use runtime validation to prove the application actually enforces security under real identity and state conditions.
Related resources from NHI Mgmt Group
- What are the signs that API security testing is failing to catch real runtime issues?
- How should security teams structure Semgrep rules to catch high-value SAST issues without flooding developers with noise?
- Why do runtime security issues often survive static code review?
- What is the difference between SAST tools and runtime security tools for AI coding agents?