パストラバーサル攻撃
本当は見られないはずのファイルの中身を見ようとする攻撃だよ
作った人が想定していないやり方でファイルを指定するよ
ヘボい作りのプログラムでなければ喰らわない攻撃だよ
簡単に書くよ
パストラバーサル攻撃(読:パストラバーサルコウゲキ 英:path traversal attack)とは
「ディレクトリトラバーサル攻撃」のこと。
用語の中身としては
プログラム内の「どんなファイルが欲しいんだい?」な処理に対して、プログラムを作った人が想定していなかったファイルを指定することで、本当は見られないはずだったファイルの中身を見ようとする攻撃
です。
詳しく書くよ
プログラムというのは、いろいろな処理をやります。
中には、ファイルを指定して、あれやこれやする処理もあるでしょう。
例えば「指定されたファイルの中身を表示する処理」などです。
このようなファイルをあれこれする処理に対して
プログラムを作った人が想像もしなかったようなファイルを指定することで、本当であれば部外者には見られないはずのファイルの中身を見ようとする悪いこと
が「パストラバーサル攻撃」です。
単に「パストラバーサル」と呼ばれたり「ディレクトリトラバーサル攻撃」などと呼ばれることもあります。
……と一息で説明されても分からないかもしれませんね。
大丈夫です。
例を挙げて説明します。
例えば、そうですね。
ピヨ太君が八百屋さんをやっています。
ピヨ太君の八百屋さんは注文制です。
あらかじめ
「 」を「 」個、注文します。
のように書かれた注文用紙があります。
お客さまは、ここに
「リンゴ」を「1」個、注文します。
や
「ミカン」を「3」個、注文します。
のように書いてピヨ太君に渡すことで、買い物ができます。
ある日のことです。
ピヨ太君の元に
「冷蔵庫の奥に隠してある、とっておきの苺ショートケーキ」を「1」個、注文します。
という注文書が届きました。
注文書の差出人はピヨ子さんです。
なんと!
売り物ではないはずの苺ショートケーキを注文されてしまいました。
ですが、注文されてしまったものは仕方がありません。
泣く泣く、ピヨ太君は苺ショートケーキをピヨ子さんに渡しました。
ピヨ太君は注文の対象を八百屋の商品に限っていました。
ただし、それはあくまでピヨ太君の中のルールです。
ピヨ太君が「そのつもり」だっただけです。
「注文する品は八百屋の商品の中から選んでください」のような注意書きはありませんでした。
実際には八百屋の商品以外も注文できてしまいます。
そこに目を付けたのがピヨ子さんです。
その気になれば八百屋の商品以外も注文できる穴を利用して、見事に苺ショートケーキを手に入れました。
これをコンピュータの世界でやるのがパストラバーサル攻撃です。
本当であれば指定できない(とプログラムを作った人は思っているけど実際には指定できる)ファイルを指定して、本当であれば中身を見られないはずのファイルの中身を見てやるぜ!な攻撃
です。
せっかくなので、もう少しコンピュータに近い例も見てみましょう。
ピヨ太君は以下の処理をするプログラムを作りました。
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の代わりに動かすやつ)
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」の中身が画面に表示されてしまいます。
これを、もし
■プログラム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』を表示しろ!」や「パスワードの説明を表示しろ!」な指示が来ても「何言ってんだ?おまえ」となるからです。
ミカン、リンゴ、イチゴの説明以外は受け付けません。
実際のところ、パストラバーサル攻撃を防ぐのは難しくありません。
パストラバーサル攻撃を喰らうのは
外部から入力された値を そのままファイル名の指定に使う
からです。
ファイル名の指定に入力値をそのまま利用しなければ防げます。
例えば「入力値が『1』だったら『mikan.txt』を読み込む」のような形にすれば問題ないでしょう。
あと、半分余談ですが「traversal(トラバーサル)」の意味は「横断」です。
「何が横断なの?」と思うかもしれませんので補足しておきます。
ファイル名……というかファイルの置いてある場所(パス)を指定するときには「../」というマークが使えます。
「../」は「自分が今いるところの1つ上(外)のディレクトリ(フォルダ)」を表すマークです。
このマークを駆使すると、他のディレクトリ(フォルダ)にあるファイルも指定できてしまうのです。
例えば「『password.txt』を表示しろ!」な指示であれば「今いるところにある『password.txt』を表示しろ!」な指示です。
これが「『../tonari/password.txt』を表示しろ!」な指示であれば「今いるところから一個上がったところにある『tonari』にある『password.txt』を表示しろ!」な指示になります。
ディレクトリをまたいで(横断して)パスが指定されていますよね。
これが「パストラバーサル攻撃(パス横断攻撃)」の由来です。
一言でまとめるよ
まぁ「パストラバーサル攻撃」って単語が出てきたら「特別な指定の仕方をすることで見られないはずのファイルの中身を見てやるぜ攻撃なんだな~」と お考えください。
おまけ
■訳してみるよ
「path(パス)」の意味は「小道」とか「散歩道」とか「進路」とか「方針」とかです。
「traversal(トラバーサル)」の意味は「横切る」とか「横断する」とかです。
「攻撃」は日本語ですね。
何となく くっつけると
小道を横断する攻撃
となります。
■検索してみる?






