mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-11 15:37:29 +02:00
patch 9.2.0357: [security]: command injection via backticks in tag files
Problem: [security]: command injection via backticks in tag files
(Srinivas Piskala Ganesh Babu, Andy Ngo)
Solution: Disallow backticks before attempting to expand filenames.
Github Advisory:
https://github.com/vim/vim/security/advisories/GHSA-cwgx-gcj7-6qh8
Supported by AI
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
@@ -4137,8 +4137,10 @@ expand_tag_fname(char_u *fname, char_u *tag_fname, int expand)
|
||||
|
||||
/*
|
||||
* Expand file name (for environment variables) when needed.
|
||||
* Disallow backticks, they could execute arbitrary shell
|
||||
* commands. This is not needed for tag filenames.
|
||||
*/
|
||||
if (expand && mch_has_wildcard(fname))
|
||||
if (expand && mch_has_wildcard(fname) && vim_strchr(fname, '`') == NULL)
|
||||
{
|
||||
ExpandInit(&xpc);
|
||||
xpc.xp_context = EXPAND_FILES;
|
||||
|
||||
@@ -1693,4 +1693,26 @@ func Test_tag_excmd_with_number_vim9script()
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" Test that backtick expressions in tag filenames are not expanded.
|
||||
" This prevents command injection via malicious tags files.
|
||||
func Test_tag_backtick_filename_not_expanded()
|
||||
let pwned_file = 'Xtags_pwnd'
|
||||
call assert_false(filereadable(pwned_file))
|
||||
|
||||
let tagline = "main\t`touch " .. pwned_file .. "`\t/^int main/;\"\tf"
|
||||
call writefile([tagline], 'Xbt_tags', 'D')
|
||||
call writefile(['int main(int argc, char **argv) {', '}'], 'Xbt_main.c', 'D')
|
||||
|
||||
set tags=Xbt_tags
|
||||
sp Xbt_main.c
|
||||
|
||||
" The :tag command should fail to find the file, but must NOT execute
|
||||
" the backtick shell command.
|
||||
call assert_fails('tag main', 'E429:')
|
||||
call assert_false(filereadable(pwned_file))
|
||||
|
||||
set tags&
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
||||
@@ -734,6 +734,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
357,
|
||||
/**/
|
||||
356,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user