Claude 从 Vim 和 Emacs 里发现了 0day 漏洞

calif的blog。vim漏洞详情见 https://github.com/vim/vim/security/advisories/GHSA-2gmj-rpqf-pxvh,Emacs的见https://github.com/califio/publications/blob/main/MADBugs/vim-vs-emacs-vs-claude/Emacs.md

vim的已经修了,但Emacs的这个很难说是Emacs本身的bug。 git config中的core.fsmonitor选项允许git执行任意的代码,只要git status就会触发,而emacs的vc-refresh-state(会执行git status等命令)注册在find-file-hook中……

:joy:小心来路不明的.git文件夹

7 个赞

看完了,顺便总结一下:

主要的问题是 Git 本身吧,执行命令都会读取 .git/config, 而如果里面有 core.fsmonitor 配置,则会执行任意程序。

解决方法是覆盖 core.fsmonitor,设置为 false

不管用不用 Emacs,如果存在这样的恶意配置,在未察觉的情况下执行 Git 命令,都会中招。

除了 core.fsmonitorcore.sshCommandcore.editorcore.pager 等也有类似问题。

在拉取仓库之后,养成习惯先检查一下 .git/config,就能避免这个问题(不过是人就有疏忽的时候)。

Emacs 执行 find-file 就会触发 vc-refresh-state 进而触发 git status,检查 .git/config 的时候还不能用 Emacs 的 find-file 来打开检查了,那就用 cat 吧 = =

5 个赞

我也认为这是git本身的机制漏洞,第三方根本改不完(与git相关的包可能都需要修改,改完了调用的第三方脚本、命令也要改),除非本地环境全局彻底禁用该功能。

从 melpa/elpa 下载的天天用的包怕是都没几人自己一行行审查过,还怕有人用陌生 git repo 搞你?

7 个赞

牛牛牛,吓得我爬起来试了试,全中! 幸亏是今天看到,明天看到就当玩笑了

surprise , cc is now open source

1 个赞

说到「安全」, Emacs 最近加了 package-review-policy,可以在 package.el 更新包的时候审查 diff,不也没什么人在意

就没必要对这种「0day」一惊一乍了(

2 个赞

想了想对于 Emacs 还挺麻烦的,find-file 是最常用的一个命令,如果正好打开一个目录,里面有 .git 且包含恶意的配置,就不知不觉中招了。

能在 Emacs 层面检测一下、防御一下也是好的。

连 git 的漏洞都算不上

本来就不该 direct copy git directory.

fresh clone 还能 trigger 才算

不然我写个 git hook 不就好了 然后 copy 到 别的 machine 这也算 RCE?

漏洞作者连 最基本的 threat model 都没想清楚

6 个赞

不执行git命令也会中招?不会吧? find-file只是单纯打开文件,除非使用了git命令或者用了magit/vc之类的package。如果非要用他人提供的危险的hook,如何防范?我认为这个漏洞跟Emacs没有关系。

啊啊对哦,.git/本来就不会被git传来传去的 :joy: 被绕进去了

1 个赞

@twleo 说的,这个漏洞的前提条件是,.git/config 里存在恶意的 core.fsmonitor 配置。

core.fsmonitor 属于本地配置,不会 push 到上游,从上游 clone 下来也不会自带 core.fsmonitor

除非别人将 .git 保留下来,传递给你,才会包含有恶意的 .git/config。我想到的一种情况是,有的公司面试的时候会给你丢个 zip 包让你实现一些什么,这里头就有机可乘吧。


因为 Emacs 内置的 vc-hooks.elfind-file-hook 里注册了 vc-refresh-state,所以执行 find-file 就会执行 Git 命令(git status)。所以如果用 find-file 打开包含恶意的 .git/ 文件夹的任何文件,就会触发问题吧。

1 个赞

靠人看是防不住的,不然他们家的map文件怎么泄露的 :grinning_face_with_smiling_eyes:

1 个赞

用定制的服务端怎么样?不知道客户端有没有抵抗力。

或者用嵌套的目录结构:

Project/
  .git/
  main/
    .git/
      - config
    README.md
  • 客户端根据模板生成 .git/config 可以直接覆盖掉目录中可能携带的

  • 在子目录携带 .git 不可行,得用 tar 之类的包装( Emacser: 怎么有个 tar 包?让我看看里面是什么 不解开查看不会触发

假定你已经被恶意控制了 然后说能恶意控制你 这不搞笑嘛 这东西有点太llm了。 当你的电脑安装了恶意控制软件且在启动当中,你只要一启动电脑就会被控制 那你的电脑或者你的行为 就是0day漏洞嘛?不是的哦