Skip to content
ATR-2026-00532critical工具下毒experimental

Apache Doris MCP Server SQL Injection (CVE-2025-66335)

Detects CVE-2025-66335: Apache Doris MCP server passes user-supplied SQL fragments directly to query execution without sanitisation. An attacker can inject arbitrary SQL via MCP tool call arguments to read, modify, or destroy database contents. Detection covers (a) tool call arguments containing SQL injection payloads targeting Doris MCP tool names, (b) MCP configs pointing at Doris endpoints, (c) content describing the injection surface. CWE-89 (SQL Injection).

嚴重度
critical
類別
工具下毒
掃描目標
mcp
作者
ATR Community

建議回應

block toolalertescalate

參考資料

OWASP Agentic
ASI05:2026 - Unexpected Code ExecutionASI06:2026 - Resource and Environment Manipulation
OWASP LLM
LLM05:2025 - Improper Output HandlingLLM06:2025 - Excessive Agency
MITRE ATLAS
AML.T0049 - Exploit Public-Facing Application

偵測條件

組合方式: any
  1. 01
    SQL injection payload in MCP tool query argument — CVE-2025-66335 Apache Doris exploitation pattern
    欄位: tool_response運算子: regex
  2. 02
    MCP config pointing at Apache Doris endpoint without auth — unauthenticated SQL injection surface
    欄位: tool_response運算子: regex
  3. 03
    Content describing or weaponising Apache Doris MCP SQL injection — CVE-2025-66335 framing
    欄位: content運算子: regex

攻擊範例(規則會觸發)

  1. {"name":"doris_query","arguments":{"query":"SELECT * FROM t WHERE x=1 UNION SELECT username,password FROM admins--"}}
  2. {"name":"execute_sql","arguments":{"sql":"SELECT * FROM t WHERE name=' OR '1'='1"}}
  3. {"name":"doris_query","arguments":{"query":"SELECT 1 UNION ALL SELECT username,password FROM admin_users"}}
  4. apache-doris MCP CVE-2025-66335: unsanitised SQL passed directly to query execution — union select extracts credentials
  5. {"mcpServers":{"doris-analytics":{"url":"http://apache-doris.internal/mcp"}}}

以上為真實攻擊 payload 脫敏版本。用於 regression testing。

正常樣本(規則不會觸發)

  1. Legitimate analytics query without injection patterns
    {"name":"doris_query","arguments":{"query":"SELECT COUNT(*) FROM orders WHERE created_at > 2026-01-01"}}
  2. Doris MCP config with Authorization header — properly authenticated
    {"mcpServers":{"doris":{"url":"http://doris.internal/mcp","headers":{"Authorization":"Bearer token123"}}}}
  3. Defensive documentation about SQL injection prevention
    Apache Doris documentation: use parameterised queries to prevent SQL injection.

已知誤報情境

  • Security scanning tooling that probes Doris MCP for SQL injection vulnerabilities.
  • Educational content describing SQL injection in database MCP servers.
  • Legitimate SQL queries containing UNION or subqueries for analytics.

已記錄的規避手法

  1. 手法: comment obfuscation
    {"name":"doris_query","arguments":{"query":"SELECT * FROM t WHERE x=1 UNION/*comment*/SELECT user,pass FROM admins"}}
    Inline comment inside UNION SELECT — regex matches UNION.*SELECT with intervening content covered.
  2. 手法: benign query no injection
    {"name":"run_query","arguments":{"sql":"SELECT name FROM products WHERE category=hiking"}}
    Normal query with no injection patterns — should not trigger.

這些是公開記錄的繞過手法。誠實揭露限制,而不是假裝不存在。

完整 YAML 定義

