アップロード画像による Web サイト乗っ取りが可能な脆弱性とその対策

脆弱性ハンターの Tavis Ormandy 氏が、Ghostscript アプリケーションに存在する複数のセキュリティ問題を報告しました。

Google の Project Zero のメンバーである Ormandy 氏は、文字通り脆弱性を発見するのが仕事であり、これまでの業績は高い評価を受けています。

Ormandy 氏ほどスキルの高いセキュリティリサーチャーが熱心に脆弱性を調査した Ghostscript とは何なのでしょうか。

多くの人は Ghostscript というソフトウェアの名前を聞いたことが無くても、気付かないうちに頻繁に使用しているかもしれません。

Ghostscript は、多くのプリンタをサポートしているプログラミング言語でありエコシステムである Adobe PostScript の無料のオープンソース実装であり、ほぼすべての PDF ファイルの技術的基礎となっています。

実際に PDF ファイルを開いたり作成したりすると、PostScript ランタイム環境が起動され、そのドキュメントを記述する PostScript プログラムが実行されます。

画像編集ツール、ドキュメント生成ツール、イラストレーションパッケージ、PDF ビューアなど、多くのオープンソースのツールキットは、Ghostscript を使用することによってテキストやグラフィックスのレンダリング機能を強化しています。

ローカルコンピュータでは Ghostscript を使用したことがなくても、クラウドサービスを利用した際に誰かのサーバー上でリモートから使用したことがあるはずです。

つまり、たとえ危険が差し迫ってはいなくても、また、自分自身では問題を解決できないとしても、Ghostscript に存在するリモートコード実行やデータ漏洩の脆弱性については知っておくべきです。

Ormandy 氏が発見した脆弱性が悪用された場合、次のような操作が可能になります。

  • 任意のシェルコマンドを実行する。
  • 本来アクセス権のないディレクトリにファイルを作成する。
  • 読み取りアクセスしか許可されていないファイルを削除する。
  • 権限を一切持たないファイルからデータを抽出する。

これらの脆弱性を悪用するには、インストールされている Ghoscript エンジン (Ghostscript コードを解釈 (interpret) するので「インタープリタ」とも呼ばれます) に、悪意のある入力ファイルをフィードする必要があります。そのため、一見するとそれほど深刻な脆弱性には思えません。

しかし、任意のファイルをダウンロードし、任意の方法でそのファイルを起動することができれば、さまざまな言語でマルウェアを実行することは可能です。

たとえば Mac では、デフォルトで Perl、Python、Ruby、PHP、Tcl、Bash、AppleScript などのプリインストールバージョンから選択できます。Windows では、Visual Basic Script、JavaScript、または Powershell で直ちにコードを実行できます。

あるいは、コンパイル済みのマルウェアバイナリをダウンロードしたりビルドしたりして、直接実行することも可能です。

とは言え、自分のコンピュータに新しいプログラムをインストールすることが許可されていても、通常アカウントは他のユーザーに属するファイルの読み取りや削除をブロックされています。したがって、この種の脆弱性は権限昇格 (EoP: Elevation of Privilege) の脆弱性に該当します。

より重大な問題

しかし、Ghostscript の一般的な使用法を原因とする問題のほうが重大です。Ghostcript は Perl や Python などのプログラミング言語としては扱われず、グラフィックスやドキュメントを変換するためのメカニズムとして扱われています。

通常、誰かから印刷用のドキュメントファイルや変換用の画像ファイルが送られてきた場合、その処理に使用されるレンダリングアプリケーションについて特に考える必要はありませんが、そのアプリケーションは Ghostscript かもしれません。

Ghostscript には、コマンドラインオプション -dSAFER で起動される特別な設定があり、不正な画像やドキュメントによるダメージを最小限にとどめる一種のサンドボックスとして機能します。しかし、Ormandy が発見した脆弱性は、この制限を迂回することができます。

また、多くのサーバー、特にブログやフォーラムを運用しているサーバーでは Ghostscript が使用されており、そうしたサービスを提供している企業がその事実を知らないこともあります。

たとえば、多くのブログサイトやソーシャルネットワーキングサイトでは、ユーザーによる画像のアップロードが許可されています。アップロードされたファイルは、その、サイトのフォーマットやレンダリング要件に合うように自動修正されます。

