Back to all posts
7 minSecurity InsightsApril 21, 2026

Why Scanners Miss What Humans Catch

Automated security scanners are useful, but they miss the vulnerabilities that actually get exploited. Here is what scanners cannot find and why human security review still matters.

RM

Ryan Macomber

Founder, VibeSec Advisory

The security scanner promise

The pitch is compelling: run a tool against your application, get a list of vulnerabilities, fix them, and you are secure. Tools like Snyk, CodeQL, Burp Suite, and dozens of others offer automated security scanning that can analyze your code or probe your running application for known vulnerability patterns.

These tools are genuinely useful. They catch real issues. You should use them.

But they have fundamental limitations that are important to understand, especially if you are building with AI coding tools where the gap between what scanners find and what actually matters is wider than usual.

What scanners are good at

Let's start with what automated tools do well:

Known vulnerability patterns

Scanners excel at finding well-documented vulnerability patterns with clear signatures:

  • Dependency vulnerabilities: npm packages with published CVEs
  • SQL injection: detectable string concatenation patterns in database queries
  • XSS (reflected): input parameters reflected in responses without encoding
  • Missing headers: checking for the presence of security headers
  • SSL/TLS configuration: cipher suite strength, certificate validity
  • Open ports and services: network-level exposure

These are important findings. A scanner can check your entire application against thousands of known patterns in minutes. No human can match that speed for pattern-based detection.

Configuration issues

Scanners are excellent at checking configuration against best practices:

  • CORS set to wildcard (*)
  • Debug mode enabled in production
  • Directory listing enabled on web servers
  • Default credentials on admin panels
  • Permissive file permissions

Regression detection

When you run scanners regularly, they catch regressions: a vulnerability you fixed that got reintroduced. This is valuable because it happens more often than people expect, especially in fast-moving codebases where AI is generating code.

What scanners cannot find

Here is where it gets important. The vulnerabilities that actually get exploited in real-world attacks are overwhelmingly in the categories that scanners miss.

Business logic flaws

This is the most critical gap. Business logic vulnerabilities are errors in how your application implements its rules, and they look like normal, valid requests.

Example: Coupon stacking

An e-commerce app lets users apply discount codes. The scanner sees a form submission and checks for injection. Everything passes. But a human tester discovers:

  1. Apply a 20% discount code
  2. Navigate to a different page
  3. Come back to checkout
  4. Apply the same code again
  5. Total is now 40% off

The scanner cannot find this because every individual request is valid. The vulnerability is in the sequence and the server's failure to track that a code was already applied.

Example: Negative quantity

A checkout endpoint accepts a quantity parameter. The scanner checks for SQL injection in that parameter. A human tester submits quantity: -1 and discovers the application credits the user's account instead of charging them.

No scanner checks for negative quantities because the behavior is application-specific. The scanner does not know what a quantity field means in your business context.

Authorization bypasses (IDORs)

Insecure Direct Object References are the most common vulnerability in web applications, according to OWASP. They occur when a user can access another user's data by changing an ID in a request.

