#2364·fabric

错误: 当 inline_env 设置为 True 时,通过未经过消毒的 env 变量进行命令注入

作者: themavik创建于 2026年3月19日更新于 2026年8月10日
标签BugConnection

□ 错误描述

fabric/runners.py'中,当inline env=True'(自Fabric 3.0起的默认)时,嵌入键和值被直接缩入 shell 命令字符串而没有任何逃逸。 这允许通过被刻制的嵌入值任意命令执行.

□ 代码位置

`fabric/runners.py',行~67-73:

参数= " ".join(
['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
(中文(简体) ).
命令=“导出 QQ QQ ” 格式(参数,命令)

□再现.

[Python] 从布料导入连接 c = 连接 ("本地主机") c.run ("echo hello", env={"X":"a;回声INJEECT #"). #执行:导出QQa;回声INJEEDET #QQ回声你好

输出包括"INJETED"——任意命令被执行


□ 影响

任何将用户控制或不信任的数据传递到`run()'、`sudo()'或`local()'等`env'参数的代码路径,都容易受到外壳指令注射的影响。

代码本身有一个TODO承认这一点:"逃避,如果我们能找到一个FOOLPROOF 第三方方法这样做!"

□ 建议修补

对按键和值使用 “shlex.quote()” :

```2ZZ
参数= " ".join(
['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
(中文(简体) ).

□ 环境

  • 观察最近的主要分支
  • 以`inline env=True' (默认) 代替 3.x