ComfyUI 自定义节点的供应链风险怎么控:三个官方开关的取舍路径

2026-08-09

装 ComfyUI 的人,很少有人只用核心节点。工作流一复杂,节点包就一个接一个往 custom_nodes 里塞。问题是:官方在参数层面给你的,只有「加载」和「不加载」两档——comfy/cli_args.py(v0.31.0)里 --disable-all-custom-nodes 的 help 就一句「不加载任何自定义节点」,并没有提供「加载了但限制它能干什么」的中间档。至于一个包被加载之后在你机器上的边界在哪,官方文档没有给出说明,我们也不替它推断。你能做的信任判断,本质上和你对任何一份来路不明的第三方代码做的判断是同一类。

这篇不打算给你一份「安全节点白名单」——那种东西我们没有依据去写,写了也会过期。这篇只做一件事:把 ComfyUI v0.31.0(2026-08-08)在 comfy/cli_args.py 里实际提供的几个开关讲清楚,说明它们各自关掉了什么、没关掉什么,然后按你的处境倒推该开哪几个。

先说清楚这个风险不是假想的

官方仓库里有一条 issue 值得所有装过第三方节点的人知道。

社区在 issue #11791 中报告了通过 Comfy Registry 分发的名为 Upscaler_4K 的自定义节点携带 Akira Stealer 的情况,该 issue 创建于 2026-01-10,截至 2026-08-09 仍为 open

关于这条 issue,有一点必须先讲明:我们只核到了它的标题、创建日期和当前状态,没有读过正文与任何一条评论。 所以这篇文章不会告诉你那个节点具体做了什么、感染链是怎么走的、中了之后怎么清。这些我们不知道,编出来对你没好处。这条 issue 在这里的唯一作用是确立一个事实前提——「从官方 Registry 装的节点」不等于「经过安全审查的节点」,这个前提直接决定了后面每一个开关的取舍逻辑。

同样要说死的是反面:除了这条 issue 里点到的名字,本文不会、也不该点名任何其它自定义节点为「恶意」或「不安全」。 你在别处看到的那类「黑名单」,绝大多数没有可核对的出处。

顺带一提另一类风险,来源和自定义节点无关但同样影响你的实例:ComfyUI 在 2026-07-15 发布了四条 GitHub Security Advisory(GHSA-rj8c-c4p8-3c5h、GHSA-53g8-45wq-pcv8、GHSA-rvxv-29p8-pxgq、GHSA-pj59-g5vv-74q4),严重等级均为 high,修复版本均为 0.28.0。这意味着运行 0.28.0 之前版本的实例存在这四个已披露的 high 级问题。本文不含任何利用细节,你只需要知道结论:升级到 0.28.0 及以上,是这一批事实里唯一一条可以硬讲的动作。

三个开关分别关掉了什么

以下 help 语义均以 v0.31.0 的 comfy/cli_args.py 为准,参数会随版本变动。

参数help 原意
--disable-all-custom-nodes不加载任何自定义节点
--whitelist-custom-nodes NAME [NAME ...]在开启上一条时,仍然加载指定的自定义节点目录
--disable-api-nodes不加载所有 api 节点,同时阻止前端与互联网通信

第一个是核弹级的,一刀切。第二个必须配合第一个使用——help 写得很明确,它是「在开启上一条时」才起作用的例外放行,单独给它没有意义。这个设计其实挺反直觉:很多人默认白名单是个独立生效的过滤器,于是只加了 --whitelist-custom-nodes 就以为自己收窄了加载面。但 help 描述的场景是「在开启上一条时」,单独给它会发生什么,help 里没有说明——所以别把它当成一个能独立收口的过滤器来指望,要用就和 --disable-all-custom-nodes 一起给。

第三个容易被低估。--disable-api-nodes 从名字看只是「不加载 api 节点」,但 help 里跟着的后半句才是重点:同时阻止前端与互联网通信。README 的对应表述是,ComfyUI 完全离线运行,核心不会下载任何东西除非你要求;用这个参数可以关掉可选的付费 Comfy API 节点,强制所有内置功能保持离线。所以如果你的诉求是「这台机器不许自己往外连」,这个参数管的范围比字面意思大。

组合起来,一条最保守的启动方式是这样:

python main.py --disable-all-custom-nodes --disable-api-nodes

要放行你确认过的那几个目录:

python main.py --disable-all-custom-nodes --whitelist-custom-nodes <目录名A> <目录名B> --disable-api-nodes

以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 python main.py --help 的实际输出为准。

顺手能用的一招:二分法定位

这两个参数还有一个和安全无关但天天能用的用途。ComfyUI 起不来、或者起来之后行为诡异时,先加 --disable-all-custom-nodes 跑一次:

  • 起得来 → 问题在自定义节点侧;
  • 还是起不来 → 别再折腾节点了,往别处查。

确认在节点侧之后,用 --whitelist-custom-nodes 逐步放行,二分法缩到具体是哪个目录。这纯粹是由这两个参数的 help 语义直接推出来的操作,不需要任何额外工具。

顺便说一句版本层面的坑:README 的 Release Process 写明,stable release tag 之外的 commit 可能非常不稳定,会弄坏很多自定义节点。所以在你怀疑某个节点坏了之前,先确认自己跑的是不是 stable tag——不然你会花一晚上给一个不是节点造成的问题找节点背锅。

