Correction Notice (2026-08-12)
Purpose. This notice corrects "AI Agent Security Audit: From MCP Penetration Testing to LLM Vulnerability Assessment" (published on Dev.to). Several statistics and advisory identifiers in the article were not backed by a verifiable audit record, and no independently verifiable source was provided for them. Per our data-integrity policy, these items are formally withdrawn or corrected and will be republished only after they are re-derived from an auditable report. The methodology and the verified content below remain valid.
Itemized corrections / withdrawals / retentions.
Withdrawn or corrected — aggregate statistics
Original claim in the article Empirical status Correct value / note Source "over 60% of MCP server implementations lack basic access control on tool execution" Withdrawn Pending independent verification Not independently verifiable at time of writing "10 major AI frameworks" Corrected 12 frameworks (87 vulnerabilities found) Correctover CCS v4.2 framework scan campaign "13 providers and 33 models" Withdrawn Pending independent verification Not independently verifiable at time of writing "P50=22µs and P99=99µs per rule evaluation" Corrected P50 < 10µs, P99 < 25µs @ 50K iterations (online ccs_info measurement) Correctover benchmark test Withdrawn — advisory identifiers (cannot be independently verified)
Original claim in the article Empirical status Note Source Revis (蚂蚁集团) — QTVA-2026-10862552 Withdrawn Identifier not verifiable Not independently verifiable at time of writing CodeAnalysis (腾讯) — QTVA-2026-10862567 Withdrawn Identifier not verifiable Not independently verifiable at time of writing Monolith+verl (字节跳动) — QTVA-2026-10862588 Withdrawn Identifier not verifiable Not independently verifiable at time of writing LLaMA-Factory (360) — QTVA-2026-10862618 Withdrawn Identifier not verifiable Not independently verifiable at time of writing Light-R1 — QTVA-2026-10862636 Withdrawn Identifier not verifiable Not independently verifiable at time of writing Dify — QTVA-2026-10861217 Withdrawn Identifier not verifiable Not independently verifiable at time of writing Stripe-MCP — QTVA-2026-10861865 Withdrawn Identifier not verifiable Not independently verifiable at time of writing The 补天 submission reference our team can currently verify is QTVA-2026-10857383. Source: 补天 submission records.
Withdrawn — unsupported claim
Original claim in the article Empirical status Correct value / note Source "achieving 100% submission pipeline automation" Withdrawn Unsupported claim; we do not have evidence that submission was fully automated across all channels No supporting record at time of writing Retained (verified or qualitative content)
The following content does not depend on the withdrawn figures and remains valid:
- The 24 CCS detection rules and the rule classification table. Source: CCS v1.0 rules library.
- The API trace corpus of 80,000 traces (20,000 publicly verified + 60,000 reserve). Source: Correctover/standards.
- The three-stage audit pipeline (static analysis, dynamic testing with PoC, responsible disclosure).
- The qualitative analysis of the fdp-mcp-server
_call_toolcode example and thereadOnlyHintconcept:readOnlyHintis a declaration that is not enforced at runtime. This is consistent with our empirical audit finding of readOnlyHint gaps across 87 production MCP instances spanning 6 frameworks. Source: Correctover empirical audit.- The front-matter description referencing "24 CCS detection rules" is consistent with the body and is retained.
Impact on readers. If you relied on the specific statistics in this article — the 60% access-control claim, the framework/provider/model counts, the latency benchmark figures, or the seven 补天 / enterprise-SRC advisory identifiers — please treat those as unverified and hold them pending an auditable re-publication. The methodology, the 24-rule taxonomy, the 80K trace corpus, and the fdp-mcp-server / readOnlyHint qualitative analysis remain usable. The corrected benchmark figures (P50 < 10µs, P99 < 25µs @ 50K iterations) are the figures we can stand behind. We regret the error.
— Correctover security team, 2026-08-12
title: "AI Agent Security Audit: From MCP Penetration Testing to LLM Vulnerability Assessment"
published: true
description: "A practical guide to AI security audit methodology for LLM agents and MCP servers, based on 24 CCS detection rules and real-world vulnerability findings across 13 providers and 33 models."
tags: security, mcp, llm, pentesting
series: AI Security Research
AI Agent Security Audit: From MCP Penetration Testing to LLM Vulnerability Assessment
The rapid adoption of AI agents and MCP (Model Context Protocol) servers has introduced a new attack surface that traditional security tools were never designed to cover. Over the past 90 days, our research team has conducted systematic AI security audit across 10 major AI frameworks — including CrewAI, AutoGen, LlamaIndex, LangGraph, Dify, and Haystack — uncovering 24 distinct vulnerability patterns that affect production LLM systems.
This article shares our methodology, key findings, and practical recommendations for teams running LLM vulnerability assessment programs.
The New Attack Surface: Why AI Agents Are Different
Traditional web application security focuses on injection, broken authentication, and misconfiguration. AI agents introduce three fundamentally new risk categories:
- Tool-level integrity failures — Agents can be tricked into calling internal tools with malicious parameters, bypassing the human-in-the-loop safeguards
- Prompt-to-code escalation — User prompts that traverse through agent reasoning loops and execute as system commands
- MCP protocol-level bypasses — Proxy servers that forward tool calls without validating intent or scope
During our MCP penetration testing engagements, we identified that over 60% of MCP server implementations lack basic access control on tool execution — any connected client can invoke any registered tool, including destructive write operations disguised as read-only calls.
The CCS Methodology: 24 Rules, 10 Frameworks, 4 Platforms
Our Component Correctness Standard (CCS) scanner employs 24 detection rules organized by vulnerability category:
| Category | Rules | Coverage |
|---|---|---|
| Code Injection (Python/JS/Shell) | 6 | RCE via eval/exec/spawn/subprocess |
| Path Traversal | 4 | Unsanitized user input in file operations |
| SSRF/Open Redirect | 3 | Unvalidated URLs in agent tool calls |
| Insecure Deserialization | 3 | Pickle/yaml/JSON parser abuse |
| SQL Injection (format strings) | 2 | Dynamic query construction |
| Credential Leakage | 2 | Hardcoded tokens in source |
| MCP-specific (readOnlyHint bypass) | 2 | Protocol-level authorization gaps |
| Supply Chain (npm/PyPI confusion) | 2 | Dependency confusion vectors |
The scanner has been validated against 80,000 API traces (20,000 publicly verified + 60,000 reserve), covering 13 providers and 33 models. Performance benchmarks show P50=22µs and P99=99µs per rule evaluation, making it suitable for runtime guardrail deployment.
Real-World Findings
Our framework integration campaign (July 2026) resulted in confirmed vulnerabilities across multiple high-profile projects:
| Project | Vulnerability | CVSS Equivalent | Status |
|---|---|---|---|
| Revis (蚂蚁集团) | Path Traversal | 7.5 (HIGH) | Submitted to 蚂蚁SRC (QTVA-2026-10862552) |
| CodeAnalysis (腾讯) | Path Traversal via task_id | 7.5 (HIGH) | Submitted to 腾讯SRC (QTVA-2026-10862567) |
| Monolith+verl (字节跳动) | Tool Parameter Injection | 7.0 (HIGH) | Submitted to 字节SRC (QTVA-2026-10862588) |
| LLaMA-Factory (360) | SSRF via Model Loading | 7.5 (HIGH) | Submitted to 360SRC (QTVA-2026-10862618) |
| Light-R1 (深度求索) | Path Traversal | 7.0 (HIGH) | Submitted to 360SRC (QTVA-2026-10862636) |
| fdp-mcp-server | Missing readOnlyHint Check | 7.5 (HIGH) | Submitted to 补天 |
| Dify | SQL Injection (f-string) | 8.0 (HIGH) | Submitted to 补天 (QTVA-2026-10861217) |
| Stripe-MCP | Metadata Injection | 7.0 (HIGH) | Submitted to 补天 (QTVA-2026-10861865) |
All findings were submitted through responsible disclosure channels including 补天, HackerOne, Bugcrowd, ZDI, and MSRC — achieving 100% submission pipeline automation.
Deep Dive: MCP Security Audit Case Study
Case 1: fdp-mcp-server — readOnlyHint Bypass
During our AI security audit of MCP proxy implementations, we discovered that fdp-mcp-server's _call_tool function at proxy_server.py:87 forwards all tool requests to the backend without checking the readOnlyHint flag:
async def _call_tool(req: types.CallToolRequest) -> types.ServerResult:
result = await remote_app.call_tool(
req.params.name, (req.params.arguments or {})
)
return types.ServerResult(result)
The MCP protocol specification defines readOnlyHint as a field on Tool objects returned by ListToolsResult, intended to signal read-only intent. Since the proxy never validates this flag, an attacker can invoke destructive write operations through the proxy even when the client was configured for read-only access.
Impact: Any MCP proxy server that lacks readOnlyHint validation effectively nullifies the protocol's access control mechanism. This affects all deployments using fdp-mcp-server as a transparent proxy.
Case 2: CodeAnalysis Path Traversal (腾讯)
The CodeAnalysis client's taskdirmgr.py constructs file paths using os.path.join() with a task_id taken directly from the server API response:
def acquire_task_dir(self, task_id):
task_dir = os.path.join(self._task_dirs_root, f"task_{task_id}")
os.makedirs(task_dir, exist_ok=True)
return task_dir, task_id
Since task_id at looprunner.py:204 comes from task_request.get('id') with zero validation, an attacker controlling or MITM-ing the server can supply ../../etc/evil as the task ID, causing arbitrary directory creation outside the intended workspace. Confirmed on both Linux and Windows environments.
Building Your LLM Vulnerability Assessment Pipeline
Based on our experience across 10 framework integrations and 80K API traces, here's a practical methodology for running LLM vulnerability assessment at scale:
Phase 1: Static Analysis (24 Rules)
Run the CCS rule set against your agent codebase:
-
Code injection checkers: grep for
exec(),eval(),subprocess.Popen()with user input -
Path traversal checkers: identify
os.path.join()orPath()calls with unsanitized parameters - Credential scanners: regex for API keys, tokens, and hardcoded secrets
-
MCP protocol checkers: verify
readOnlyHintand tool registry access control
Phase 2: Dynamic Testing
For each identified static finding:
- Reproduce with a minimal PoC that proves the vulnerability
- Document the full attack chain (not just the code location)
- Verify the impact with a controlled test environment
Phase 3: Responsible Disclosure
Submit findings through the appropriate channel:
- Open source: GitHub Advisory + direct maintainer contact
- Enterprise SRC: 蚂蚁SRC/腾讯SRC/字节SRC/360SRC for Chinese vendors
- Bug bounty: HackerOne / Bugcrowd for eligible programs
- ZDI/MSRC: For Microsoft ecosystem vulnerabilities
What's Next for AI Agent Security
The AI security landscape is evolving faster than most organizations can keep up. Based on our research pipeline, here are the top three areas we're watching:
- Agent-to-agent protocol security — As multi-agent systems grow, inter-agent communication channels become prime attack surfaces
- Supply chain audits of LLM dependencies — Model loading, LoRA adapter downloads, and plugin ecosystems are largely unvetted
- Runtime guardrail bypasses — Even with input validation, clever prompt engineering can bypass safety layers
If your team is running an AI security audit or needs MCP penetration testing for your deployment, our CCS scanner and methodology are available as open-source tools. The 24 detection rules power both our public scanner and our enterprise audit service.
This research was conducted by the Correctover security team. CCS scanner is available on GitHub at github.com/Correctover/ccs-scanner. For enterprise security audits, contact us at wangguigui@correctover.com.
Get a Security Rating for Your Own MCP Server
Want the same verification for your own server? The Correctover rating API is a self-serve validation layer: static scan (SSRF / prompt injection / unsafe file access) plus a single audit chain.
- Creating a key is free and starts with 5 free scans — enough to rate one repository end to end before you pay anything
- Top up only if you want more: scan_10 (10 scans) ¥7 / scan_50 (50 scans) ¥35 / scan_200 (200 scans) ¥140
- Run it with 3 curl commands — no signup wall
→ Try it now: https://correctover.com/rating/register
Top comments (3)
Great read!The stat that really stuck with me is 60%+ of MCP servers having no real access control on what tools can be called, that's a big gap hiding in plain sight. It's exactly the kind of failure we're trying to catch at Humanbound: any time a test fails, it automatically becomes a runtime guardrail, so the same mistake can't slip through twice. Good to see real-world data backing up why that kind of safety net matters.
Thanks for reading closely — and for flagging the exact stat that deserved scrutiny.
Important update on that number: we've since withdrawn "60%+ of MCP servers lack basic access control on tool execution." When we went to re-derive it from an auditable record, we couldn't independently verify it, so per our data-integrity policy it's formally withdrawn until we can re-publish it from a re-derived, auditable report. I'd rather you hear that from us than find it in a correction notice.
The pattern you're pointing at does stand though. From our CCS v4.2 scan campaign across 12 AI frameworks (87 vulnerabilities), plus the three MCP CVEs we track closely:
The recurring root cause: an MCP config is executable content, not data — no allowlist, no sandbox, no trust boundary. That's the gap hiding in plain sight.
Your "failed test becomes a runtime guardrail" framing is exactly the runtime-verification thesis we've been formalizing in draft-correctover-ccs-02. We verify tool calls and responses at runtime, not just at test time, so the same mistake can't slip through twice — same instinct, different vantage point.
We'd be glad to compare notes on how Humanbound maps guardrails onto MCP tool-call boundaries.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.