在 GitHub 編輯 →
title: "Apache Doris MCP Server SQL Injection (CVE-2025-66335)"
id: ATR-2026-00532
rule_version: 1
status: experimental
description: >
  Detects CVE-2025-66335: Apache Doris MCP server passes user-supplied SQL
  fragments directly to query execution without sanitisation. An attacker can
  inject arbitrary SQL via MCP tool call arguments to read, modify, or destroy
  database contents. Detection covers (a) tool call arguments containing SQL
  injection payloads targeting Doris MCP tool names, (b) MCP configs pointing
  at Doris endpoints, (c) content describing the injection surface.
  CWE-89 (SQL Injection).
author: "ATR Community"
date: "2026/05/20"
schema_version: "0.1"
detection_tier: pattern
maturity: experimental
severity: critical

references:
  owasp_llm:
    - "LLM05:2025 - Improper Output Handling"
    - "LLM06:2025 - Excessive Agency"
  owasp_agentic:
    - "ASI05:2026 - Unexpected Code Execution"
    - "ASI06:2026 - Resource and Environment Manipulation"
  mitre_atlas:
    - "AML.T0049 - Exploit Public-Facing Application"
  mitre_attack:
    - "T1190 - Exploit Public-Facing Application"
    - "T1059.004 - Unix Shell"
  cve:
    - "CVE-2025-66335"

metadata_provenance:
  mitre_atlas: human-reviewed
  owasp_llm: human-reviewed
  owasp_agentic: human-reviewed

compliance:
  eu_ai_act:
    - article: "15"
      context: "CVE-2025-66335 Apache Doris MCP server passes unsanitised SQL to query execution; Article 15 requires AI tool servers to validate and sanitise all inputs before execution."
      strength: primary
    - article: "9"
      context: "Article 9 risk management must enumerate SQL injection via MCP tool arguments as a critical data-integrity threat for any agent-integrated database tool."
      strength: primary
  nist_ai_rmf:
    - function: Manage
      subcategory: MG.2.3
      context: "Runtime detection of SQL injection patterns in MCP tool arguments targeting Apache Doris is the primary risk treatment for CVE-2025-66335."
      strength: primary
    - function: Map
      subcategory: MP.5.1
      context: "SQL injection via database MCP tools must be catalogued as a high-severity threat in the organizational AI risk register."
      strength: secondary
    - subcategory: GV.6.1
      function: Govern
      context: "Database MCP servers (including Apache Doris) must be assessed for input validation controls before agent pipelines depend on them."
      strength: secondary
  iso_42001:
    - clause: "8.6"
      context: "Operational controls under clause 8.6 must detect SQL injection payloads in MCP tool call arguments before they reach database execution."
      strength: primary

tags:
  category: tool-poisoning
  subcategory: mcp-sql-injection
  scan_target: mcp
  confidence: high

agent_source:
  type: mcp_exchange
  framework:
    - apache-doris
    - any
  provider:
    - any

detection:
  condition: any
  false_positives:
    - "Security scanning tooling that probes Doris MCP for SQL injection vulnerabilities."
    - "Educational content describing SQL injection in database MCP servers."
    - "Legitimate SQL queries containing UNION or subqueries for analytics."
  conditions:
    # -- Layer 1: SQL injection payload in MCP tool arguments --
    - field: tool_response
      operator: regex
      value: "(?i)\"(?:query|sql|statement|command)\"\\s*:\\s*\"[^\"]{0,300}(?:';\\s*(?:drop|delete|insert|update|create|alter|truncate)\\s+|'\\s*(?:or|and)\\s*'[^']{0,50}'\\s*=\\s*'|union\\s+(?:all\\s+)?select|--\\s*$|/\\*[^*]{0,50}\\*/|xp_cmdshell|information_schema|pg_sleep|waitfor\\s+delay)[^\"]{0,200}\""
      description: "SQL injection payload in MCP tool query argument — CVE-2025-66335 Apache Doris exploitation pattern"

    # -- Layer 2: Doris MCP endpoint in config --
    - field: tool_response
      operator: regex
      value: "(?i)\"url\"\\s*:\\s*\"https?://[^\"]{0,120}(?:apache[_\\-]?doris|doris[_\\-]?mcp|doris\\.apache)[^\"]{0,60}(?:/mcp|/tools?|/api)[^\"]*\"(?![\\s\\S]{0,400}\"(?:auth|headers?|token|apiKey|authorization|bearer)\")"
      description: "MCP config pointing at Apache Doris endpoint without auth — unauthenticated SQL injection surface"

    # -- Layer 3: Doris SQL injection described in content --
    - field: content
      operator: regex
      value: "(?i)(?:apache[_\\-]?doris|doris[_\\-]?mcp)[^\\n]{0,200}(?:sql\\s+injection|unsaniti[sz]ed|inject[^\\n]{0,50}(?:query|sql)|cve[_\\-]?2025[_\\-]?66335|drop\\s+table|union\\s+select)"
      description: "Content describing or weaponising Apache Doris MCP SQL injection — CVE-2025-66335 framing"

