首页/教程/Clash中secret密钥不设置会有什么安全风险吗?
CLASH GUIDE

Clash中secret密钥不设置会有什么安全风险吗?

约 11 分钟阅读

Clash中设置secret密钥之前,首先检查配置文件中是否已存在secret字段,没有的话在external-controller同级位置添加secret: "强密码",密钥应至少包含16个大小写字母、数字和特殊字符的组合,避免使用常见词汇或简短密码。修改保存后重启Clash使配置生效。如果使用图形化客户端,检查General或设置页面中是否有Secret输入框,有的话直接填写即可。生效后访问管理面板Yacd或Metacubexd时会弹出密钥输入提示,填入密钥才能查看节点和状态信息。对于自动化脚本中的API请求,需要在HTTP头部添加Authorization: Bearer 密钥才能正常调用。如果之前没有设置secret且管理接口绑定在0.0.0.0,建议同时将监听地址改回127.0.0.1,减少局域网内的暴露面。对于仍在使用原版Clash for Windows v0.20.12及更早版本的用户,设置secret可以关闭CVE-2023-26190漏洞的主要攻击路径,但更彻底的方案是备份订阅链接后迁移到Clash Verge Rev等仍在维护的新版本客户端。日常使用中如果发现http://127.0.0.1:9090/version无需任何认证就能返回信息,说明管理接口处于开放状态,应尽快按上述步骤设置secret。如果长期不需要使用管理面板,也可以注释掉external-controller字段彻底关闭API接口,从根本上消除攻击面。

未授权API访问:管理接口缺乏认证保护

external-controller接口的默认开放状态

当Clash配置文件中未设置secret字段时,external-controller管理接口默认处于完全开放状态。这意味着任何能够访问该IP地址和端口的人或程序,都可以通过RESTful API获取Clash的运行状态、查看节点列表、切换代理节点甚至修改配置。在单机使用场景中,管理接口通常绑定在127.0.0.1,只有本机进程可以访问,风险相对可控。但一旦管理接口被绑定到0.0.0.0或局域网IP,同一网络下的任何设备都可以直接调用管理API,无需任何认证。

CORS跨域请求带来的浏览器风险

Clash的external-controller接口存在CORS(跨域资源共享)配置问题——它允许来自任意来源的跨域请求,这是浏览器安全机制中的“宽松”策略。当用户在使用Clash的同时浏览恶意网页时,该网页中的JavaScript代码可以向http://127.0.0.1:9090发送请求,调用Clash的管理API。由于管理接口没有secret认证,这些跨域请求会被Clash正常处理,攻击者可以在用户完全不知情的情况下通过浏览器操作Clash的全部功能。

未认证接口的信息泄露风险

未设置secret的管理接口不仅允许操作,也允许查询。攻击者可以通过GET /proxies接口获取当前所有节点名称、类型和服务器地址信息,通过GET /connections查看用户正在访问哪些网站和使用的代理节点。这些信息组合在一起可以还原出用户的网络行为模式,甚至通过节点名称推断出代理服务商的部署架构。虽然节点密码等敏感字段不会直接暴露,但服务器地址和端口信息已经构成了相当程度的攻击面情报。

远程命令执行漏洞的历史教训

CVE-2023-26190漏洞的成因与影响

Clash for Windows在未设置secret的情况下曾存在CVE-2023-26190远程命令执行漏洞。攻击者通过构造恶意网页,利用未认证的API接口向Clash写入恶意配置文件,再借助配置加载机制触发命令执行。该漏洞影响Clash for Windows v0.20.12及更早版本,攻击者可以在用户浏览网页时在后台执行任意系统命令,完全控制目标电脑。虽然该漏洞在后续版本中已修复,但继续使用未设置secret的旧版本Clash仍然存在被利用的可能。

CVE-2024-27316漏洞与XSS攻击链

后续发现的CVE-2024-27316漏洞进一步暴露了secret未设置的安全隐患。该漏洞允许攻击者通过XSS(跨站脚本)攻击方式注入恶意脚本,在用户访问恶意网站时触发Clash的配置修改和命令执行。攻击链的核心同样是利用了未认证的管理API和CORS宽松配置。未设置secret相当于关掉了Clash管理接口的最后一道大门,使得这类攻击路径畅通无阻。

漏洞修复与版本升级的重要性

