已开启
[Executor][Bash] 主 Agent 默认可绕过 NL2SQL 直接 bash sqlite3,无白名单约束 #41
henry创建于  7月7日
henry成员
7月7日 创建

现象

dataagent/core/flex/nodes/executor.py:948-991_check_bash_whitelist 只在 runtime.bash_tool_whitelist 非 None 时生效。flex_runtime_from_config.py:266-269bash_tool_whitelist 默认 None(除非 YAML 配 BASH_TOOL_WHITELIST)。

结果:主 Agent 可直接调用 bash(command="sqlite3 /path/to/db 'SELECT * FROM secrets'"),完全绕过 NL2SQL 与 schema 抽象

影响

  • 数据库查询绕过 NL2SQL 的 schema 推理、SQL 校验、错误反馈循环
  • 无审计:bash 直接执行 SQL 不留 NL2SQL 调用记录
  • 安全风险:可执行任意 SQL(包括 DROP / DELETE),不受 NL2SQL 的 read-only 约束
  • 与 henry_21st issue #5 "主Agent直接靠想象自己生产SQL,而不是通过NL2SQL子Agent来运行" 直接相关

修复方案

任选其一或组合:

  1. 默认配置白名单:在 NL2SQL 场景的 YAML 模板里默认配置 BASH_TOOL_WHITELIST,排除 sqlite3 / mysql / psql 等 DB CLI:
BASH_TOOL_WHITELIST:
  forbidden_commands:
    - sqlite3
    - mysql
    - psql
    - sqlcmd
  1. bash 工具描述强化:在 bash 工具描述里强化"数据库查询必须用 nl2sql_sub_agent_tool,禁止直接使用 sqlite3/mysql/psql"。

  2. 运行时拦截:在 _check_bash_whitelist 默认开启模式下,检测 bash 命令含 sqlite3|mysql|psql 时拒绝并提示用 nl2sql_sub_agent_tool。

涉及文件

  • dataagent/core/flex/nodes/executor.py:948-991(白名单逻辑)
  • dataagent/core/flex/flex_runtime_from_config.py:266-269(默认 None)
  • dataagent/core/flex/examples/nl2sql_flex_e2e_subagent.yaml(示例 YAML 加默认白名单)
  • dataagent/actions/tools/local_tool/tools.py(bash 工具描述)

关联

  • henry_21st/dataagent issue #5 "主Agent直接靠想象自己生产SQL"
  • henry_21st/dataagent issue #6 "nl2sql执行报错时返回为空"
  • 配合 #12(NL2SQL selector 循环回归)—— 如果主 Agent 因 NL2SQL 循环而绕过,会加重本 issue

严重性

major(安全风险 + 架构边界破坏)

环境

  • 分支:0623
  • HEAD:c5c899a4196717d1eb5944a9736f766310655ef7
likedislike
xsmqxsmq成员
7月20日 关联了看板:@hwxsmq的看板 20260720