[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

ディレクトリトラバーサル攻撃 (directory traversal attack)

pointこの用語のポイント

point本当は見られないはずのファイルの中身を見ようとする攻撃だよ

point作った人が想定していないやり方でファイルを指定するよ

pointヘボい作りのプログラムでなければ喰らわない攻撃だよ

スポンサーリンク

簡単に書くよ

ディレクトリトラバーサル攻撃 (directory traversal attack)とは

プログラム内の「どんなファイルが欲しいんだい?」な処理に対して、プログラムを作った人が想定していなかったファイルを指定することで、本当は見られないはずだったファイルの中身を見ようとする攻撃
です。

image piyo

詳しく書くよ

プログラムというのは、いろいろな処理を行います。
中には、ファイルを指定して、あれやこれやする処理もあるでしょう。
例えば「指定されたファイルの中身を表示する処理」などです。

ディレクトリトラバーサル攻撃

このようなファイルをあれこれする処理に対して、プログラムを作った人が想像もしなかったようなファイルを指定することで、本当であれば部外者には見られないはずのファイルの中身を見ようとする悪いことが「ディレクトリトラバーサル攻撃」です。
単に「ディレクトリトラバーサル」と呼ばれたり「パストラバーサル攻撃」などと呼ばれることもあります。

ディレクトリトラバーサル攻撃2

……と一息で説明されても分からないかもしれませんね。
大丈夫です。
例を挙げて説明します。

例えば、そうですね。

ピヨ太君が、八百屋さんをやっています。

ディレクトリトラバーサル攻撃3

ピヨ太君の八百屋さんは注文制です。
あらかじめ

「  」を「 」個、注文します。

のように書かれた注文用紙があります。

お客さまは、ここに

「リンゴ」を「1」個、注文します。



「ミカン」を「3」個、注文します。

のように書いてピヨ太君に渡すことで、買い物ができます。

ディレクトリトラバーサル攻撃4

ある日のことです。

ピヨ太君の元に

冷蔵庫の奥に隠してある、とっておきの苺ショートケーキ」を「1」個、注文します。

という注文書が届きました。
注文書の差出人はピヨ子さんです。

ディレクトリトラバーサル攻撃5

なんと!
売り物ではないはずの苺ショートケーキを注文されてしまいました。

ですが、注文されてしまったものは仕方がありません。
泣く泣く、ピヨ太君は苺ショートケーキをピヨ子さんに渡しました。

ディレクトリトラバーサル攻撃6

ピヨ太君は、注文の対象を八百屋の商品に限っていました。
ただし、それはあくまでピヨ太君の中のルールです。
ピヨ太君が「そのつもり」だっただけです。
「注文する品は、八百屋の商品の中から選んでください」のような注意書きはありませんでした。
実際には、八百屋の商品以外も注文できてしまいます。

そこに目を付けたのがピヨ子さんです。
その気になれば八百屋の商品以外も注文できる穴を利用して、見事に苺ショートケーキを手に入れました。

これをコンピュータの世界でやるのが、ディレクトリトラバーサル攻撃です。
本当であれば指定できない(とプログラムを作った人は思っているけど実際には指定できる)ファイルを指定して、本当であれば中身を見られないはずのファイルの中身を見てやるぜ!な攻撃です。

せっかくなので、もう少しコンピュータに近い例も見てみましょう。

ピヨ太君は、以下の処理をするプログラムを作りました。

1.ミカンに対する説明を書いた「mikan.txt」とリンゴに対する説明を書いた「ringo.txt」とイチゴに対する説明を書いた「ichigo.txt」を用意する
2.使う人に「ミカン」「リンゴ」「イチゴ」のどれかを選んでもらう
3.選んでもらった内容に対応する説明(ファイル「○○.txt」の中身)を画面に表示する


あまり大きな声では言えませんが、ピヨ太君は、へぼへぼプログラマです。
この処理を行うプログラムを以下のように作ってしまいました。

■プログラム1
1.使う人に「ミカン」「リンゴ」「イチゴ」のどれかを選んでもらう
2-1.「ミカン」を選ばれたら「『mikan.txt』を表示しろ!」な指示をプログラム2に出す
2-2.「リンゴ」を選ばれたら「『ringo.txt』を表示しろ!」な指示をプログラム2に出す
2-3.「イチゴ」を選ばれたら「『ichigo.txt』を表示しろ!」な指示をプログラム2に出す

■プログラム2
1.指定されたファイルの中身を画面に表示する


このプログラムは問題があります。
何が問題か分かりますか?

例えば、悪い人が以下のようなプログラムを作って動かしたとしましょう。

■悪いプログラム
1.「『password.txt』を表示しろ!」な指示をプログラム2に出す


そうすると、画面には「password.txt」の内容が(もしファイルがあれば)表示されてしまいます。

「password.txt」なんていう名前のファイルです。
おそらく中にはパスワードが書いてあるでしょう。
秘密のパスワードが悪い人に見られてしまいます。

おっかないですね。

ピヨ太君の考えではプログラム2に来る指示は「mikan.txt」「ringo.txt」「ichigo.txt」のどれかです。
プログラム2が画面に表示する内容は「mikan.txt」「ringo.txt」「ichigo.txt」のどれかの中身になるはずでした。

ですが、実際には、それ以外のファイルを指定することも可能です。
そして、それ以外のファイルを指定されると、見られないはずのファイルの中身を見られてしまいます。

この話における、悪い人がピヨ太君の作ったプログラムに対してやったことがディレクトリトラバーサル攻撃です。
プログラムを作った人が想定していない内容を指定することで本当は見られない(と作った人は思っているけど実際には見られる)ファイルの中身を見ようとする行為を指します。

なお、ディレクトリトラバーサル攻撃が通用してしまうのは、作りがヘボいプログラムに対してです。
きちんと考えられたプログラムであれば、ディレクトリトラバーサル攻撃の餌食にはなりません。

先ほどの例で、プログラムにやらせたいことは

1.ミカンに対する説明を書いた「mikan.txt」とリンゴに対する説明を書いた「ringo.txt」とイチゴに対する説明を書いた「ichigo.txt」を用意する
2.使う人に「ミカン」「リンゴ」「イチゴ」のどれかを選んでもらう
3.選んでもらった内容に対応する説明(ファイル「○○.txt」の中身)を画面に表示する


でした。

ピヨ太君の作ったヘボいプログラムは

■プログラム1
1.使う人に「ミカン」「リンゴ」「イチゴ」のどれかを選んでもらう
2-1.「ミカン」を選ばれたら「『mikan.txt』を表示しろ!」な指示をプログラム2に出す
2-2.「リンゴ」を選ばれたら「『ringo.txt』を表示しろ!」な指示をプログラム2に出す
2-3.「イチゴ」を選ばれたら「『ichigo.txt』を表示しろ!」な指示をプログラム2に出す

■プログラム2
1.指定されたファイルの中身を画面に表示する


です。
プログラムに2に対して「『password.txt』を表示しろ!」な指示が来れば「password.txt」の中身が画面に表示されてしまいます。

ディレクトリトラバーサル攻撃7

これを、もし

■プログラム1
1.使う人に「ミカン」「リンゴ」「イチゴ」のどれかを選んでもらう
2-1.「ミカン」を選ばれたら「ミカンの説明を表示しろ!」な指示をプログラム2に出す
2-2.「リンゴ」を選ばれたら「リンゴの説明を表示しろ!」な指示をプログラム2に出す
2-3.「イチゴ」を選ばれたら「イチゴの説明を表示しろ!」な指示をプログラム2に出す

■プログラム2
1-1.「ミカンの説明を表示しろ!」な指示が来たら「mikan.txt」の中身を表示する
1-2.「リンゴの説明を表示しろ!」な指示が来たら「ringo.txt」の中身を表示する
1-3.「イチゴの説明を表示しろ!」な指示が来たら「ichigo.txt」の中身を表示する


のように作っていれば、ディレクトリトラバーサル攻撃の餌食にはなりません。
プログラム2に対して「『password.txt』を表示しろ!」や「パスワードの説明を表示しろ!」な指示が来ても「何言ってんだ?おまえ」となるからです。
ミカン、リンゴ、イチゴの説明以外は受け付けません。

ディレクトリトラバーサル攻撃8

実際のところ、ディレクトリトラバーサル攻撃を防ぐのは難しくありません。
ディレクトリトラバーサル攻撃を喰らうのは

外部から入力された値を、そのままファイル名の指定に使う

からです。
ファイル名の指定に入力値をそのまま利用しなければ防げます。
例えば「入力値が『1』だったら『mikan.txt』を読み込む」のような形にすれば問題ないでしょう。

あと、半分余談ですが「traversal(トラバーサル)」の意味は「横断」です。
「何が横断なの?」と思うかもしれませんので補足しておきます。

ファイル名……というかファイルの置いてある場所を指定する際には「../」というマークが使えます。
「../」は「自分が今いるところの1つ上(外)のディレクトリフォルダ)」を表すマークです。
このマークを駆使すると、他のディレクトリ(フォルダ)にあるファイルも指定できてしまうのです。

例えば「『password.txt』を表示しろ!」な指示であれば「今いるところにある『password.txt』を表示しろ!」な指示です。

ディレクトリトラバーサル攻撃9

これが「『../tonari/password.txt』を表示しろ!」な指示であれば「今いるところから一個上がったところにある『tonari』にある『password.txt』を表示しろ!」な指示になります。

ディレクトリトラバーサル攻撃10

ディレクトリをまたいで(横断して)ファイルを指定していますよね?

これが「ディレクトリトラバーサル攻撃(ディレクトリ横断攻撃)」の由来です。

image piyo2

一言でまとめるよ

まぁ「ディレクトリトラバーサル攻撃」って単語が出てきたら「特別な指定の仕方をすることで見られないはずのファイルの中身を見てやるぜ攻撃なんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク