AI执行命令只看第一个词会出事:hmharness shellgate扫描完整命令

13 阅读3分钟

先说工具全貌:hmharness 是一个开源的 HarmonyOS/OpenHarmony 开发智能体框架,把工程创建、检查、构建、签名、安装、启动、日志读取和结果验证接成本地工具链,让 AI 不只是生成代码,还要用本机环境证明结果;自进化行为受审批、预算、canary 和回滚约束。它不是 DevEco Studio 的替代品,而是开发智能体和鸿蒙工具链之间的验证层。本文只展开其中一环:shellgate 完整命令安全门禁。

仓库:github.com/swsgbl/hmha…

让 AI 执行命令时,最容易出事故的判断往往不是“这个命令会不会失败”,而是“这个字符串里除了第一个词,还藏了什么”。只看 echo 就放行,参数里的 $(touch /x) 可能被执行;只看 find 当成查找工具,-delete 就可能变成删除;只把 date 当读取时间,date -s 却是在改时间。

hmharness 的 shellgate 处理这个问题的方式很朴素:快速通道只允许“一个裸只读动词 + 普通参数 + 零 shell 元字符”。其他形态不猜语义,直接转审批。

hmharness GitHub 仓库首页

先看判断链:完整字符串优先

shellgate 不是把命令按空格切开,再检查第一个词。它会先扫描完整命令字符串:

shellgate 的完整命令扫描链

当前公开实现里有四道关键检查:

  1. 命令不能为空;
  2. 任何位置出现 $、反引号、括号、大括号、重定向、管道、分号、&、反斜杠、引号或换行,都不进快速通道;
  3. date -s / --set 这类设置时间的形式被单独拦下;
  4. 剩余命令必须匹配很窄的只读动词表,例如 ls、cat、head、tail、df、du、ps、grep、wc、pwd 等。

所以 df -h、ps aux、cat /etc/hosts 这类探测可以少打断用户;echo $(touch /x)、ls / && rm x、find /tmp -delete 则回到审批边界。未知命令也是 fail-closed,不会因为“看起来无害”而静默执行。

15 条拒绝载荷:不是只防 rm -rf

公开测试文件把 15 条载荷全部断言为“不是裸只读探测”。这些例子比单纯列危险命令更有价值,因为它们覆盖了几类常见绕过思路:

15 条拒绝载荷分类

  • 命令替换:echo $(touch /x)、echo \touch /x``
  • 重定向:echo hi > /etc/file、echo hi >& /etc/file
  • 链式执行:ls /; rm -rf /、ls / && rm x
  • 管道进执行器:cat /etc/passwd | sh
  • 参数级执行:find . -exec rm {} \;、xargs rm、awk "system(\"rm x\")"
  • 动词本身可修改状态:find /tmp -delete、date -s 2030-01-01、systemctl restart nginx
  • 空输入和其他破坏性动词:rm -rf /tmp/x、空字符串

注意这里的表述是“拒绝快速通道”,不是宣称静态分析已经穷尽所有 shell 语义。安全边界要做的是把未知和复杂形态送回人类审批,而不是让模型猜对每一次。

它在全工具里的位置

shellgate 只是 hmharness 里的一环,不是整个产品的全部。hmharness 更大的目标是把鸿蒙开发的本地闭环交给可验证的工具链:

hmharness 全貌与 shellgate 位置

这个门禁当前有两个共享调用面:agent 的 ssh_run 工具,以及本地 Web 前端的 /api/ssh 快速通道。两边都调用同一个 kernel isBareProbe,避免“前端一套规则、代理另一套规则”的漂移。

同时,边界没有被夸大:run_command 仍然默认需要审批,并有破坏性命令拒绝墙;MCP 默认只暴露 harmony_* 域工具,还能用 HMH_MCP_TOOLS 继续收窄;Web 服务只绑定 127.0.0.1。shellgate 不是万能沙箱,也不替代宿主权限管理。

我复核过的公开证据

发布前,我重新按 2026-09-16 的公开状态做了验证:

当前公开提交、npm 与测试核对

  • 证据提交:2d83384cf601b636827492b00c982643fbb68845
  • 采集时 npm latest:@hmharness/cli@0.14.6,要求 Node >=22
  • 目标测试:shellgate.test.ts 3 个用例,3 通过,0 失败;其中拒绝载荷用例覆盖 15 条形态
  • 边界:当前干净检出的全量测试为 187 通过 / 9 失败;npm ci 因 workspace 版本与 lockfile 不同步失败,改用 npm install 后运行;仓库级 typecheck 存在 TS2307 workspace 类型解析错误
  • 验证后公开 main 已推进到 4897ef19a4b2910344d3210745f69076d83dd2a3;本文不把 2d83384 的结论外推到这个更新提交

源码与测试入口:

所以本文只声明“当前公开提交的 shellgate 目标测试通过”,不声明当前仓库全量测试全绿,也不把结论外推到未来版本或所有环境。

上手与反馈

npm install -g @hmharness/cli
hmh init
hmh tui

如果你正在评估 AI 鸿蒙开发工具,欢迎把 OS、Node、DevEco / OpenHarmony SDK、真机或模拟器状态,以及第一个阻塞点反馈到环境讨论区:github.com/swsgbl/hmha…

相关入口: