
Application security tooling is often presented as a competition: which product do you buy? The reality is that SAST, WAF, and RASP inspect your application from three fundamentally different vantage points and catch different categories of problems. Choosing between them is the wrong frame. Understanding what each one sees — and what it structurally cannot see — is how you build a program without blind spots.
This is not a vendor comparison. This is an explanation of each tool category's capabilities and limits based on where in the stack it operates.
SAST: Security Analysis Before the Code Runs
Static Application Security Testing analyzes source code without executing it. A SAST tool reads your codebase, builds an internal representation of the code's structure and data flows, and identifies patterns that match known vulnerability types. It finds a SQL query built by string concatenation and flags it as an injection risk. It finds user input flowing into a shell command and flags command injection. It finds hardcoded credentials in source files.
SAST runs in the CI/CD pipeline, typically as a build-time check. It produces a list of code locations with potential vulnerabilities. Developers review the list, fix the real issues, and mark the false positives as exceptions. Done well, SAST prevents a significant number of vulnerabilities from reaching production.
What SAST cannot do: it cannot see how the application behaves at runtime. Configuration-driven vulnerabilities — where code is safe but misconfigured infrastructure makes it exploitable — are invisible to SAST. Business logic flaws that are not code-pattern vulnerabilities are invisible to SAST. Third-party libraries that your code calls but whose source you do not analyze are partially visible at best. And SAST produces findings before deployment, which means it cannot respond to an active attack.
WAF: Traffic Inspection at the Network Edge
A Web Application Firewall inspects HTTP/HTTPS traffic between clients and your application. It reads each request, applies rules against the request content, and blocks requests that match attack signatures. ModSecurity's Core Rule Set, AWS WAF managed rules, Cloudflare's WAF rules — all operate on the same basic principle: known bad input patterns get blocked before they reach application code.
WAFs are effective at blocking commodity attacks. Automated scanners probing for known SQLi payloads, XSS in URL parameters, directory traversal strings — these show up as obvious signatures in HTTP traffic and WAF rules block them reliably. For applications that receive heavy scanning traffic from automated tools, a WAF eliminates a significant volume of noise.
WAF limitations are structural. It inspects the HTTP layer and nothing else. It does not see what your application does after it receives a request. Encrypted application-layer protocols that pass through a TLS-terminating WAF are readable, but content that the application processes internally after decoding is not. Second-order injection, as discussed in our previous post, bypasses WAFs entirely. Attacks that exploit application logic rather than input syntax — IDOR, authentication bypasses, business logic flaws — produce requests that are indistinguishable from legitimate traffic.
WAF maintenance is also substantial. ModSecurity's CRS generates false positives on legitimate application traffic that happens to contain SQL-like strings. E-commerce applications with product search, reporting tools with complex queries, applications that receive JSON payloads with SQL in them — all require tuning. WAF rule maintenance is an ongoing operational cost that many teams underestimate.
RASP: Security Inside the Running Process
Runtime Application Self-Protection instruments the application's execution environment. Instead of sitting outside the application and reading network traffic, RASP sits inside the application process and observes what the application actually does. Database queries, file system operations, network calls, subprocess executions — all intercepted at the point of execution, not at the point of HTTP receipt.
The vantage point difference changes what is detectable. RASP sees the SQL statement that is about to be sent to the database. It can verify that the statement matches a known-good template before transmission. It does not matter whether the malicious payload arrived today in an HTTP parameter or was stored three weeks ago by a different user through a different endpoint. The check happens at database execution time.
RASP also sees operations that have no HTTP request context at all. Background jobs, message queue consumers, scheduled tasks — these code paths process external data without going through a WAF. RASP instruments them the same way it instruments request handlers. If a background job processes a message queue entry that contains an injection payload, RASP catches it at query execution time regardless of how the payload arrived.
What RASP Cannot Do
RASP operates at runtime. It cannot find vulnerabilities before they are deployed — that is SAST's job. RASP also adds latency to every instrumented operation. The overhead is typically under 3ms for query-level checks in Raven.io's implementation, but it is not zero. For extremely latency-sensitive code paths (high-frequency trading logic, real-time data streams with microsecond SLAs), the overhead requires benchmarking before deployment.
RASP also requires per-language or per-runtime instrumentation. A Java agent cannot instrument a Go binary. A Node.js agent cannot instrument a C extension. Polyglot applications with multiple runtime environments need per-language RASP coverage. Raven.io supports Java (JVM), Node.js, Python, .NET, and Go — which covers the majority of enterprise application stacks — but if your application includes a PHP legacy component or a Rust service, those require separate consideration.
The Combination That Covers the Important Gaps
A practical application security stack looks like this: SAST finds vulnerabilities before they reach production. WAF reduces noise from automated scanners and provides quick mitigation for newly disclosed CVEs while patches are being developed. RASP catches what gets through — second-order attacks, novel payloads, runtime exploitation of vulnerabilities SAST missed, and attacks against code paths that WAF never touches.
The teams that run all three and integrate their alerts into a SIEM get coverage across the full threat lifecycle. SAST alerts go to developers as code review findings. WAF alerts go to the SOC as network indicators. RASP alerts go to both because runtime exploitation evidence is valuable in incident response regardless of whether it was blocked or needs developer follow-up.
When Organizations Run Only a WAF
The majority of applications we speak with at Raven.io have a WAF deployed and nothing else in the runtime layer. This is understandable — WAFs are widely understood, easy to justify to auditors, and cloud providers offer managed WAF products that are simple to enable.
The gap this creates becomes visible when an incident investigation begins. When a breach is discovered, the WAF logs show what HTTP traffic was blocked. They show nothing about what happened inside the application after any given request was allowed through. Forensic analysis of runtime activity — which queries executed, which files were read, which network connections were made — is simply not available from WAF logs. Incident response teams work from application logs and database query logs, which are typically less complete and harder to correlate.
RASP telemetry fills this forensic gap even before the detection function is fully operational. Running in observe mode — logging all operations without blocking — gives security teams a complete operational record of application behavior that is invaluable for post-incident investigation and audit compliance.
Vendor Landscape Notes
SAST tools include Checkmarx, Veracode, Semgrep, and GitHub's CodeQL. WAF products include AWS WAF, Cloudflare WAF, F5 BIG-IP, Imperva, and open-source ModSecurity. RASP vendors include Sqreen (now Datadog ASM), Contrast Security, Imperva (runtime protection module), and Raven.io.
The RASP category is younger than WAF and SAST, which is why its adoption is lower despite its stronger coverage of runtime threats. The argument against RASP has traditionally been performance overhead. That argument weakens significantly as instrumentation efficiency improves — Raven.io's overhead of under 3ms per request compares favorably to the 10-30ms overhead that gave early RASP products a poor reputation in the mid-2010s.
The tool category that gives you the most new coverage, given that most organizations already have SAST and WAF deployed, is RASP. It fills the gaps that neither of the other two can close by design.
Add the Runtime Layer to Your Stack
If you already have SAST and WAF deployed, Raven.io adds runtime detection and forensic telemetry without replacing either. Deploy alongside your existing stack in under 30 minutes.
Request a Demo