GET /api/invoices/1234   (your invoice)
GET /api/invoices/1235   (someone else's invoice — should be blocked)

Scanners have a hard time detecting these because:

  1. They lack user context. The scanner does not know which resources belong to which user
  2. The responses look identical. Both return valid JSON with invoice data
  3. Every request is technically valid. The endpoint exists, the ID exists, the response is 200 OK

A human tester creates two accounts, notes the resource IDs each account owns, and systematically checks whether Account B can access Account A's resources. This requires understanding the application's data model, which scanners do not have.

Race conditions

Race conditions occur when two requests processed simultaneously produce an unintended result.

Example: Double spending

A user has $100 in their account balance. They send two simultaneous withdrawal requests for $100 each. If the application reads the balance before updating it:

Ready to apply the FORGE framework?

VibeSec helps knowledge worker teams redesign their processes using the FORGE framework: Skills, Agents, Guardrails, and Schedule. Security is built in, not bolted on. Map your first process in 10 minutes.

  1. Request A reads balance: $100 (sufficient)
  2. Request B reads balance: $100 (sufficient — not yet updated)
  3. Request A deducts $100, balance is now $0
  4. Request B deducts $100, balance is now -$100

Both withdrawals succeed. The user extracted $200 from a $100 balance.

Scanners do not test for race conditions because they send requests sequentially. Finding this requires sending carefully timed concurrent requests and observing the combined result.

Chained vulnerabilities

Many real-world exploits combine multiple low-severity findings into a high-severity attack chain.

Example: XSS to account takeover

  1. A stored XSS vulnerability in user profile bios (rated Medium by a scanner)
  2. The application stores session tokens in cookies without the HttpOnly flag (rated Low)
  3. Combined: an attacker puts a script in their profile bio that steals session tokens from anyone who views the profile, achieving account takeover

The scanner reports the XSS as Medium and the missing HttpOnly flag as Low. Neither finding alone seems urgent. But together, they are Critical. Scanners do not chain findings because they evaluate each vulnerability in isolation.

State manipulation

Applications with multi-step processes (wizards, checkout flows, approval chains) can often be exploited by skipping steps, replaying steps, or modifying the order.

Example: Skipping payment

  1. Add items to cart
  2. Enter shipping address
  3. Skip the payment step by directly hitting the order confirmation endpoint
  4. Order is placed without payment

Each step endpoint is individually valid. The vulnerability is that step 4 does not verify that step 3 was completed. Scanners follow the normal flow; they do not try to skip steps.

AI-specific patterns

Applications built with agentic AI have a unique set of vulnerabilities that scanners are particularly bad at finding:

  • Prompt injection in AI features: If your app has any AI-powered features (chatbots, content generation), users can inject prompts to manipulate the AI's behavior
  • Inconsistent security across generated code: The AI implements validation in some endpoints but not others. Scanners might hit the validated endpoint and report no issues
  • Shadow functionality: AI sometimes generates endpoints, routes, or features that are not exposed in the UI but exist in the code and respond to requests

The numbers

Bug bounty programs provide real data on this gap. Looking at payouts from major platforms:

  • Business logic flaws consistently rank among the top 3 most rewarded vulnerability categories
  • Authorization bypasses (IDOR) are the #1 most common finding across programs
  • Race conditions regularly earn bounties in the thousands of dollars
  • Scanner-detectable issues (known CVEs, missing headers, misconfigurations) represent a small fraction of total payouts

The vulnerabilities that pay the most are the ones scanners cannot find. This is not a coincidence. The easy-to-find issues get fixed quickly because everyone runs scanners. The hard-to-find issues persist because they require human analysis.

The right approach: layers

Security scanning and human review are not competing approaches. They are complementary layers.

Layer 1: Automated scanning (continuous)

Run automated tools regularly:

  • Dependency scanning on every build (npm audit, Snyk)
  • Static analysis on pull requests (CodeQL, Semgrep)
  • Dynamic scanning on staging (DAST tools)
  • Header and configuration checks (securityheaders.com)

This catches the known patterns, the regressions, and the low-hanging fruit. It runs constantly and scales to your entire codebase.

Layer 2: Human security review (periodic)

Have a security professional review your application:

  • Before initial launch
  • Before major feature releases
  • Quarterly for applications handling sensitive data
  • When your threat model changes (new payment processing, new user roles, new integrations)

This catches the business logic flaws, authorization bypasses, race conditions, and chained vulnerabilities that scanners miss.

Layer 3: Ongoing monitoring (continuous)

After launch, monitor for anomalies:

  • Unusual access patterns (someone iterating through user IDs)
  • Failed authentication spikes (brute force attempts)
  • Rate limit violations
  • Error rate increases

Why this matters more for AI-generated code

AI coding tools produce code that is particularly susceptible to the vulnerability categories scanners miss:

  1. Business logic is the developer's domain. AI implements what you ask for but does not consider what could go wrong. Edge cases in your business rules are your responsibility.

  2. Authorization is consistently absent. This is the most common finding in our reviews. AI builds authentication but not authorization. Scanners check if the login page works; they do not check if User A can see User B's data.

  3. Inconsistency across the codebase. AI may implement input validation in one endpoint and skip it in another. Scanners might only test the validated endpoint and report a clean result.

  4. The developer may not understand the code. In traditional development, the developer who wrote the code understands it and can reason about edge cases. When building with agentic AI, the developer may not understand the generated code deeply enough to anticipate how it could be misused.

Frequently Asked Questions

What do security scanners miss?

Security scanners miss business logic flaws, authorization bypasses (IDOR), race conditions, chained vulnerabilities, and state manipulation attacks. These are the vulnerability categories that actually get exploited in real-world attacks, because they require understanding how your specific application works — something automated tools cannot do. Scanners check for known patterns with clear signatures; they cannot reason about what your application should or should not allow.

Are automated security scanners enough to secure my app?

No. Scanners are a valuable first layer — they catch known vulnerability patterns, dependency CVEs, missing headers, and configuration issues. But the most commonly exploited and highest-bounty vulnerabilities (authorization bypasses, business logic flaws, race conditions) are in categories scanners fundamentally cannot detect. You need both automated scanning (continuous) and human security review (periodic) for comprehensive coverage.

What is the difference between SAST, DAST, and manual penetration testing?

SAST (Static Application Security Testing) analyzes source code for vulnerability patterns without running it. DAST (Dynamic Application Security Testing) probes your running application by sending requests and analyzing responses. Manual penetration testing is a human security expert who thinks like an attacker, testing business logic, chaining low-severity findings into high-severity exploits, and checking authorization across user roles. Each catches different things: SAST finds code-level patterns, DAST finds runtime configuration issues, and manual testing finds the logic and authorization flaws that account for the majority of real-world exploits.

Why are business logic vulnerabilities so dangerous?

Business logic vulnerabilities are dangerous because every individual request looks completely valid. There is no malicious payload, no injection, no anomalous pattern for a scanner to detect. The vulnerability is in what your application allows — applying a discount twice, submitting a negative quantity, skipping a payment step — and only a human who understands your business rules can identify these as security issues. They are also the most commonly rewarded category in bug bounty programs.

Do AI-generated apps need more security testing than traditionally coded apps?

Yes. AI coding tools consistently skip authorization checks, implement security inconsistently across endpoints, and sometimes generate shadow functionality (endpoints that exist in code but are not exposed in the UI). These patterns create a wider gap between what scanners find and what actually matters. Additionally, developers using AI tools may not fully understand the generated code, making it harder to anticipate how it could be misused.


What to do next

  1. Keep running your scanners. They are valuable for what they catch.
  2. Do not equate a clean scan with security. A scan with zero findings means zero findings of the type the scanner looks for.
  3. Invest in human review for anything that matters. If your app handles user data, processes payments, or would embarrass you if it were breached, get a human to look at it.

At VibeSec Advisory, we combine automated scanning with deep manual testing. We find the business logic flaws, the authorization bypasses, and the race conditions that tools miss. If you are building with AI and want to know what a scanner will not tell you, reach out.

Weekly security tips

Actionable security insights for vibe coders, delivered every Thursday. No spam, unsubscribe anytime.

By subscribing, you agree to receive marketing emails from VibeSec Advisory. You can unsubscribe at any time. Privacy Policy

Ready to apply the FORGE framework to your team?

Map your first process in 10 minutes and get deliverables within 48 hours. No call required.