vim で細工されたテキストファイルを開いた際に modeline を利用して任意のコード実行がされてしまう脆弱性(CVE-2019-12735)が 2019/06/04 付で公開されています。
影響するプロダクトとして Vim < 8.1.1365
が記載されていましたが、手元も環境で試したところ poc が動作しない場合があったため少し検証してみました。
結果としては、vim のバージョンが古すぎると影響を受けないという結果が得られました。
免責事項
当サイトに掲載する情報は記事公表時点の正しいものを提供するよう努めております。 ただし、提供している情報、リンク先などにより、いかなる損失や損害などの被害が 発生しても当サイトでは責任を負いかねますので、ご了承ください。
実験内容
以下の github から古いバージョンの vim を取得、手元の環境でコンパイルしてから poc が動作するか確認します。 poc はインターネット上に公開されていた uname コマンドが実行されるものを利用しました。
- vim/vim: The official Vim repository
https://github.com/vim/vim
実験環境
$ uname -a Linux ubuntu 4.18.0-20-generic #21~18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.2 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.2 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic
$ gcc --version gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat ~/.vimrc
※ .vimrc は空としました。
検証コマンド
$ ./configure $ make $ src/vim ../poc.txt
実験結果
検証したバージョンに関しては以下の結果が得られました。
- v8.1.1365 以上の場合は poc によるコマンド実行がされない
from v7.4.1096 to v8.1.1364 - v7.4.1096 から v8.1.1364 の場合は poc によるコマンド実行がされる
vim-7.4.1096 - v7.4.1095 以下の場合は poc によるコマンド実行がされない
vim-7.4.1095
すべての検証結果
version result ------------------------ 8.1.1491 x (E992: Not allowed in a modeline...) 8.1.1400 x (E992: Not allowed in a modeline...) 8.1.1369 x (E992: Not allowed in a modeline...) 8.1.1368 x (E992: Not allowed in a modeline...) 8.1.1367 x (E992: Not allowed in a modeline...) 8.1.1366 x (E992: Not allowed in a modeline...) 8.1.1365 x 8.1.1364 affected 8.1.0000 affected 8.0.1453 affected 8.0.0000 affected 7.4.2367 affected 7.4.1627 affected 7.4.1527 affected 7.4.1427 affected 7.4.1227 affected 7.4.1127 affected 7.4.1097 affected 7.4.1096 affected 7.4.1095 x 7.4.1094 x 7.4.1093 x 7.4.1092 x 7.4.1089 x 7.4.1080 x 7.4.1077 x 7.4.1047 x 7.4.1027 x 7.4.628 x
v8.1.1366 以降の場合には modeline の設定に許可されない記述がある旨のエラーメッセージが表示されるようになっていました。
コード実行されない奇妙な vim について
Ubuntu で実験をしていた際、apt コマンドによってインストールした vim では poc が実行されないことに気づきました。脆弱性があるはずのバージョン 8.0.1453 であるにも関わらずです。
なぜでしょうか。
原因はすぐに分かりました。.vimrc に set modelien
と記述することで poc が実行されたからです。つまり、どこかで set nomodeline
の設定がされているためと考えられます。
調査した結果、以下のファイルに set nomodeline
が設定されていることが分かりました。この設定をコメントアウトすることで poc が実行されることが確認できました。
このファイルはvimの scriptnames コマンドを使って見つけました。このコマンドを打つと .vimrc を含め、vim が読み込んでいるスクリプト一覧が表示されるようです。どんな設定ファイルを読み込んでいるのか確認するときに便利そうです。
以上
参考文献
- vim - Where is my .vimrc file? - Stack Overflow
https://stackoverflow.com/questions/10921441/where-is-my-vimrc-file
付録
差異が生じたバージョン間での修正履歴
- patch 7.4.1096 · vim/vim@a260b87
https://github.com/vim/vim/commit/a260b87d9da17f605666630f18c1ed909c2b8bae
古い CentOS における実験結果
CentOS において vim の version 7.4.160 で同様の検証を実施しました。
結果、 poc によるコマンド実行はされませんでした。
$ uname -a Linux proxy.infected.local 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)
7.4.160 はUbuntu で影響有無の境界となった 7.4.1095 より古いバージョンであり、Ubuntu での検証結果を支持する結果となりました。
nomodeline による緩和策
.vimrc に set nomodeline
と記載した場合、poc によるコマンド実行がされていたバージョンである 7.4.1096 および 7.4.1097 において、 poc によるコマンド実行がされなくなることを確認しました。
更新履歴
- 2019/06/05 新規作成
- 2019/06/08 新しいバージョンに関する結果を追加。「コード実行されない奇妙なvimについて」を追加。
- 2019/06/12 CVE番号として CVE-2019-12735 が払い出されていたのを反映。