先日、GIGAZINE で Nginx のエイリアストラバーサルについての記事を見かけたので、実際に Nginx サーバを立ててみて挙動を確認してみました。
・GIGAZINE の記事
スラッシュの有無だけでセキュリティにとんでもない大穴が空いてしまうNginxのありがちな設定ミスについて実例を踏まえて専門家が解説 - GIGAZINE
こちらの GIGAZINE の記事なんですが、セキュリティアナリストの ダニエル・マツモトさんという方のブログを、日本語で分かりやすく解説したような内容になっています。
・Hunting for Nginx Alias Traversals in the wild
https://labs.hakaioffsec.com/nginx-alias-traversal/
ちなみに、筆者は Nginx については仕事で何度か使ったことはありますが、設定ファイルを書いたことはなく(他のメンバーが書いていた)、Nginx そのものにあまり馴染みが無いというレベル感です。
結論
結論からお伝えすると「location と alias の両方とも末尾にスラッシュを付ける」こと、となるようです。
事前準備
今回は、Nginx のコンテナを立てて確認を行いました。バージョンは参考記事に合わせて 1.24.0 としています。
コンテナを立ち上げて http://localhost:8080
にアクセスして Welcome to nginx! のページが表示されるところまで進めます。
次に、コンテナの中に入って /var/images
ディレクトリを作成し、その配下に(記事に合わせて)JPEG ファイルを配置しておきます。
今回は、フリーの画像ファイルを適当にインターネットから拾ってきて、profile.jpg
という名称で配置しました。
最後に、設定ファイルを編集して、/var/log/nginx/access_test.log
にアクセスログが出力されるように指定しておきます。
編集後は service nginx reload
を忘れずに実行しておきます。
access_log /var/log/nginx/access_test.log main;
挙動の確認
それでは実際に挙動を確認してみます。
まず最初に、参考記事の方で「Vulnerable」として紹介されている脆弱性有りの設定内容を適用します。
location /img {
alias /var/images/;
}
参考記事にも書かれてあるのですが、「location で指定した /img
の末尾にスラッシュを付けない」かつ
「alias で指定した /var/images/
の末尾にスラッシュを付ける」という2つの条件が揃った時に重大な脆弱性が発生してしまうようです。
今回の設定内容が適用されている場合、Nginxは /img
で始まる URL を全て /var/images/
へ転送してしまうため、/img/profile.jpg
にアクセスすると、/var/images//profile.jpg
に転送され、連続スラッシュは無視されて /var/images/profile.jpg
のデータが返るとのことです。
この挙動を確認してみると 200 OK
で返ってきました。ファイルにアクセスできているようです。
筆者はパスに色付けすると理解しやすかったので、こちらに記載しておきます。
次に、/imgprofile.jpg
にアクセスしてみます。この場合は /var/images/profile.jpg
に転送されると書かれてあるので、この挙動を確認してみます。この場合も 200 OK
で返ってきました。ファイルにアクセスできているようです。2つの URL で同じファイルにアクセスできることになります。
さらに、/img..
という URL にアクセスすることで、/var/images/..
というパスで指定されるデータにアクセス可能とのことです。..
は皆さんも馴染みがあると思いますが「1つ上のディレクトリ」「親ディレクトリ」のことになります。
つまり、/var/images/..
は /var/
となり、本来公開されていないはずのディレクトリまで閲覧することができてしまいます。危険な状態と言えるかもしれません。
設定ファイルの alias 指定で末尾のスラッシュを付けずに /var/images
とした場合の挙動についても確認してみます。
location /img {
alias /var/images; // 末尾のスラッシュを付けない
}
この設定内容だと、URLの「/img..」にアクセスしても「/var/images..」という名前のディレクトリを探すだけなので親ディレクトリのデータにアクセスされることはないとのことなので、挙動を確認してみます。404 Not Found
が返ってきました。アクセスできないようです。
ただし、「/var/images_confidential」のようなディレクトリが存在している場合は「/img_confidential」というURLでアクセスできてしまうとのことなので、この挙動も確認してみます。
/var/images_confidential
ディレクトリを作成し、配下に test.txt
を作成します。
「/img_confidential」のURLでアクセスしてると、200 OK
が返ってきました。アクセスできるようです。
これらを踏まえると、冒頭に書いた結論のように「location と alias の両方とも末尾にスラッシュを付けるべき」ということになるようです。
さいごに
今、Nginx を使っている方やこれから使う予定のある方は、今一度、設定ファイルを見直してみても良いかも知れません。
ダニエル・マツモトさんが、今回の脆弱性を外部からブラックボックステストできるツールを公開されているようなので、(筆者は使っていませんが)気になる方は確認されてみてください。