macvim-dev / macvim-dev/macvim

[Security] MacVim affected by CVE-2026-43961 — netrw NetrwMarkFile() Vimscript injection via crafted filename (vim < 9.2.0480)

Đang mở
#1,651 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Vim Script
Star
7.9k
Fork
691
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

[Security] MacVim affected by CVE-2026-43961 — netrw NetrwMarkFile() Vimscript injection via crafted filename (vim < 9.2.0480)

Summary

MacVim bundles the vim source at version 9.2 (patches 1-321 in the current build), which is
below the patched version 9.2.0480 that fixes CVE-2026-43961.

Vulnerability Details

  • Upstream CVE: CVE-2026-43961
  • Inherited from: vim/vim
  • Affected code: runtime/autoload/netrw.vims:NetrwMarkFile() function
  • Vulnerability type: CWE-94 — Improper Control of Generation of Code (Code Injection)
  • Fixed in: vim 9.2.0480 (commit 8af0f098c3a42a28661d0295364e6e0fd7dbc92c)

Root Cause

In s:NetrwMarkFile() in runtime/autoload/netrw.vim, the global mark file list is
filtered using string interpolation of a user-controlled path:

" runtime/autoload/netrw.vim (macvim r183, line 5220)
let dname= netrw#fs#ComposePath(b:netrw_curdir,a:fname)
...
" remove new filename from global markfilelist
call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')

dname is composed from the current directory and the filename under the cursor (a:fname).
The filter() call evaluates its second argument as a Vimscript expression. Because dname
is interpolated directly into that expression string using '"'.dname.'"', a filename
containing a " character can escape the string context and inject arbitrary Vimscript.

Attack Scenario
  1. An attacker places a file named foo"+system('id')+"bar in a directory.
  2. The victim opens that directory in netrw inside MacVim.
  3. The victim presses mf to mark the file (adds it to the global mark list).
  4. The victim presses mf again to unmark the file — this triggers line 5220.
  5. The filter() call evaluates:
    filter(s:netrwmarkfilelist, 'v:val != "foo"+system(''id'')+"bar"')
    
  6. system('id') (or any arbitrary Vimscript/shell command) executes.

This can be triggered without any special permissions; any file accessible to the user
suffices. The attack is particularly relevant when opening untrusted project directories.

Affected MacVim Code

MacVim's runtime/pack/dist/opt/netrw/autoload/netrw.vim contains the vulnerable
s:NetrwMarkFile() function. The vulnerable line is:

" netrw.vim line 5220 (macvim r183)
call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')

Note: line 5179 (buffer-local list) uses 'v:val != a:fname' (variable reference, safe).
Only the global markfilelist at line 5220 is vulnerable.

The upstream fix (vim 9.2.0480) replaces the string interpolation with a lambda:

" Fixed form (vim >= 9.2.0480)
call filter(s:netrwmarkfilelist, {_, v -> v !=# dname})

The lambda form passes dname as a closed-over variable, never interpolating it into
an evaluated expression string.

neovim is NOT affected — its runtime/pack/dist/opt/netrw/autoload/netrw.vim already
uses the lambda form (lines 5167 and 5207).

Affected MacVim Version

MacVim r183 (vim 9.2 patches 1-321) — current HEAD as of 2026-05-18.

The fix commit 8af0f098c3a42a28661d0295364e6e0fd7dbc92c from vim/vim is not present
in the macvim-dev/macvim repository:

git log --all --oneline | grep 8af0f098  # returns no output

Suggested Fix

Merge or cherry-pick vim/vim patches up to at least 9.2.0480:

The fix changes the string-interpolated filter() expression to a lambda closure, which
avoids evaluating user-controlled data as Vimscript.

References

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu với runtime/pack/dist/opt/netrw/autoload/netrw.vim và kiểm tra s:NetrwMarkFile(), đặc biệt là bộ lọc markfilelist toàn cục. So sánh mã được tích hợp sẵn với upstream commit 8af0f098c3a42a28661d0295364e6e0fd7dbc92c. Hoàn thành khi phép nội suy dễ bị tổn thương được thay thế bằng dạng an toàn từ upstream và mã nguồn Vim đã cập nhật được tích hợp vào MacVim.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
macos, vim
Lĩnh vực
desktop, security
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
58/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.