上述漏洞在Clash for Windows v0.20.13及更高版本中已得到修复,修复方案包括加强API认证要求和限制CORS来源。但修复仅针对后续版本生效,继续使用旧版本且未设置secret的用户仍然面临完全相同的风险。对于已停止维护的原版Clash for Windows,即使升级到最新版本也无法获得后续安全更新,最彻底的解决方案是迁移到仍在活跃维护的Clash Verge Rev等新客户端。

局域网内未授权使用与流量盗用

绑定到0.0.0.0时的暴露风险

如果将external-controller绑定到0.0.0.0:9090以实现远程管理,且未设置secret密钥,则整个局域网内的任何设备都可以访问该管理接口。同一WiFi下的室友、同事或公共网络中的其他用户都可以通过端口扫描发现该服务,然后直接调用API切换节点或获取配置信息。代理节点流量可能被他人盗用,策略组设置可能被恶意篡改,用户却无法追溯到操作源头。

恶意脚本自动发现与攻击

局域网中可能存在自动化的扫描脚本,专门探测开放的管理端口并尝试调用API。未设置secret的Clash管理接口会被这些脚本迅速识别,随后被纳入攻击目标池。脚本可以在数秒内完成节点切换、配置篡改等一系列操作,用户甚至可能没有察觉到任何异常,因为Clash本身仍正常运行,只是流量被导向了攻击者指定的节点。这种隐蔽性使得用户很难在第一时间感知到安全事件的发生。

管理接口的探测与滥用成本

在未设置secret的情况下,调用Clash管理API不需要任何凭证,攻击者只需发送正确的HTTP请求即可。这意味着攻击的技术门槛极低,任何具备基础网络知识的人都可以通过curl命令或浏览器开发者工具完成操作。相比之下,设置secret后攻击者必须先破解或窃取密钥才能进行任何操作,攻击成本大幅上升。

配置篡改与节点替换的潜在危害

节点列表被恶意替换的后果

攻击者通过未认证的API可以修改Clash的策略组配置,将用户选中的节点替换为攻击者控制的节点。当用户访问境外网站时,流量实际上被导向了攻击者的服务器,而用户看到的节点名称可能仍然显示为熟悉的名称。这种“中间人”攻击模式下,攻击者可以记录用户访问的所有网站、窃取登录凭证和敏感信息,甚至对流量内容进行篡改后返回给用户。

代理规则被篡改导致流量泄露

攻击者还可以通过API修改Clash的路由规则,将原本应该走代理的境外流量改为直连。这种操作可能导致用户的真实IP地址暴露给境外网站,在需要保护隐私的场景中构成严重风险。同样,攻击者也可以修改规则让特定网站的流量被日志记录或重定向到钓鱼网站。由于Clash在规则修改后仍正常运行,用户很难察觉到规则已被悄然变更。

配置文件的持久化篡改

某些版本的Clash允许通过API直接修改配置文件并保存到磁盘。攻击者可以写入包含恶意节点或危险规则的配置文件,并设置开机自动加载。即使Clash重启或被用户重置,恶意配置仍然存在,形成持久化的后门。未设置secret且允许API写操作的情况下,这种风险尤为突出。

图形客户端自动生成的默认配置情况

Clash for Windows的默认行为

原版Clash for Windows在首次安装后,默认配置文件中通常不包含secret字段,管理接口绑定在127.0.0.1:9090。这意味着管理接口仅在本地可访问且未设认证,但CORS漏洞使得浏览器中的恶意网页仍然能够通过127.0.0.1发起跨域请求。用户如果不手动添加secret字段,就始终处于这种默认开放状态。

Clash Verge Rev的安全性改进

Clash Verge Rev等新版本客户端在安全性方面有所改进,部分版本默认生成带随机密钥的配置文件,或在启动时自动为管理接口分配随机secret。但仍然存在部分版本或用户自定义配置中未设置secret的情况。用户可以检查配置文件确认是否存在secret: "xxx"字段,如果不存在则需要手动添加以提高安全性。

用户主动配置与默认配置的差异

大多数用户导入的订阅配置中通常不包含secret相关字段,用户的配置是订阅文件内容与客户端默认配置的合并结果。如果用户从未主动在配置文件中添加secret,那么该字段就是缺失状态。用户需要意识到默认配置不代表安全配置,主动设置secret是对自身安全负责的必要操作。