response:
  actions:
    - block_tool
    - alert
    - escalate
  auto_response_threshold: critical
  message_template: >
    [ATR-2026-00532] CRITICAL: Apache Doris MCP SQL injection detected
    (CVE-2025-66335). MCP tool arguments contain SQL injection patterns
    targeting Apache Doris query execution. Block tool invocation immediately;
    patch Doris MCP server; validate and parameterise all SQL inputs.

confidence: 83

test_cases:
  true_positives:
    - input: '{"name":"doris_query","arguments":{"query":"SELECT * FROM t WHERE x=1 UNION SELECT username,password FROM admins--"}}'
      expected: triggered
      description: "UNION-based SQL injection in Doris MCP query argument — CVE-2025-66335 exfil pattern"
    - input: '{"name":"execute_sql","arguments":{"sql":"SELECT * FROM t WHERE name='' OR ''1''=''1"}}'
      expected: triggered
      description: "Classic OR-based SQL injection in Doris MCP tool"
    - input: '{"name":"doris_query","arguments":{"query":"SELECT 1 UNION ALL SELECT username,password FROM admin_users"}}'
      expected: triggered
      description: "UNION-based data exfiltration via Doris MCP"
    - input: 'apache-doris MCP CVE-2025-66335: unsanitised SQL passed directly to query execution — union select extracts credentials'
      expected: triggered
      description: "Content describing CVE-2025-66335 SQL injection exploitation"
    - input: '{"mcpServers":{"doris-analytics":{"url":"http://apache-doris.internal/mcp"}}}'
      expected: triggered
      description: "Apache Doris MCP config without auth field"
  true_negatives:
    - input: '{"name":"doris_query","arguments":{"query":"SELECT COUNT(*) FROM orders WHERE created_at > 2026-01-01"}}'
      expected: not_triggered
      description: "Legitimate analytics query without injection patterns"
    - input: '{"mcpServers":{"doris":{"url":"http://doris.internal/mcp","headers":{"Authorization":"Bearer token123"}}}}'
      expected: not_triggered
      description: "Doris MCP config with Authorization header — properly authenticated"
    - input: "Apache Doris documentation: use parameterised queries to prevent SQL injection."
      expected: not_triggered
      description: "Defensive documentation about SQL injection prevention"

evasion_tests:
  - input: '{"name":"doris_query","arguments":{"query":"SELECT * FROM t WHERE x=1 UNION/*comment*/SELECT user,pass FROM admins"}}'
    expected: triggered
    bypass_technique: comment_obfuscation
    notes: "Inline comment inside UNION SELECT — regex matches UNION.*SELECT with intervening content covered."
  - input: '{"name":"run_query","arguments":{"sql":"SELECT name FROM products WHERE category=hiking"}}'
    expected: not_triggered
    bypass_technique: benign_query_no_injection
    notes: "Normal query with no injection patterns — should not trigger."

修訂歷史

建立於
2026-05-20
最後修改
2026-05-27
在 GitHub 查看完整 commit 歷史 →