文章总结: 文章讲述了作者研究OhMyZsh的CVE-2021-3934漏洞的经历。这个漏洞存在于git插件中,允许攻击者通过构造恶意分支名称在用户执行git命令时注入任意命令。作者进行了漏洞复现,证明了这个风险的存在,并强调定期更新工具的重要性,建议用户运行omzupdate命令以获得安全补丁。
综合评分: 89
文章分类: 漏洞分析,安全建设,终端安全,应急响应,漏洞预警
Oh My ZSH 升级与漏洞复现思考
原创
汤青松
青松阁主
2025年11月16日 11:01
北京
背景
每天都在用到 Oh My Zsh ,经常看到提示更新,选择yes更新大多数情况下因为网络原因慢或者失败,大部分都会按下 N,心里想着能用就行,升级了也感觉不到大差异。
最近我正好遇到一个安全设备遭受事件,外采设备版本没升级,被黑客攻击瘫痪了,所以再看到 Oh My Zsh的升级提示,就想到如果我一直忽略升级,是不是会影响电脑安全?带着这个疑问我去查了查 Oh My Zsh的历史漏洞记录。
结果让我找到了一个Oh My Zsh的漏洞案例 CVE-2021-3934 OS命令注入漏洞,这个漏洞虽然是2021年的,但是我经常会用ohmyzsh,所以还是花了点时间研究了一下
一 漏洞原理
这个漏洞在Oh My Zsh的 git插件 里,就是那个能在终端提示符里显示当前git分支的实用功能,很多开发者都用得到。
在2021年修复前的版本中,这个插件为了使用方便,定义了很多git命令的别名。比如用 ga 代替 git add,用 gc 代替 git commit。问题就出在这里——在解析这些别名时,存在代码注入漏洞。
攻击者可以通过构造一个恶意分支名称,在你使用这些git命令时,悄悄执行任意代码。
说实话,这个漏洞的实际危害有限:需要你主动进入恶意分支,并且执行特定的git命令才会触发。从实际影响来看,它并没有造成大规模的安全事件。
但这并不意味着可以不升级,忽略升级等于把已知的风险留在电脑里。为了真正理解这个风险,我决定亲手搭建环境,复现这个漏洞。
1.1 漏洞复现
我在虚拟机上安装了存在漏洞的旧版Oh My Zsh,开始了实验:
搭建环境
创建了一个git仓库,然后切换到一个特殊命名的分支:
git checkout -b '--help;echo "注意!你的终端已被控制";id;echo""'
这个分支名看起来有点奇怪,其中的分号是命令分隔符。
触发漏洞
假设我正在这个分支下工作,像平时一样用 gcmsg 提交代码:
gcmsg "这是一次普通的提交"
漏洞被执行
按下回车后,终端没有执行提交,反而显示:
注意!你的终端已被控制
uid=1000(test) gid=1000(test) groups=1000(test)...
写入的代码被执行了
1.2 漏洞原理说明
- 旧版插件在处理分支名时,没有做好验证
- 最终会将分支名和git命令拼接在一起执行
- 我构造的分支名中的单引号提前结束了git命令参数,分号后的代码就被shell执行
想象一下,如果攻击者把显示信息的代码换成删除文件或者下载恶意软件的指令,后果会有多严重。而你,可能只是在一次普通的git操作中就中招了。
二 刷新认知
CVE-2021-3934虽然不是什么毁灭性漏洞,不过改变了我对ohmyzsh的升级想法,之前总想跳过的升级提示,其实是重要的安全补丁,普通的升级堵上了安全漏洞。
如果总以为自己懂网络安全,黑客会离自己很远,那这个漏洞告诉我危险可能就藏在熟悉的工具里,藏在因为“嫌麻烦”而养成的习惯里。
所以如果你也对 ohmyzsh 的升级提示感到烦,希望读完这个文章能给你提个醒。
定期运行 omz update,能给电脑加一道安全防线。
作者:汤青松
日期:2025年11月16日
微信:songboy8888
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:青松阁主 汤青松《Oh My ZSH 升级与漏洞复现思考》