正确设置secret密钥的操作方法

在配置文件中添加secret字段

在Clash的config.yaml配置文件中,在顶层位置添加secret: "你的强密码"字段即可启用API认证。密钥建议使用长度至少16位的随机字符串,包含大小写字母、数字和特殊字符的组合,例如secret: "k8#mP2$qL9@nR5^wX3z"。避免使用123456password等常见弱密码。添加后保存文件,重启Clash使配置生效。之后所有API请求和面板连接都需要携带该密钥才能通过认证。

图形客户端中的secret配置入口

在Clash for Windows中,可以在General页面找到“Secret”输入框,直接填写密钥即可生效,无需手动编辑配置文件。Clash Verge Rev用户可能在设置页面或配置编辑入口中修改,具体位置因版本而异。部分客户端在首次启动时会自动生成随机密钥并在界面中显示,用户可以记录或修改该密钥。如果客户端界面中没有显式的secret配置入口,则仍需要通过编辑配置文件的方式添加。

密钥变更后的同步更新

修改或新增secret密钥后,所有使用该管理接口的工具都需要同步更新密钥配置。浏览器中的Yacd或Metacubexd面板在连接时会要求输入密钥,需要更新为新的密钥值。自动化脚本中的curl请求也需要在Authorization头部中更新为新的密钥。如果在面板中输入旧密钥或未携带密钥,API会返回401 Unauthorized错误,Clash拒绝提供服务,确保未授权请求被正确拦截。

secret未设置时的应急加固措施

立即检查当前配置状态

用户可以通过在浏览器中访问http://127.0.0.1:9090/version测试管理接口是否可访问。如果返回了包含版本信息的JSON响应,说明管理接口已启用且未设置secret(或面板未携带正确密钥)。如果返回401错误或连接拒绝,则说明管理接口可能已被保护或未启用。这是快速判断当前安全状态的最直接方式。

临时关闭external-controller

如果暂时无法设置secret但担心安全风险,可以直接在配置文件中注释掉或删除external-controller字段,重启Clash后管理接口即被关闭。这样虽然失去了远程管理能力,但完全消除了API暴露带来的风险。在需要管理面板时再临时开启并设置密钥,使用完毕后再次关闭。这种“按需开启”的方式适合对安全管理要求较高的场景。

迁移到仍在维护的新版本客户端

对于仍在使用原版Clash for Windows等已停更客户端的用户,最根本的安全加固措施是迁移到Clash Verge Rev等仍在活跃维护且默认安全策略更强的分支版本。新版本客户端不仅修复了已知的CVE漏洞,部分版本还默认启用随机secret或提供了更直观的安全配置入口。迁移时只需将订阅链接导入新客户端即可,配置文件无需完全重写。

常见问题 FAQ

secret密钥不设置,Clash就一定不安全吗?

不一定。如果管理接口绑定在127.0.0.1且电脑没有恶意软件或浏览器漏洞,被攻击的概率较低。但CORS跨域漏洞的存在使得恶意网页可以绕过本地限制,因此即使绑定在本地,未设置secret仍存在理论风险。设置secret是降低风险到可接受水平的简单有效手段。

如何验证我的Clash是否已设置secret?

在浏览器中访问http://127.0.0.1:9090/version,如果返回JSON信息说明管理接口可访问且未设认证;如果返回401错误说明已设置secret且请求未携带正确密钥。也可以在配置文件中直接查看是否存在secret字段及其值。面板连接时如果要求输入密钥也说明已启用认证。

secret密钥可以设置成空字符串吗?

不可以。将secret: ""设置为空字符串等同于未设置secret,管理接口仍然开放。如果希望使用空密钥禁止访问,实际上应该删除external-controller字段关闭管理接口,而不是将secret设为空值。

原版Clash for Windows设置了secret后能完全规避安全风险吗?

设置secret可以阻止未认证的API访问,有效防范CVE-2023-26190等利用未认证接口的漏洞。但原版Clash for Windows已停更,未来可能出现新的漏洞,设置secret是当前环境下的必要缓解措施而非永久解决方案,最终仍建议迁移到活跃维护的分支版本。

使用提醒

请从可信来源获取软件与配置,并遵守所在地法律法规和相关服务条款。