Application security guide

SAST, DAST, IAST and SCA: what each finds and what each misses

Start with what none of them find. Broken access control, the category that has sat at or near the top of the OWASP Top Ten for years, is largely invisible to all four, because deciding whether a user should be allowed to read a particular record requires knowing your permission model and no scanner does. Everything else these tools do is useful. Buying them without knowing where the hole is leaves you confident and uncovered.

What can none of these tools find?

Authorisation errors, tenant isolation failures and business logic abuse. A scanner can see that a route exists, that a query runs and that a response returns, but it cannot see that the query was missing a predicate restricting rows to the caller's organisation. Nothing in the code looks wrong. The vulnerability lives in the gap between what the code does and what someone intended it to do, and that intent is not written anywhere the tool can read.

The same limitation covers price manipulation, replayed state transitions, workflow steps taken out of order and quantity fields that accept negative numbers. These are the findings that dominate real penetration test reports and real incidents, and they are found by people who understand the application, not by pattern matching.

Here is a test worth running this week. Take your last penetration test report, or the last three security incidents, and write next to each finding which tool in your pipeline would have caught it. Teams commonly discover that half the list has no tool against it at all, which reframes the budget conversation from buying another scanner to funding review time.

What does SAST actually prove?

That untrusted input can reach a dangerous function without passing through something the tool recognises as a sanitiser. Static analysis parses your source or bytecode, builds a model of data flow, and traces paths from sources such as request parameters to sinks such as query execution, command invocation or template rendering. When the trace completes, you have a real finding with a real path, and that is genuinely valuable for injection, path traversal, unsafe deserialisation and hardcoded cryptographic material.

Its accuracy depends entirely on how well the engine models your framework. Dependency injection, reflection, dynamic dispatch, decorators and anything that resolves a target at runtime break the trace, and the tool either loses the path or invents one. This is why the same product performs respectably on a conventional Java service and produces noise on a metaprogramming-heavy codebase, and why you should evaluate a SAST tool on your repository rather than on a demonstration application.

The practical consequence is that SAST tells you about a class of bug in code you wrote, and says nothing about configuration, deployment or the routes that were left unauthenticated. It also cannot tell you whether the vulnerable path is reachable in production, because it has no idea which routes are exposed.

What does DAST actually prove?

That the application, as deployed, responds badly to hostile input at a URL the scanner could reach. Dynamic testing sends requests and reads responses, which gives it two things static analysis cannot have: it tests the real configuration, including headers, cookie flags, TLS settings and redirects, and every finding is by definition reachable, because the tool just reached it.

Reachability is also the constraint. A DAST run is bounded by what the crawler discovered, and modern applications are hostile to crawlers. Single-page front ends, multi-step flows, forms with server-side tokens, anything behind a login and anything that requires a valid business state will be skipped silently. The scanner does not report the pages it failed to find, so a clean report from a shallow crawl looks identical to a clean report from a thorough one.

That makes authenticated scanning the whole game. Before you trust a DAST result, check what proportion of your route table the run actually touched. If the tool cannot tell you, the number you have is coverage-unknown, and treating it as an assurance is the mistake.

How do the four families compare?

They differ in what they observe rather than in quality, which is why the sensible question is what each one is evidence of. The table also includes the two scanners most teams actually run daily, image scanning and secret detection, because in practice they are part of the same pipeline decision.

ToolWhat it observesStrongest findingCannot seeCoverage limited by
SASTSource or bytecode, without running itInjection with a traceable pathConfiguration, authorisation, reachabilityHow well it models your framework
DASTThe running application over HTTPMissing headers, exposed endpoints, real misconfigurationAnything the crawler never reachedCrawl and authentication quality
IASTReal data flow inside the runtime during testsConfirmed taint paths with very low noiseCode paths your tests never executeYour existing test coverage
SCAManifests and lockfiles against advisory databasesKnown vulnerable dependency versionsFlaws with no published advisory yetAdvisory data and lockfile accuracy
Container image scanningInstalled OS and language packages in a built imageOutdated base image contentsWhether the package is ever loadedBase image choice and rebuild frequency
Secret scanningCommits, history and image layersLive credentials, which are near-certain findingsSecrets that never touched the repositoryWhether history and images are both scanned

Where do IAST and SCA earn their place?

