「Nginx」に開発者泣かせのトラップか? 入れ忘れてはいけないあの記号:718th Lap
軽量かつ処理速度が速いことから、多くのWebサイトやサービスなどで使われているWebサーバソフト「Nginx」。開発者が肝を冷やす“トラップ”があることが分かった。
長らくWebサーバソフトで高いシェアを占めていた「Apache」は、2021年にその座を「Nginx」(エンジンエックス)に明け渡すこととなった。人気の理由は多機能でありながらも無償で利用できること、処理速度が早いこと、メモリ消費量が少ないこと、そして大量の同時接続処理を効率よく処理できることだ。
あるセキュリティアナリストは、Nginxに致命的な大欠陥があると報告した。ある記号を入れ忘れただけで、深刻なセキュリティホールを生む恐れがあるという。
Nginxに深刻なバグがあると報告したのは、セキュリティアナリストのダニエル・マツモト氏だ。同氏が参加するセキュリティラボ「Hakai」のラボブログの記事に詳細が記されている。
問題の箇所は、Nginxの設定にある「location」のディレクティブだ。locationでは、URLパスごとのアクセスをどう処理するかを指定できる。サーバのファイルにアクセスするときによく使われる。エイリアスのパスの指定についてはaliasディレクティブが使われる。
このlocationとaliasを組み合わせる場合、「locationで指定したURLの末尾にスラッシュ( / )を入れない」かつ「aliasで指定したパスの末尾にスラッシュ( / )を入れる」という2つの条件がそろうと深刻なセキュリティホールが生まれるという。
図1は、左の記述が正解で、右が問題の記述であることを示す。マツモト氏によれば、これはサイバーセキュリティカンファレンス「BlackHat 2018」でオレンジ・サイ氏が発見したものだという。
問題がある記述の場合、「/img」で始まるURLは全て「/var/images/」に転送される。例えば「/img/profile.jpg」にアクセスすると「/var/images//profile.jpg」へと転送されるのだが、この時「//」(スラッシュの連続)は無視されて「/var/images/profile.jpg」が示される。一方で、「/imgprofile.jpg」にアクセスがあった場合も同じく「/var/images/profile.jpg」が示される。
図2は、両者が同じ値を返していることを示す。これを利用して誰かが「/img..」にアクセスすると「/var/images/..」へのアクセスが可能になる。「/..」とは親ディレクトリを示すものだ。つまり、本来はアクセスできない「/var/」ディレクトリにアクセス可能になってしまう。正しい記述の場合は「/img..」にアクセスしても「/var/images..」を探すだけで親ディレクトリにはアクセスできない。
問題のある記述の場合、「/img../log/nginx/access.log」と記述することで「/var/log/nginx/access.log」にアクセスし、サーバのアクセスログを取得できるとブログ記事で指摘されている。
マツモト氏は、このセキュリティホールの数を探るためにGitHubリポジトリを調査した。「GitHub Code Search」を利用し、正規表現を使ってNginxに関わるリポジトリの中で「locationのパスの末尾にスラッシュがなく、aliasのパスの末尾にスラッシュが付いている」という条件に該当するコード検索してみた。すると約1900ものリポジトリにこのセキュリティホールが含まれていることが分かった。一部はコードのコメントを参照しているなど完全に一致するわけではないが、「それにしてもこの数は多い」とマツモト氏はコメントする。
マツモト氏は、ブログ記事でこの問題が存在するWebサービスを挙げている。その一つがオープンソースのパスワードマネジャー「Bitwarden」だ。自分のサーバでBitwardenを運用してパスワードを管理したい人に対して「Docker」イメージを提供している。これに含まれるコードに問題の記述が存在するとマツモト氏は報告した。
同氏の実験では、ユーザーがデータベースに「SQLite」を利用している場合、今回のバグによってユーザーのデータベースを丸ごとダウンロードできてしまうという。マツモト氏はBitwardenにこのことを報告したところ、同氏は報告の報奨金として6000ドルを受け取った。また、GitHubにGoogleが公開する「Google HPC-Toolkit」においても同様のことがあり、Googleから500ドルの報奨金が支払われたという。
わずかスラッシュ1つで大事になりかねない今回の問題。Nginxを運用する担当者であれば、注意しておきたいところだ。
上司X: Nginxに「スラッシュ1つ」で大きな脆弱性を抱えてしまう問題が発覚した、という話だよ。
ブラックピット: スラッシュがないだけで大変ですねえ。親ディレクトリにアクセスですか。
上司X: どことなく人ごとだな。
ブラックピット: まあ、僕はWebサーバにはあまり関わりがないもので。
上司X: まあ、そう言うだろうと思ったよ。でも、この話は報奨金が出るほどの深刻な話なんだよ。
ブラックピット: そうですねえ。企業サイドも報奨金を支払うほどのバグというかミスってことですよねえ。それを見つけて報奨金を得るっていうのもスゴいですね。
上司X: いやその、俺が言いたいのはだ、こういう小さな誤りが大問題に発展しかねないってことなんだよ。だからキミもいろいろ注意するんだよ。
ブラックピット: まあ、そうですね。気を付けますよ。僕も日頃から注意を重ねて、何かを見つけて報奨金を頂くことにしましょうかね。
上司X: いやに報奨金にこだわるな……。俺はお金をもらうとかそういうことを言いたいんじゃないんだが……。まあ、いいや。いずれにしても、キミがNginxに関わることがあったらくれぐれも注意するよう、今回の話を心に刻んでおいておくれよ。
ブラックピット(本名非公開)
年齢:36歳(独身)
所属:某企業SE(入社6年目)
昔レーサーに憧れ、夢見ていたが断念した経歴を持つ(中学生の時にゲームセンターのレーシングゲームで全国1位を取り、なんとなく自分ならイケる気がしてしまった)。愛車は黒のスカイライン。憧れはGTR。車とF1観戦が趣味。笑いはもっぱらシュールなネタが好き。
上司X(本名なぜか非公開)
年齢:46歳
所属:某企業システム部長(かなりのITベテラン)
中学生のときに秋葉原のBit-INN(ビットイン)で見たTK-80に魅せられITの世界に入る。以来ITひと筋。もともと車が趣味だったが、ブラックピットの影響で、つい最近F1にはまる。愛車はGTR(でも中古らしい)。人懐っこく、面倒見が良い性格。
Copyright © ITmedia, Inc. All Rights Reserved.