2017年9月は、かなり深刻な脆弱性が相次いで発見された月でした。中でもApache Tomcatの脆弱性は、相当深刻なレベルのものと理解しています。
今月は、Apache Tomcatの脆弱性について解説を行います。
CVE-2017-12615~Windows版Tomcat 7でリモートコード実行できる脆弱性のはずが……
2017年8月16日にリリースされたTomcat 7.0.81ですが、これはWindows版Tomcatが稼働している環境で、任意のコードを実行させられる脆弱性とされて「いました」。
具体的な実行手順は割愛しますが、リモートコード実行のためには、おおまかには以下の手順を踏みます。
- 実行させたい内容を記述したJSPファイルをアップロードする
- 当該JSPにアクセスし、記述された内容を実行する
CVE-2017-12615は、Tomcat 7.0.81で修正されましたが、その後の第三者検証により、以下のことが明らかになりました。
- CVE-2017-12615は修正されたものの、さらに悪質な脆弱性がTomcat 7.0.81で確認された
- 影響するバージョンは、9月25日時点のTomcat7~9の最新版
- 脆弱性の影響を受ける動作プラットフォームは、Windows以外にもLinux、Unixも入る
もともと、CVE-2017-12615については、2017年9月20日にJPCERT/CCから注意喚起が出されていましたが、上記のような状況を受けて、2017年9月25日に注意喚起の内容が更新されています。
- Apache Tomcat における脆弱性に関する注意喚起(最終更新: 2017-09-25)
- http://www.jpcert.or.jp/at/2017/at170038.html
CVE-2017-12617~広範なプラットフォームに影響するTomcat 7~9のリモートコード実行脆弱性に対し、新たに採番されたCVE番号
上記のように、広い範囲に影響するTomcatの脆弱性ということで、新たにCVE番号 CVE-2017-12617が採番されました。
本校執筆時点(2017年9月25日)では、まだ脆弱性修正が行われたTomcatはリリースされていないため、Tomcatそのものの設定もしくはTomcatと連携するWebサーバなどで影響するリクエストを止める必要があります。
現状の対策は、設定中のreadonlyパラメータをtrueにすること~PUTを制限するだけでは不十分
本脆弱性は、PUTをはじめとする「書き込みを行えるリクエスト」を、リクエスト内容を細工することで通してしまうものです。詳細は後述しますが、バージョンアップ以外で行える対処は、readonlyパラメータをtrueにするか、readonlyパラメータの設定を削除してしまうことです(readonlyパラメータを指定しないときは、true扱いになります)。
下記は、Tomcat 7のweb.xmlを編集し、readonlyパラメータをfalseにしたもので取得したOPTIONSリクエストに対するレスポンスの内容です。readonlyパラメータをtrueにした状態でも、OPTIONSリクエストに対するレスポンスからは、PUTとDELETEが発行可能なように見えますが、実際にPUTやDELETEを発行しても受け付けられないことは検証済みです。
readonlyパラメータは、以下のように<servlet>~</servlet>で囲まれた部分に、<init-param>~</init-param>で囲まれたところでパラメータを設定するだけです。
以下に、readonlyパラメータをfalseにした記述を含む設定を示します。
書き込みを行うことを想起させるのは、PUTとDELETEですが、本脆弱性は、細工されたDELETEリクエストも処理するように仕向けることが可能です。これは、Webアプリケーションサーバ上に配置されたJSPファイルを削除することが可能ということを意味します。PUTを制限することで、アップロードされた任意コードの実行は防げますが、DELETEを制限しないとサーバ上のJSPファイルを削除可能になり、これはこれでDoS攻撃を誘発することになります。
大変残念なことに、本記事を校正している段階でまだ脆弱性が修正されたTomcatがリリースされていません。修正版がリリースされるまではPUTやDELETEなどのリクエストを受け付けないような設定にしておき、修正版がリリースされたらすみやかにTomcatのバージョンアップを行うことをお勧めします。