Subscribe to the Non-Human & AI Identity Journal

What breaks when appsec relies on code review alone?

Code review alone misses the environment where most real exploits happen. Applications can look clean in source control but still fail at runtime because cloud permissions, service trust, identity boundaries, and integrations expand the attack surface. The result is false confidence. Teams need validation that checks whether the deployed system can actually be compromised, not whether the code looks safe.

Why This Matters for Security Teams

Code review is valuable, but it only proves that a change looks acceptable in source. It does not prove that the deployed application is safe once cloud roles, secrets, CI/CD runners, service-to-service trust, and third-party integrations are in play. That gap matters because many exploitable conditions only exist after deployment, when identity and configuration choices determine what an attacker can reach. The NIST Cybersecurity Framework 2.0 treats governance, identification, protection, detection, response, and recovery as connected functions, which is the right model for appsec as well.

Security teams often over-trust static findings because a clean review feels concrete, while runtime trust relationships remain implicit. The biggest miss is not always a vulnerable function, but an over-permissioned identity, a reachable admin route, or a mis-scoped secret that turns a small flaw into a full compromise. This is where appsec becomes identity and cloud security at the same time. In practice, many security teams encounter the real weakness only after an exposed service account or misconfigured deployment path has already been abused, rather than through intentional validation.

How It Works in Practice

Effective application security needs multiple checks because code review cannot observe every runtime dependency. A reviewer can see an API call, but not whether the workload identity behind it can later be abused, whether the container can reach sensitive metadata, or whether an integration token grants more access than intended. That is why modern programs pair review with dynamic testing, cloud posture validation, secrets scanning, dependency analysis, and attack-path assessment.

Practitioners usually need to ask four questions:

  • What identities does the application assume at runtime, and what can those identities access?
  • Which secrets, tokens, or certificates are present in build, deploy, and execution environments?
  • What network, cloud, and API paths become reachable once the app is deployed?
  • Can the security team prove that a control works under realistic attack conditions, not just in source?

This is where MITRE ATT&CK helps structure detection and validation around attacker behavior, while OWASP guidance is useful for mapping common implementation weaknesses to testing priorities. For cloud-heavy systems, CISA guidance is useful when validating exposure, hardening, and incident readiness. The operational goal is to test whether the deployed system can be abused through identity, trust, or configuration, not just whether the code contains obvious flaws.

Control validation should also include CI/CD, because build pipelines often carry elevated permissions and trusted access to registries, artifact stores, and deployment targets. If those paths are not included, code review can miss the very infrastructure that turns benign-looking code into a viable attack route. These controls tend to break down when microservices, ephemeral workloads, and shared cloud roles are combined, because the effective attack surface is created by runtime trust relationships rather than source code alone.

Common Variations and Edge Cases

Tighter review often increases delivery overhead, requiring organisations to balance developer speed against the assurance gained from deeper validation. The best practice is evolving, and there is no universal standard for how much code review is enough on its own. For low-risk internal tools, review may be an acceptable gate when paired with strong platform controls. For internet-facing, cloud-native, or identity-rich systems, it is rarely sufficient without runtime testing and deployment checks.

Edge cases matter. A small code change can still be dangerous if it touches a high-privilege service account, a brokered trust path, or a long-lived API key. Likewise, an application can pass review and still fail operationally if a container is granted broad egress, if a serverless function inherits excessive permissions, or if a third-party dependency introduces unreviewed behavior. In those cases, the vulnerability is not in the syntax, but in the execution context.

For teams building a stronger program, the practical move is to treat code review as one control among several. Pair it with policy checks, threat modeling, dynamic verification, and identity-aware runtime monitoring. That combination better reflects how attackers actually move through modern applications, especially when appsec intersects with IAM, privileged access, and non-human identities that hold secrets and permissions.

Standards & Framework Alignment

This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.

OWASP Agentic AI Top 10 and MITRE ATLAS address the attack and risk surface, while NIST CSF 2.0, NIST AI RMF and NIST AI 600-1 set the governance and control requirements practitioners need to meet.

Framework Control / Reference Relevance
NIST CSF 2.0 PR.AC-4 Runtime access paths can invalidate secure-looking code if identities are over-privileged.
OWASP Agentic AI Top 10 Agentic workflows amplify runtime trust and tool access beyond what code review can see.
MITRE ATLAS AI-enabled app layers can be abused through prompt and workflow manipulation at runtime.
NIST AI RMF AI risk governance needs validation of deployed behavior, not only design-time review.
NIST AI 600-1 GenAI systems need output and integration checks beyond source-level inspection.

Validate tool permissions, runtime guardrails, and escalation paths for autonomous components.