「ケータイキット for Movable Type」のOSコマンドインジェクションの修正
2016年4月26日(火曜日)
「ケータイキット for Movable Type」のOSコマンドインジェクションの修正
更新: 2016年4月27日11時5分頃
Movable Typeのプラグイン「ケータイキット for Movable Type」にOSコマンドインジェクションの脆弱性があったという話が出ており、J-WAVEの64万件の個人情報流出はこれが原因だったとされています。
- J-WAVEでも64万件の個人情報流出の可能性、原因ソフトの利用者は至急パッチ適用を (itpro.nikkeibp.co.jp)
- 「ケータイキット for Movable Type」にOSコマンドインジェクションの脆弱性、利用者は修正バージョンへアップデートを、すでにJ-WAVEへの攻撃で悪用 (internet.watch.impress.co.jp)
- ケータイキット for Movable Type の脆弱性についてまとめてみた (d.hatena.ne.jp)
配布元のアイデアマンズからは、4月22日にまず「緊急パッチファイル」が提供され、その後正式なアップデートが提供されました。
- [2016-04-22]緊急パッチファイルの提供を開始 (www.ideamans.com)
- [重要] ケータイキット for Movable Type 1.65 の提供を開始 (www.ideamans.com)
- 【重要】ケータイキット for Movable Typeの脆弱性をチェックする「KeitaiKit セキュリティチェック」プラグインを公開、[購入者向け]ケータイキットの脆弱性対策 特設ページを開設 (www.ideamans.com)
サイトでの情報提供のほか、登録ユーザーへのメールでの告知も行われているようです。
22日に公開された「緊急パッチファイル」の内容を見ると、plugins/keitaikit/php/KeitaiGraphic.php というファイルひとつだけであり、このファイルに問題のあったコードが含まれているらしいことが分かります。中身を見ると、KeitaiGraphic という名前の示すとおり、画像をケータイ用に変換する関連の処理が含まれているようです。
※Movable TypeはPerlで書かれており、プラグインも基本はPerlで書くのですが、ケータイキットはPerlとPHPが混ざった構成になっています。Perlで書かれたMTプラグインでHTMLにPHPのコードを吐いたりしつつ、画像変換などの処理はPHPで行っているようです。
修正の内容ですが、以下のような部分が、
$execute = "$convert $option $src $dest_temp"; exec($execute);
「緊急パッチファイル」では以下のように修正されています (この他にも同様の修正が数箇所あります)。
global $mtkk_no_exec_args_quote; if ( $mtkk_no_exec_args_quote ) { $execute = "$convert $option $src $dest_temp"; } else { $execute = "$convert $option \"$src\" \"$dest_temp\""; } exec($execute);
※細かいところを説明しておきますと、$convert はGraphicConfig.phpという設定ファイルで与えられた定数で、ImageMagickのconvertコマンドのパスが格納されます (デフォルトでは'/usr/bin/convert'がセットされています)。$mtkk_no_exec_args_quoteは、trueをセットすると従来どおりの (脆弱な) 挙動になるフラグと思われますが、特にセットしている箇所が見当たりませんので、基本的にはelse節の方が実行されて修正後の挙動となります。
一見して分かると思いますが、この修正内容は不十分であり、OSコマンドインジェクションの危険性はなくなっていないものと思われます。ただし、これはあくまで22日の時点で配布された「緊急パッチファイル」の内容です。配布元ではその後、23日に修正版をリリースし、あわせて以下のようにアナウンスしています。
ケータイキット for Movable Type で確認されたセキュリティ問題の修正バージョンとして、ケータイキット for Movable Type 1.65 の提供を開始します。すべてのケータイキット for Movable Type ユーザーは、修正版に必ずアップグレードしてください。
※1.641用の緊急パッチファイルを適用された場合でも、必ずアップグレードをしてください。
「緊急パッチファイル」のままでは駄目だという旨が告知されていますね。修正版の内容を見ると、該当箇所は最終的に以下のような形になったようです。
global $mtkk_no_exec_args_quote; if ( $mtkk_no_exec_args_quote ) { $execute = "$convert $option $src $dest_temp"; } else { $execute = "$convert $option " . escapeshellarg($src) . " " . escapeshellarg($dest_temp); }
結論としては、配布元でアナウンスされているとおり、「緊急パッチ」を適用していても修正版にアップデートする必要がある、ということで良いと思います。
※以下、2016-04-26 12:15頃追記
「なぜImageMagickのconvertコマンドを呼んでいるのだろうか」という疑問を感じた方が多かったようですので、一点補足します。設定ファイルGraphicConfig.phpには以下のような内容が書かれていて、ImageMagickではなくGDを選択することもできるように見えます。ただし初期値はImageMagickのようです。GDを選ぶと問題が回避できるのかどうかは良くわかりません。
/*
グラフィックライブラリ
gd:GD
im:ImageMagick 6+
im5: ImageMagick 5)
*/
$kg->php_graphic = 'im';
/*
convertコマンドのパス
グラフィックライブラリにImageMagickを指定した場合のみ
*/
$kg->convert = '/usr/bin/convert';
/*
identifyコマンドのパス
グラフィックライブラリにImageMagickを指定した場合のみ
*/
$kg->identify = '/usr/bin/identify';
※以下、2016-04-27 11:05頃追記
徳丸さんから情報をいただきました。攻撃経路はファイル名ではなくオプションの方らしいとのこと。
@bakera (twitter.com) ばけらさん、私もソースを追っかけてみたのですが、攻撃経路はファイル名ではなく、オプションの方だと思います。ファイル名は存在チェックがあり攻撃が難しいですが、オプションはほぼノーチェックでconvertコマンド等に渡されていたようです
— 徳丸 浩 (@ockeghem) 2016年4月27日 (twitter.com)
あらためて確認すると、旧版、および緊急パッチファイルで以下のようになっていた部分が、
$option .= ' -rotate ' . $options['rotate'];
最新版では以下のように変更されています (同様の箇所が他にも数箇所あります)。
$option .= ' -rotate ' . escapeshellarg($options['rotate']);
この部分は「緊急パッチファイル」では変更されていなかった部分ですので、ここが攻撃経路なのであれば、緊急パッチファイルは修正が不十分 (従来の攻撃は防げるが、別の攻撃方法が残っている状態) だったのではなく、そもそも修正になっていなかった可能性もあります。いずれにしても、緊急パッチファイルのままでは駄目で、最新版にする必要があるという結論は変わりません。
- 「「ケータイキット for Movable Type」のOSコマンドインジェクションの修正」にコメントを書く
- 前(古い): アクセシビリティって何ていうか、つまり当たり前のこと
- 次(新しい): JIS X 8341-3:2016の訳語見直しのこぼれ話