内容提要
LM Studio为AI编程助手Bionic开发了Shell Judge安全层,通过解析命令语法树和跟踪变量来评估命令风险,拦截危险操作,如git diff被变量篡改。它覆盖11,651个测试案例,处理工具参数差异。未通过的命令交由Shell Reviewer在对话上下文中评分,但仍有盲点,如假设可执行文件未被篡改,且提示注入风险存在。
延伸解读
为何静态分析不够
LM Studio指出,仅靠搜索危险字符串无法应对shell命令的动态性。变量、重定向和嵌套命令可能改变命令行为,例如git diff $base中$base若为--output=/some/file,就会写入文件。因此,Shell Judge采用抽象语法树(AST)解析命令结构,并跟踪变量值,以识别命令的“能力”(可读取或修改的内容)。
工具参数差异的挑战
不同命令行工具对参数的处理方式各异,如ls -la将-la视为多个标志的组合,而TypeScript的tsc -vh与分别使用-v和-h不同。Shell Judge需要理解每个工具的参数解析规则,这解释了为何需要11,651个测试用例来覆盖各种命令格式和工具特性。
审查模型的局限
Shell Reviewer在对话上下文中评估命令,但存在盲点:它假设可执行文件未被篡改,且不处理恶意配置。此外,提示注入风险依然存在,因为审查者会看到助手消息,若Bionic已被攻破,这些消息可能携带恶意指令。这些限制在代理获得更多自主权时尤为突出。
Q&A
LM Studio 的 Shell Judge 是什么?
Shell Judge 是 LM Studio 为 AI 编程助手 Bionic 开发的安全层,通过解析命令的抽象语法树(AST)并跟踪变量和嵌套命令来评估命令风险,拦截危险操作。
Shell Judge 如何检测危险命令?
Shell Judge 使用 mvdan/sh 解析器解析 Bash、Zsh 和 SH 命令,PowerShell 使用自身的 AST 支持。它分析命令的结构,计算命令的“能力”(即能读取或修改什么),并跟踪变量值在命令间的传递,最多跟踪 1000 个可能值。
为什么简单的字符串匹配不足以检测危险命令?
因为 shell 命令的行为会因变量、重定向和内部命令而改变。例如,`git diff $base` 中,如果 `$base` 被设置为 `--output=/some/file`,命令就会将结果写入文件,而不仅仅是显示差异。因此需要分析命令的结构和变量值。
Shell Judge 如何处理工具参数差异?
Shell Judge 需要理解每个工具如何解释参数。例如,`ls -la` 将 `-la` 视为多个标志的组合,而 TypeScript 的 `tsc -vh` 与分别使用 `-v` 和 `-h` 的行为不同。为此,LM Studio 构建了 11,651 个测试用例来覆盖这些差异。
Shell Reviewer 在什么情况下会被调用?
当 Shell Judge 无法确定命令是否安全时,命令会传递给 Shell Reviewer。Shell Reviewer 是一个独立的 AI 代理,它在对话上下文中评估命令的风险、授权和正确性,但不知道通过所需的具体分数。
Shell Judge 和 Shell Reviewer 有哪些盲点?
Shell Judge 假设可执行文件(如 git)未被篡改,也不考虑恶意配置可能改变命令行为。Shell Reviewer 存在提示注入风险,尽管它排除了工具结果,但仍会看到助手消息,如果 Bionic 已被攻破,这些消息可能携带恶意指令。
LM Studio 的 Shell Judge 在测试中清除了多少命令?
根据 LM Studio 的博客文章,Shell Judge 在没有调用其他模型的情况下清除了 Bionic 高达 82% 的命令,但作者表示这个数字是轶事性的,并非基准测试结果。