setodaNote

忘れる用のメモ書き

vim の modeline に関する脆弱性(CVE-2019-12735)について調べてみた

vim で細工されたテキストファイルを開いた際に modeline を利用して任意のコード実行がされてしまう脆弱性(CVE-2019-12735)が 2019/06/04 付で公開されています。 影響するプロダクトとして Vim < 8.1.1365 が記載されていましたが、手元も環境で試したところ poc が動作しない場合があったため少し検証してみました。

f:id:soji256:20190605224309p:plain
vim/vim: The official Vim repository

結果としては、vim のバージョンが古すぎると影響を受けないという結果が得られました。

免責事項

当サイトに掲載する情報は記事公表時点の正しいものを提供するよう努めております。 ただし、提供している情報、リンク先などにより、いかなる損失や損害などの被害が 発生しても当サイトでは責任を負いかねますので、ご了承ください。

実験内容

以下の github から古いバージョンの vim を取得、手元の環境でコンパイルしてから poc が動作するか確認します。 poc はインターネット上に公開されていた uname コマンドが実行されるものを利用しました。

実験環境

$ 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 によるコマンド実行がされない
    f:id:soji256:20190608114234p:plain
    from v7.4.1096 to v8.1.1364
  • v7.4.1096 から v8.1.1364 の場合は poc によるコマンド実行がされる
    f:id:soji256:20190605215826p:plain
    vim-7.4.1096
  • v7.4.1095 以下の場合は poc によるコマンド実行がされない
    f:id:soji256:20190605215901p:plain
    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 の設定に許可されない記述がある旨のエラーメッセージが表示されるようになっていました。

f:id:soji256:20190608114325p:plain
an error message (8.1.1366 and later)

f:id:soji256:20190608114448p:plain
poc does not work without error message (v8.0.1453)

コード実行されない奇妙な vim について

Ubuntu で実験をしていた際、apt コマンドによってインストールした vim では poc が実行されないことに気づきました。脆弱性があるはずのバージョン 8.0.1453 であるにも関わらずです。

f:id:soji256:20190608114436p:plain
v8.0.1453 installed via apt command
f:id:soji256:20190608114448p:plain
poc does not work (v8.0.1453)

 
なぜでしょうか。
 

原因はすぐに分かりました。.vimrc に set modelien と記述することで poc が実行されたからです。つまり、どこかで set nomodeline の設定がされているためと考えられます。

f:id:soji256:20190608114541p:plain
poc execute command (I wrote “set modeline” in .vimrc)

調査した結果、以下のファイルに set nomodeline が設定されていることが分かりました。この設定をコメントアウトすることで poc が実行されることが確認できました。

f:id:soji256:20190608114739p:plain
“set nomodeline” is here

このファイルはvimの scriptnames コマンドを使って見つけました。このコマンドを打つと .vimrc を含め、vim が読み込んでいるスクリプト一覧が表示されるようです。どんな設定ファイルを読み込んでいるのか確認するときに便利そうです。

f:id:soji256:20190608114751p:plain
scriptnames

以上

参考文献

付録

差異が生じたバージョン間での修正履歴

古い 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 によるコマンド実行がされなくなることを確認しました。

f:id:soji256:20190605220448p:plain
set nomodeline

更新履歴

  • 2019/06/05 新規作成
  • 2019/06/08 新しいバージョンに関する結果を追加。「コード実行されない奇妙なvimについて」を追加。
  • 2019/06/12 CVE番号として CVE-2019-12735 が払い出されていたのを反映。