水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2016年のえび日記 > 2016年4月

2016年4月

2016年4月26日(火曜日)

「ケータイキット for Movable Type」のOSコマンドインジェクションの修正

更新: 2016年4月27日11時5分頃

Movable Typeのプラグイン「ケータイキット for Movable Type」にOSコマンドインジェクションの脆弱性があったという話が出ており、J-WAVEの64万件の個人情報流出はこれが原因だったとされています。

配布元のアイデアマンズからは、4月22日にまず「緊急パッチファイル」が提供され、その後正式なアップデートが提供されました。

サイトでの情報提供のほか、登録ユーザーへのメールでの告知も行われているようです。

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用の緊急パッチファイルを適用された場合でも、必ずアップグレードをしてください。

以上、[重要] ケータイキット for Movable Type 1.65 の提供を開始 より

「緊急パッチファイル」のままでは駄目だという旨が告知されていますね。修正版の内容を見ると、該当箇所は最終的に以下のような形になったようです。

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頃追記

徳丸さんから情報をいただきました。攻撃経路はファイル名ではなくオプションの方らしいとのこと。

あらためて確認すると、旧版、および緊急パッチファイルで以下のようになっていた部分が、

    $option .= ' -rotate ' . $options['rotate'];

最新版では以下のように変更されています (同様の箇所が他にも数箇所あります)。

    $option .= ' -rotate ' . escapeshellarg($options['rotate']);

この部分は「緊急パッチファイル」では変更されていなかった部分ですので、ここが攻撃経路なのであれば、緊急パッチファイルは修正が不十分 (従来の攻撃は防げるが、別の攻撃方法が残っている状態) だったのではなく、そもそも修正になっていなかった可能性もあります。いずれにしても、緊急パッチファイルのままでは駄目で、最新版にする必要があるという結論は変わりません。

関連する話題: Web / セキュリティ

最近の日記

関わった本など