--disable-manager-ui 为什么不是「关掉 Manager」

Manager 相关有三个参数,语义差别很大:

参数help 原意
--enable-manager启用 ComfyUI-Manager 功能
--enable-manager-legacy-ui用旧版 Manager UI,源码里它会隐含 --enable-manager
--disable-manager-ui只禁用 Manager 的 UI 与端点,计划中的安装等后台任务仍会运行

后两者互斥。这里最容易读错的是 --disable-manager-ui:它不是把 Manager 关掉。help 与 README 的口径是,它只禁 UI 与端点,后台任务仍然运行,README 补充说明这些保留的后台功能包括安全检查与计划安装的完成,且需要配合 --enable-manager

这个设计的意图不难理解——把「人能点的入口」和「机器在后台跑的事」拆开:不让人在 Web 界面上随手装包,但已经排好的安装计划照常收尾、安全检查照常跑。对一台多人共用的机器来说,这比一刀切更实用。

但有一点必须讲清楚,否则你会高估它:README 只告诉我们「安全检查」这个后台任务会被保留,并没有说明它检查什么、依据什么名单、命中之后会怎么处理。 我们没有这方面的事实,所以这篇不比、也不替它背书。你不能因为「后台安全检查还在跑」就认为装进来的包被审过了。

暴露面:装了什么,和谁能碰到它,是两件事

自定义节点的风险大小,和你的实例被谁访问得到强相关。这几个默认值值得记住:

  • --listen 默认是 127.0.0.1,只听本机;但不带参数使用 --listen 时等于 0.0.0.0,::,即监听所有 IPv4 与 IPv6 网卡。很多教程为了解决「局域网访问不到」直接让你加 --listen,加完你就从「只有自己能碰」变成了「同网段谁都能碰」。
  • --enable-cors-header 不带参数时是 *,允许所有来源。
  • --max-upload-size 默认 100(MB)。
  • TLS 要求 --tls-keyfile--tls-certfile 成对给出才生效,只给一个不会启用。

另外,用户名密码认证在官方仓库仍是一个 open 的 feature request(issue #987,创建于 2023-07-27,标签为 Feature,截至 2026-08-09 仍为 open)。注意别把这句读成「ComfyUI 完全没有任何鉴权」——我们只知道这个 feature request 还开着。

如果你要在这之上加反向代理、防火墙规则或网关鉴权,那属于通用运维做法,不是 ComfyUI 官方文档内容,本文不给具体配置。

按处境选,而不是按参数选

下面是条件式结论,不是断言。

处境一:单机、只有你自己用、不开公网口。 默认的 127.0.0.1 已经限定了访问面,主要风险来自你自己装进去的东西。可行做法是:版本保持在 0.28.0 及以上;平时正常跑,装完新节点后的第一次启动加上 --disable-api-nodes,让内置功能保持离线,观察一轮再放开。真出怪事时用 --disable-all-custom-nodes 做二分法。

处境二:机器要给同事用,或者你确实加了 --listen 这时「装了什么」的风险被访问面放大了。合理的组合是 --disable-all-custom-nodes 打底 + --whitelist-custom-nodes 放行确认过的目录,Manager 侧用 --enable-manager --disable-manager-ui,让别人不能在界面上随手装包。TLS 如果要开,两个参数必须成对给。

处境三:进生产、接下游流程。 参数层面的取舍和处境二一致,但增加一条纪律:放行清单要跟版本一起管,因为 stable tag 之外的 commit 会弄坏自定义节点,你不能让线上跑在一个随时会变的引用上。还有一条真实教训值得看——0.28.0 那次安全修复(PR #14734)后来引出了一个回归,user.css 加载被弄坏了,直到两周后的 v0.30.0(2026-08-03)才由 PR #15000 修掉。安全修复本身也会带来变更,生产环境升级同样需要验证,不能因为「这是安全补丁」就跳过。

这一点官方没给数据,本文不比: 各个第三方节点包之间谁更可信、Registry 的审核流程是什么、有没有签名或哈希校验机制——这些我们手上没有任何官方依据,不做横向比较。

最后一句,也是最重要的一句

上面所有开关,做的都是收窄加载面和访问面,不是给节点做安全审查。--disable-all-custom-nodes 只保证「没加载」,--whitelist-custom-nodes 只保证「只加载了这几个目录」——至于你放进白名单的那几个目录里装的是什么,参数不知道,我也不知道。

所以不要把这篇读成「这样配置就安全了」。它只是把你的信任边界从「所有装过的包」缩小到「你亲自放行的那几个包」,剩下的判断,还是得你自己做。

延伸阅读


本文依据 ComfyUI 官方仓库(github.com/Comfy-Org/ComfyUI)的 README、comfy/cli_args.py、release notes 与官方安全公告整理,核对日 2026-08-09,对应版本 v0.31.0;文中引用的 issue 状态为该日期的快照。本文内容为官方文档与源码口径,非本机实测。参数、默认值与功能随版本变动,请以官方文档与 python main.py --help 的实际输出为准。安全公告信息来自 GitHub Security Advisories,本文不含漏洞利用细节。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。