Use Case 05  ·  Security

Half these attacks were blocked. The other half just got lucky.

CodeMinder analyzed 12,759 flagged requests across one customer's ALB and WAF logs. More than half were stopped at the edge, exactly as intended. The rest reached the live application and failed only because the paths they probed didn't exist — this time. The raw evidence of all of this was already in their logs. What was missing was the conclusion: what the pattern meant, and the one change to make.

CM
CodeMinder Team
August 2026  ·  4 min read

The Structural Reality

The problem here was never a missing signal. Every fact needed to understand this was already sitting in the logs the customer's tools had produced. The gap wasn't visibility — it was context across signals: the edge knew one thing, the application knew another, and nothing had put the two together into a single conclusion and a decision.

What we found

A wave of automated probes hit one customer's application — the generic, constant background scanning every internet-facing app receives. Their tooling had flagged 12,759 of these requests. On the dashboard: one undifferentiated pile of "suspicious traffic," all of it apparently failed, all of it apparently handled.

CodeMinder read the ALB and WAF signals together — the actions_executed value, the target status, the processing time, the request paths — instead of the response code alone. Read that way, the single pile splits cleanly in two, and the two halves could not be more different.

12,759 flagged requests, split by what actually happened
56%
44%
7,169 blocked at the edge
Terminated by WAF at the ALB — they never reached the Target Group or the EC2 instances. Working exactly as designed. These can be marked resolved so they stop resurfacing as alerts.
5,590 reached the live app
Populated target IP, real processing time, and an app-level 403/404 — the request was answered by the running application instances, not stopped at the edge.

None of the 5,590 succeeded. The specific paths they probed — generic admin-panel targets like /manager/html and /manage/account/login — simply don't exist on this application, so each request failed on its own. That sounds like a happy ending. It isn't.

They didn't fail because a control stopped them. They failed because the door they tried happened not to exist. Nothing in the observed edge controls stopped these probes from reaching the application — which means the next probe would be treated the same way if it targeted a path that did exist.

The evidence was already there

A 403 or a 404 tells you nothing on its own about where it happened — both can come from the edge, and both can come from the application after the request has already arrived. When it's app-level — a populated target IP, real processing time, a real target_status_code — the payload reached your backend instances. When the edge handled it, it never did.

The evidence wasn't missing. The ALB and WAF logs already contained every signal needed to tell those apart — nobody had correlated them. A sophisticated engineer could find this by querying those logs directly. The question was never whether the data existed. It was whether anyone would turn it into a conclusion and an action.

What was actually missing

The customer's question was never "can I tell whether this one 403 came from WAF." The tools can answer that. The question was: we have 12,759 suspicious requests — what does this pattern mean for our security posture, and what should we do about it? That's a different problem, and it's the one nobody's dashboard was answering.

What the dashboard showed
12,759 suspicious requests. 7,169 blocked. 5,590 returned a 403 or 404 — all of it reading as "handled."
What CodeMinder found
Correlating ALB signals, WAF actions, response behavior, and the probed paths: 5,590 of those requests reached the live application instances. The 403/404 came from the app, not the edge.
What it meant
Those requests weren't stopped by a security control — they failed because the probed paths didn't exist. The same edge configuration wouldn't stop a probe for a path that did exist.
What the customer did
Added AWS WAF Admin Protection at the edge — turning "the path didn't exist" into "the edge stopped it."

Every one of those steps except the last is a synthesis step, not a detection step. The facts were in the logs. Turning them into 5,590 requests reached the app → this is an exposure pattern → here is the WAF rule that closes it is the work — and it's engineering decision intelligence, not security monitoring.

Prioritized action item
Add AWSManagedRulesAdminProtectionRuleSet to the Web ACL
AWS WAF's managed Admin Protection rule group (or an equivalent custom rule) is built specifically for this traffic pattern. Adding it to the Web ACL moves the block from "the path didn't exist" to "the edge stopped it" — so the 44% no longer depends on whether a probed path happens to be real. The customer added it.

Your security tools tell you what happened at the edge. CodeMinder connects that with what happened in the application.

The Core Idea

The problem isn't a lack of signals. Every fact was already in the logs. What's missing is the layer that reads them together — the edge and the application at once — and turns the pattern into one thing to do.

What this means for you

We're not competing with your WAF, and we're not claiming to see what it can't. AWS and Cloudflare will tell you, accurately, what they blocked. What they don't do is reach across the edge and the application, read the combined pattern, and hand you the engineering action it implies. That layer — above the individual tools, not replacing them — is the gap.

A pile of blocked-and-failed requests reads as one word: handled. Some of it genuinely is. Some of it only looks handled because the attack happened to miss. The signals to tell those apart already exist in your stack, scattered across systems. CodeMinder is what puts them together and tells you which is which — and what to do about the difference.

← Use Case 04
The Problem That Never Errored
Use Case 06 →
The API Was Failing. The Job Said It Succeeded.

Your signals are already there. Is the conclusion?

CodeMinder connects what your edge and your application each know into one prioritized action. Share any engineering data — we'll show you what the combined pattern means, and what to fix first.

Book a Demo →