こうしたフォーマットの修正では、所定のファイル形式への変換、標準サイズにするための拡大・縮小、カラーフィルタの適用、著作権等のメッセージの追加、圧縮によるスペースの節約などが実行されるのが一般的です (これを専門用語ではトランスコーティングと言います)。

多くの場合、「ImageMagick」という名前のコマンドラインツールがこの目的で使用されています。つまり、通常は ImageMagick ユーティリティが外部からアップロードされた信頼できないファイルを取り込み、安全に処理するのだと考えられています。

ところが、PostScript コンテンツを取得した場合、ImageMagick のトランスコーディングプロセスはデフォルトで Ghostscript を使用します。

つまり、Ghostscript に悪用可能な脆弱性が存在しているということは、ImageMagick に脆弱性があるのとほぼ同じことです。そして、ImageMagick に脆弱性が存在しているということは、コンテンツ管理システム、ブログサーバー、オンラインフォーラムの脆弱性が外部にさらされているのと変わりません。

対策

Ghostscript は、Ormandy が発見した脆弱性を含んだままのようで、アップデートはまだ公開されていません���

しかし、少なくとも攻撃目的でリモートコンテンツが ImageMagick を介してアップロードされた場合、いずれかの脆弱性の影響を受ける可能性があります。

そこで、このリスクを低減するには、ImageMagick の設定を変更します。

たとえば、PostScript ファイル (および「Encapsulated PostScript」と呼ばれる同様のファイル形式) を処理する必要がなければ、それらのファイルを処理する ImageMagick の機能を無効にすることができます。

デフォルトでは ImageMagick は PostScript データを含んだ PS と EPS ファイルをレンダリングしますが、ImageMagick の設定ファイルの 1 つである policy.xml を使用すればこの設定を変更できます。

policy.xml ファイルの場所を特定する方法は次のとおりです。

   $ identify -list configure | grep CONFIGURE-PATH
CONFIGURE_PATH /usr/local/etc/ImageMagick-7/

ImageMagick でサポートされていて、ユーザーが無効にできるファイル形式を調べる方法は次のとおりです。

   $ identify -list format
     Format  Mode  Description
     -----------------------------------------------
        3FR  r--   Hasselblad CFV/H3D39II
        3G2  r--   Media Container
        3GP  r--   Media Container
       . . . .
        EPS  rw-   Encapsulated PostScript
       EPS2* -w-   Level II Encapsulated PostScript
       EPS3* -w+   Level III Encapsulated PostScript
       EPSF  rw-   Encapsulated PostScript
       . . . .
        PDF  rw+   Portable Document Format
       PDFA  rw+   Portable Document Archive Format
       . . . .
         PS  rw+   PostScript
        PS2* -w+   Level II PostScript
        PS3* -w+   Level III PostScript
       . . . . 
     YCbCrA* rw+   Raw Y, Cb, Cr, and alpha samples
        YUV* rw-   CCIR 601 4:1:1 or 4:2:2
       . . . .
     * native blob support
     r read support
     w write support
     + support for multiple images
   $

個別にファイル形式の処理を無効にするには、次のような行を policy.xml に追加します。

   <policy domain="coder" rights="none" pattern="{EPS,PS,PDF,PDFA}" />

(上記の例は、筆者のインストール環境で「読み取りサポート」と表示される PostScript または PDF 関連のファイル形式を選んだにすぎません。)

次のように、「オプトアウト」ではなく「オプトイン」型のアプローチを用いて、できるだけ攻撃対象領域を縮小する対策もあります。

   <policy domain="coder" rights="none" pattern="*" />
   <policy domain="coder" rights="read|write" pattern="{GIF,JPEG,PNG}" />

1 行目のトランスコーダ識別パターン "*" はワイルドカードですので、すべてが無効になります。

続く 2 行目は、信頼できないアップロードのサポートに必要なファイル形式に基づいて、最小限のトランスコーダを明示的に有効に戻します。

今後について

Linux を使用している場合や、Macports、Homebrew、Fink などのパッケージマネージャーを Mac で使用している場合は、公式の Ghostscript アップデートが入手可能になった時点でシステムから通知されるはずですので、注意しておいてください。