Skip to main content

Node.jsにおけるImageMagickの脆弱性を軽減する

2016年5月6日

0 分で読めます

今週初め、ImageMagickに複数の深刻で容易に悪用できる脆弱性が公表され、すでに実際の環境で悪用されていることが確認されています。公式の修正プログラムはまだ提供されていないため、脆弱な機能を無効化し、既知の攻撃から保護するパッケージ imagemagick-safe を作成しました。

要約

ImageMagickは、画像の操作に使われる非常に広く普及したライブラリ兼バイナリです。アバター画像や商品写真など、ユーザーが作成したコンテンツの処理や、ソーシャルチャネルでの画像表示など、さまざまな用途に使われています。

今週初め、ImageMagickに複数の深刻で悪用が容易な脆弱性が公表されました。公式の修正プログラムはまだありませんが、特定の機能を無効にすることでリスクを軽減できます。

Node.jsでは、ImageMagickは主にnpmパッケージのimagemagickを通じて呼び出されます。このパッケージは2年以上更新されていないため、今回の問題への対処には役立たない可能性があります。

Node.jsでImageMagickを利用するユーザーを保護するため、脆弱な機能を無効にする専用のnpmパッケージimagemagick-safeをリリースしました。また、この変更をimagemagickパッケージのGitHubリポジトリにプルリクエストとして提出しましたが、リポジトリが長らく更新されていないため、取り込まれる可能性は低いと考えています。

ImageTragickの概要

公表された脆弱性が特に注目される理由は、次の3つです。

  1. 一部の脆弱性は非常に深刻で、攻撃者がサーバー上でコマンドを実行したり、サーバーのファイルを外部に漏えいさせたりするおそれがあります。

  2. 脆弱性の悪用は非常に容易で、専用に作成した画像ファイルと1回のHTTPリクエストだけで実行できます。

  3. 公式の修正プログラムは、まだ提供されていません。

  4. この脆弱性が実際の環境で悪用されていることが確認されています。

この一連の問題はImageTragickと呼ばれており、脆弱性の詳細は専用ウェブサイト imagetragick.comで確認できます。

原因と軽減策

現時点で判明している限り、脆弱性はいずれも、MVG、URL、HTTPSなど、特定の画像ファイル形式やキーワードの処理に関係しています。これらのファイル形式では内部アクション(例:別の画像を読み込む)がサポートされていますが、その処理が十分にサニタイズされていないため、リモートからコマンドを実行されるおそれがあります。以下は、脆弱性に関する公式サイトから引用した攻撃例です。

exploit.svgのサンプル

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";> 
<svg width="640px" height="480px" version="1.1" xmlns="http://www.w3.org/2000/svg"; xmlns:xlink= "http://www.w3.org/1999/xlink";> 
<image xlink:href="https://example.com/image.jpg"|ls "-la" 
x="0" y="0" height="640px" width="480px"/>

実行例

$ convert exploit.mvg out.png
total 32
drwxr-xr-x 6 user group 204 Apr 29 23:08 .
drwxr-xr-x+ 232 user group 7888 Apr 30 10:37 ..

これらの形式やキーワードのサポートを無効にするには、ImageMagickの(任意の)設定ファイルpolicy.xmlを編集し、以下の内容を含めます。これにより、一部の機能が実際に削除されますが、脆弱性にも対処できます。ただし、ポリシーを編集しても、あらゆる攻撃を防げるとは限りません。脆弱性の研究者によると、現時点で把握している攻撃はすべてブロックできます。

<policymap>
  <policy domain="coder" rights="none" pattern="EPHEMERAL" />
  <policy domain="coder" rights="none" pattern="URL" />
  <policy domain="coder" rights="none" pattern="HTTPS" />
  <policy domain="coder" rights="none" pattern="MVG" />
  <policy domain="coder" rights="none" pattern="MSL" /> 
  <policy domain="coder" rights="none" pattern="TEXT" />
  <policy domain="coder" rights="none" pattern="SHOW" />
  <policy domain="coder" rights="none" pattern="WIN" />
  <policy domain="coder" rights="none" pattern="PLT" />
</policymap>

npmパッケージ imagemagick-safe

主要なimagemagickパッケージがメンテナンスされていないため、新しいパッケージimagemagick-safeを作成しました。

このパッケージは上記のポリシーを強制的に適用し、機能を無効にすることで脆弱性を取り除きます。新しいImageMagickバイナリがリリースされ、システムがアップグレードされたことを確認できるまで、このパッケージを使用することをおすすめします。

ImageMagickはgmパッケージからも利用できます。こちらにもプルリクエストを提出することを検討しています。

このパッケージに問題が見つかった場合や、ご意見がある場合は、support@snyk.ioまでお知らせください。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。

カテゴリー: