ClashScan
(推荐使用最新 Chrome 内核浏览器) mikewang000000.github.io/ClashScan/
代码开源在 GitHub ,页面部署在 GitHub Pages 上。

Clash 是一个比较常见的代理软件,有很多衍生版本和 GUI 程序。
不过我最近才发现它是允许 CORS (跨域)的,这带来了不小的安全隐患。
再加上很多 GUI 默认不加 Secret 进行身份验证,即使运行在 127.0.0.1 ,也能被外部网站随时调用。
如果您没有修改默认配置,值得检测一次。

默认配置下容易检测的:Clash Verge / Clash Verge Rev / ClashX / ClashX Pro / ClashX Meta
默认配置下相对安全的:最新的 Clash for Windows / Clash Nyanpasu

在手机上不能用?没看见有按钮

好慢的扫描

探测 127.0.0.1 的,循环端口。。。scannedPorts++; 难怪这么慢

确实是个大问题

草,这确实有点危险了

手机端不用扫了(检测电脑端的 实际上常用端口排在最前面的,十秒内没扫到基本上是安全的。后面虽然会扫整个 65535 ,实际因为浏览器性能低,而且会漏,作用不大。只是作为理论参考。

openclash 透明代理没有检测到

透明代理等不在 127.0.0.1 上的不会检测到。本质是探测 Clash 在本机的 API 端口。

太慢了,懒得等了

这 Chrome 为啥不阻止网站访问 127.0.0.1

哦扫描本地端口啊 我代理都是在局域网的.. 电脑上啥都没装(

应该改什么配置

那怎么避免呢???如何修改默认配置?

有点吓人哦,怎么把我服务器的配置给读出来了?什么原理?

一个解决方法:使用 NoScript 浏览器扩展屏蔽网页对本地网络发起的请求

路由上跑的,检测不到

原理是默认端口,并且 API 没有上密码,就被读了。在 yaml 里面,修改下面两个配置:external-controller: '127.0.0.1:9090'secret: 'xxxxxxx'把 7890 改成随机高位端口,避免扫描; secret 改为随机密码(如果没有这个配置手动加上)。---如果被检测并读出服务器配置了,那么你之前可能一直在裸奔(

1 clash 核心默认打开外部控制功能2 clash 核心的外部控制功能就是允许跨域的(不然无法使用第三方的外部控制功能 GUI3 浏览器必然是允许第三方网站读取局域网 ip 资源的4 设置外部控制功能的密钥其实让这些软件提供个开关切换 启用 / 禁用外部控制功能 即可解决这个问题,楼主的项目正好引发了这个需求

#10 > 这 Chrome 为啥不阻止网站访问 127.0.0.1一个是本地调试很多都是在 127.0.0.1 ,另外就是向 QQ 一键登录等功能实际上也是在 127.0.0.1 上的,不过它的接口有鉴权。

不是很懂这个原理,不过我的没扫描出来。PC 本地跑 tun 模式。

clash 的 gui 你点击打开,相当于在本机运行了一个程序在 127.0.0.1 的某个端口,知道一些 clash 的内部接口,比如获取节点的,然后调用这个接口可以了。 127.0.0.1:9097/proxies 比如这个接口,就可以获取 clash 的所有代理节点

诸君,刚刚实测把外部控制端口设置为 0 ,即可解决这个问题,clash verge rev 提供的第三方 webui 也无法访问到 clash 核心的数据了代理功能依然可用,但不确定这些 gui 软件是不是也使用外部控制来控制 clash 核心的,所以把这个信息发出来让大家参与找出 [把外部控制端口设置为 0] 会不会引起其它问题

我看了目前在用的机场给 clash 下发的配置都开了这个 external-controller 还是用的默认 9090 端口没加鉴权,这么大个漏洞居然现在才发现( ╯□╰ )

#22 好吧,初始阶段没有找到后我就发表了以上回复,但是后续缓慢扫描阶段还是读取出在使用 clash ,上面那个回复当我没发😂😂

#24 原因:设置 0 端口后,clash 核心就使用随机端口作为外部控制端口了

127.0.0.1 的还好openclash 那个如果不是 127.0.0.1 的才危险

这速度也太慢了

再加个把常见网关地址都扫了

其实我觉得问题不大,上上外网又不是什么杀头的罪,真要较真,运营商那什么都能查到。

貌似原理是循环请求?因为默认配置无加密,所以请求成功了就知道用户使用了代理软件,甚至根据 api 获取完整配置信息。因为我修改了控制台的密码,所以检测不出来。但是我记得如果有密码,HTTP 的响应好像是 403 还是什么来着,而不是无响应,能不能也根据这个判断是否使用了代理类软件。。。

用手机 chrome 请求电脑版网页,能检测出来。。

是的,加了密码也能扫出来。不过浏览器扫效率太低了,您看上面有很多说慢的(另外连接数高了也会失败(漏掉)。所以加密码和高端口算是安全的。

手机版 Clash 也能读出来吗(捂脸)出乎意料了。按钮问题是主题设计的,我有空改下。

这么说本机加个防火墙是不是就好了?

所以感觉不是改 7890 端口。而是 external 相关配置咯,端口和 secret

#17 #23 是的。我 #17 写的 external-controller 默认应该是 9090 。最好 7890 和 9090 两个一起改了。浏览器一定条件下也能检测 7890 端口的情况,不过读不到东西。

感觉和好久之前提过的这个情况类似?不过看起来是没什么人重视 www.hesudu.com/t/946991

把 web 控制直接改成其他地址就行了,比如 127.0.0.2 ,关掉这个控制功能。没密钥的控制端口,来点漏洞都可以注入攻击了。

还以为是什么高端的骚操作,原来只是扫本机的 clash 的 webui 和 proxy 端口……

singbox 没扫出来.其实把常见的客户端端口 9090 9999 之类的扫一扫就行了

现在还有一个问题是 Clash Verge Rev 之类的 GUI 客户端覆写了这部分设置,secret 没有生效。你需要去 GUI 界面的设置里调整一下对应的 WebUI 设置。

  1. 本站曾经有人提醒过 /t/946991 ,我可能也在一些回复里提醒过2. 想跑题联动一下近期的一个热门帖 /t/1075187 ,不知道有没有哪些朋友看那个帖子 OP 和 提到的安全隐患觉得不以为然,然而在这个帖子一测试又觉得有被吓到😂

我加了 secret ,接口是 401, 也认为我使用了吗

不准,我没用 clash 也能检测成 clash

#43 是的,即使有密码,返回 401 也能检测到。请求记录里这些接口会返回 401 ,然后你访问一些其他的路径会返回 404 。通过这些接口路径特征,能推断出 Clash 及其版本号。#44 有一定的推断逻辑在里面,可能你的环境刚好命中特征了。会有误报的可能。

sing-box.sagernet.org/zh/configuration/experimental/clash-apiaccess_control_allow_origin自 sing-box 1.10.0 起允许的 CORS 来源,默认使用 。要从公共网站访问私有网络上的 Clash API ,必须在 access_control_allow_origin 中明确指定它而不是使用 。access_control_allow_private_network自 sing-box 1.10.0 起允许从私有网络访问。要从公共网站访问私有网络上的 Clash API ,必须启用 access_control_allow_private_network 。

我用的局域网当中的某台机器部署的 clash 暴露出来的 http/https/socks5 代理,然后使用 switchy omega 插件添加 socks5 proxy profile 的。没有检测到 clash

检测到了,订阅信息都出来了。

再加几个常用的路由/旁路由网关地址

是时候写个蜜罐了,看看是谁偷偷检测了 clash

我还以为能扫到我旁路由上的 clash ,结果啥都没监测到

蜜罐已经自动化利用 cfw 漏洞了...更别说扫描 clash 端口

firefox 上被 uBlock Origin 拦截了,关了 ub 之后也被 CORS 拦截了不会真有人不加密码跑在公网上吧 en.fofa.info/result?qbase64=ImV4dGVybmFsLWNvbnRyb2xsZXI6IDkwOTAi

TLDR: 如果没开管理端口 secret ,会直接扫出正在打开的网站和节点名称和地址信息开了 secret 能知道你在用,但无法获取隐私信息

被检测到了

能不能用外行也能看懂的话来描述一下,到底有什么风险?
img

你们说的什么外部控制端口?在哪里设置?我只知道 7890 那个。

#56 部分 clash 客户端,默认配置下(默认端口,无密码验证):1. 即使 clash 端口不暴露外部,运行在本地,外部网站也能通过网页调用,读取或者修改 clash 配置;2. 如果是老版本 clash 核心,利用这种方法,还可以配合( CVE-2023-24205 )漏洞,控制整台电脑。如果加了密码,但保持默认端口:1. 外部网站也能通过网页调用,根据不同的报错情况,推断出你在使用 clash 。================#57 好的反馈!我在 macOS Safari 上测试了一下,Safari 不允许从 https 页面上发起 http 请求。所以是检测不到的。但是如果 GitHub Pages 是 http 的,那就可以调用了。

#58 说的是 9090 的 api 端口,verge 默认是 9097 。

配置文件里设置 secret 还没用,要在设置里添加才行,订阅拉取的配置文件被软件覆盖掉了

被检测到了,要怎么搞?

打开控制台发现全被 uBlock Orign 拦截了
建议在检测页上稍微写一点技术原理,比如这个页面仅仅是通过扫描 127.0.0.1 、遍历端口号的方式查找 clash 及其衍生分支所使用的 external-controller 来确认是否正在使用 clash 。 而不是仅神秘兮兮一句”任何网站都能检测您是否正在使用 Clash 。“,这种表述只会给不明所以的吃瓜群众带来不必要恐慌。很多情况都会影响判断结果,并且也不一定会造成实际危害。比如 uBlock 之类的拦截器订阅了 Block Outsider Intrusion into LAN 之类的规则,或者干脆浏览器安全策略就直接禁止 FQDN 网站向私有 IP 发起网络请求,并且还有可能各种 GUI 面板给 external-controller 设置了随机密码等等等等实际完全没有危害的情况。

跨域不被挡吗?

算是挺恶性的漏洞了,clash-verge-rev 默认情况下不设置 secret 是没想到的,建议开个 issue 跟开发者反馈一下

#25 我改成 0 ,并且把密码设置了,貌似可以了。

扫描了一个小时 50% 虽然我不用 clash 哈

最新的 Clash for Windows ?什么时候更新了,我还在用很早的版本

把 clash api 的端口给 block 就监测不出了

还好还好

未发现 Clash,但我是用了的,而且就在 127.0.0.1:7893

测了一下,无法发现linux 环境,Clash 在 windows 里,两台物理机

这个被人讲出来有一年了吧,建议还是注明一下。不然以为又是啥大新闻

半小时了还在 70%

(还用过 op 写的抢座哈哈哈

www.hesudu.com/t/946991

感谢提醒,设了密码好了,不然点订阅节点都给我干出来了。

我记得以前某个客户端,api 甚至默认监听 0.0.0.0 ,局域网内即可直接拿到配置信息

clash-verge-rev 默认配置确实被扫到了服务器的配置,必须要在设置里手动设置外部控制器的配置才行,感谢楼主分享

还没尝试检测,看了一下 Clash X 设置,包含了这些配置项:- 代理端口:7890 、- Api 端口:9090 ,允许局域网控制(不推荐):未勾选、- Api 密钥:已设置,覆盖配置文件设置:未勾选为了安全些,是不是要修改默认端口号,更新 Api 密钥,勾选覆盖配置文件设置这些。

127.0.0.2 就扫不到了。

#38 目前这个程序是扫描'127.0.0.1',如果其他程序设置扫描'127.0.1.2'是不是还是能扫描到?

#64 原理写不写倒是无太关紧要,最好是能将解决方法维护上,方便让大家修改。

#83 可以。所以我说了《比如 127.0.0.2 》,一定要设置可以自己高位的 ip ,不在本地的 ip 。也可以自己去改源码,编译,彻底关掉这个功能。

目前看到的风险主要是钓鱼网站可以通过这个手段偷机场代理。如果 clash 被发现漏洞可以提权抓肉鸡。

这部很原始的穷举本地所有端口方式

你们都是有公网 ip 的吗

也不完全一样,做了一些加强。这次想说明,即使改成 127.0.0.1 ,加密码不改端口号,也能通过路径探测到 clash (虽然获取不到节点信息,但是能知道你在用。)当然不加密码更是直接读配置。——— 之所以能成功跨域,是因为 clash 内核的 header 设置了 Access-Control-Allow-Origin: ,相当于解除浏览器跨域限制,欢迎大家来访问。不过还有一些浏览器像 Safari 限制更严格,https 不能跨域到 http 被拦截,还有一些隐私插件会拦截,所以不是 100%保证成功。这次做的比较匆忙,是一个粗糙的 demo ,没有太大技术含量。只是为了证明 CORS 的设置不合理,应有配置能默认关闭。———网页“任何网站都能检测”是对 Access-Control-Allow-Origin: 的解释,通配符允许了所有网站。不过确实不够严谨,因为可能还会遇到其他限制。时间原因,没法做到面面俱到。网页就在 GitHub 上,如果有好的建议欢迎直接提 PR ~———对于端口扫描,正常情况下浏览器前端是没法对本地端口扫描的。Access-Control-Allow-Origin: *导致有被扫到的风险。就是这样。

这次说明的不是公网问题。而是 Clash 的 CORS 设定不合理,可以通过浏览器前端,让浏览器扫到你 127.0.0.1 上的端口,借浏览器跨域控制 clash 。

直接修改你的代理配置搞中间人攻击也很可怕吧

#90 感谢楼主。

提了个提升 128 倍速度的 PR

128 倍扫描速度的体验地址: zmaplex.github.io/ClashScan/

Clash Verge Rev 好像是默认覆盖配置文件里的 external-controller 字段的 ……?确实是个安全问题

自从 clash 爆出远程代码执行漏洞后, 就把它关在 docker 里的

卧槽。马上改。

所以这个问题应该怎么解?

最新版好像会限制访问本地网站

谢谢提醒