IAST earns it on accuracy. An agent loaded into the runtime watches actual values move through actual calls while your tests run, so a reported taint path happened rather than being inferred. False positives drop sharply compared with static analysis. The trade is stark: coverage equals test coverage, so a service with thin integration tests gets a thin security result, and the agent has to support your runtime version.

SCA earns it on volume of real risk. Most code in a modern application was written by somebody else, and known vulnerabilities in that code are published, indexed and trivially exploitable once a proof of concept circulates. Composition analysis reads your dependency graph and matches it against advisory data, which is the single highest-yield automated check available to most teams.

Its weakness is that it reports presence, not exposure. A vulnerable library that is installed but never imported produces the same alert as one on your request path. Tools that add reachability analysis, tracing whether your code can actually call the affected function, cut the actionable list dramatically, and that capability is worth more than any difference in database size.

Which one should you buy first?

Secret scanning, then SCA, in that order, and both before anything else. Secret detection has almost no false positive problem when configured to verify credentials, and a leaked live key is an active compromise rather than a theoretical weakness. SCA follows because it addresses the largest volume of genuinely exploitable, already-public risk and needs no application knowledge to interpret.

SAST comes third, scoped to the sink categories you care about rather than every rule the vendor ships, because an unfiltered first run on an established codebase produces a backlog nobody will process. DAST is worth adding once you have a staging environment that can be authenticated into reliably. IAST is a refinement for teams with strong automated tests, not a starting point.

None of that addresses the access control gap, so budget for review as a line item rather than hoping tooling covers it. A short, focused review of authorisation checks on your highest-value endpoints, done by someone who understands the domain, finds a class of bug that no purchase will.

Common questions

What is the difference between SAST and DAST?
SAST analyses code without running it, tracing paths from untrusted input to dangerous functions, so it can point at a specific line but cannot tell whether that path is reachable in a deployed system. DAST exercises the running application over HTTP, so every finding is reachable by definition and configuration problems become visible, but it only covers what its crawler managed to discover and authenticate into.
Can security scanners find broken access control?
Largely no, and this is the most important limitation to understand. Deciding whether a given user should be able to read a given record requires knowing your permission model, which no scanner has. Missing tenant predicates, object references that skip an ownership check and workflow steps taken out of order all look like correct code. This category needs human review or targeted testing, not another tool.
Is IAST better than SAST?
It is more accurate and less complete. IAST instruments the runtime and observes real data flow while your tests execute, so reported paths actually happened and false positives are far lower. But it only sees code your tests exercise, so coverage is inherited from your test suite. SAST reads everything regardless of tests, at the cost of inferring paths it cannot confirm.
Do you need both SCA and container image scanning?
In practice yes, because they read different inventories. SCA reads your application manifests and lockfiles, covering the libraries your code imports. Image scanning reads the packages installed in the built image, including the operating system layer you inherited from a base image. A vulnerable system library will not appear in your lockfile, and an unpinned transitive dependency may not appear in the image inventory.
Which application security tool should a small team buy first?
Secret scanning, then software composition analysis. Secret detection produces few false positives and each true finding is an active compromise requiring rotation. Composition analysis covers the largest volume of publicly known, readily exploitable risk and needs no application-specific knowledge to triage. Static analysis is worth adding third, scoped to a few rule categories rather than everything the vendor enables by default.
How do you tell whether a DAST scan covered enough?
Compare the URLs the scanner requested against your application's route table. Dynamic scanners do not report the pages they failed to discover, so a shallow crawl and a thorough one produce identically clean-looking results. If the tool cannot show you which routes it reached and whether it stayed authenticated throughout, the coverage is unknown and the report is not assurance.

More on Application security

Let’s create something out of this world together.

Have a project in mind? Contact us for expert design and development solutions. Let’s discuss how we can help grow your business.

Azaadi Offer

Claim a free security assessment

Until 31 August we're covering the cost of a full vulnerability assessment and penetration test. Mention it in your message and we'll scope it with you.

  • Web application testing, authenticated and unauthenticated
  • Mobile application testing across iOS and Android
  • External network and infrastructure assessment
  • Manual exploitation by engineers, not scanner output

Testing and the report are free. Fixing what we find is quoted separately, with no obligation to accept.

Read the full offer

Tell us what you are trying to build and we will tell you plainly whether we are the right people for it. Book a call with an expert to work through the detail, or ask for a fixed quote if the scope is already clear. No obligation either way.

Four fields is all we need to get started.

Fastnexa Logo

© 2026 fastnexa. All rights reserved.