ディレクトリトラバーサル(CWE-22)

このブログではウェブサイトやその上で動作しているウェブアプリケーションの脆弱性について紹介すると共に注意喚起をする目的でまとめられています。

今回は代表的なWebアプリケーション脆弱性であるディレクトリトラバーサルについて解説をしています

概要

Webアプリケーションの中には、外部からファイル名を指定して、そのファイルに対する閲覧や書き込みをする実装になっているものがあります。この際、ファイル名を巧妙に細工して指定することにより、本来読み書きを許可していないファイルを指定されてしまう場合があります。このような攻撃をディレクトリトラバーサル攻撃と言います。ディレクトリトラバーサル攻撃の結果、プログラムのソースファイルや個人情報ファイルの閲覧、ファイルの改ざん、不正なプログラムの設置による任意コードの実行などの可能性があります。

ディレクトリトラバーサル攻撃は、通常アクセスできないはずのサーバー内部のファイルを閲覧できるため不正アクセス禁止法に抵触する可能性が高いものです。このため、予め許可を得ている場合を除き、外部のサーバーでディレクトリトラバーサル攻撃を試すと、犯罪となる可能性が高く注意が必要です。

攻撃のイメージと影響

以下のプログラム(PHP言語)断片は、tmplというクエリ文字列を指定して、テンプレートファイルを表示しています。

<?php
readfile(‘/var/data/’ . $_GET[‘tmpl’]);
?>

正常系の動作は、例えばtmpl=spring.htmlというクエリ文字列に対して、/var/data/spring.htmlというテンプレートファイルが表示されます。

一方、攻撃者がtmpl=../../../etc/passwdというクエリ文字列を指定した場合、このプログラムは、/var/data/../../../etc/passwdというファイルを表示しようとしますが、../は親ディレクトリを示すため、このファイル名を正規化した結果/etc/passwdというUnix/Linuxのユーザ情報を表示することになります。このようにして、攻撃者はWebサーバー上の非公開ファイルを閲覧し、場合によっては変更することができます。

脆弱性による影響

この脆弱性による影響の例として下記があります。ディレクトリトラバーサル脆弱性の影響は、脆弱性のあるページに関係なく、Webサーバー上の任意のファイルに影響します。

  • Webサーバー内の重要情報の漏えい
  • プログラムソースファイルの漏えい
  • 設定ファイル、データファイル、プログラムのソースコード等の改ざん、削除
  • 任意プログラムの実行(ソースコードの書き換えが出来る場合)

脆弱性の有無の確認方法

プログラムのソースコード上で、外部からファイル名を指定している箇所を調べて、適切な対策がとられているかを確認する方法が有効です。

ソースコードを確認できない場合、手動診断で脆弱性の有無を検証することもできます。この場合、独立行政法人情報処理推進機構(IPA)が公開している「安全なウェブサイトの作り方」別冊の「ウェブ健康診断仕様」に診断の方法が説明されており、参考になります。

対策

ディレクトリトラバーサル脆弱性は、外部からファイル名を指定でき、かつそのファイル名に対するアクセス権限の確認をしていないことが原因です。このため、ファイル名を外部から指定できないようにするか、指定されたファイル名からディレクトリ名を取り除くことで対策できます。ディレクトリ名を取り除く処理はOSにより変わるため、自作せずに言語等に用意された標準的な関数(例えばPHPのbasename関数)を使うことをお勧めします。

なお、デジサートの「クラウド型WAF」では、ディレクトリトラバーサル攻撃からWebサイトが攻撃を受けるのを防ぐことができます。

参考文献

安全なウェブサイトの作り方、ウェブ健康診断仕様(独立行政法人情報処理推進機構)
https://www.ipa.go.jp/security/vuln/websecurity.html

修正の上再掲しました。

Posted in WAF