Apacheのmod_jkアクセス制御迂回の脆弱性

概要

2018年後半、Biznet Bilisim社のAlphan YAVAS研究員によって、Apacheのmod_jkのアクセス制御迂回に関する脆弱性が公開されました。それから数か月経過した後も国内外で断続的な被害が発生しているため、該当ホールの内容と攻撃シナリオについて紹介します。

mod_jkとは?

  • ApacheやTomcatを連動するためにmod_jkと呼ばれるモジュールを使用していますが、これはAJPプロトコルを使用してTomcatと連動するために作られたApacheモジュールです。
  • AJPとは、Apacheがウェブサーバーと外部サービス(Tomcatなど)を連動するために定められた規約(プロトコル)です。

mod_jkと連動したApache、Tomcatが動作する手続き

1. ユーザーのブラウザは、Apacheのウェブサーバー(ポート80)に接続してリクエスト
2. Apacheのウェブサーバーは、ユーザーのリクエストがTomcatで処理するように指定されたものか確認
3. リクエストをTomcatで処理する場合、ApacheのウェブサーバーはTomcatのAJPポート(8009ポート)に接続してリクエストを送信
4. TomcatはApacheのウェブサーバーからのリクエストを受けて処理した後、処理結果をApacheのウェブサーバーに返却
5. ApacheウェブサーバはTomcatから受信した処理結果をユーザーに送信

ApacheとTomcatを連動させる利点

1.データ処理分散が効率的

  • html、image/cssなどの静的データはhttpdで処理し、JSPファイル処理などの動的処理は、Tomcatで行うのがより効率的です。

2.ロードバランシングも可能

  • 同一サーバー内でサービスを複数のTomcatを用いてサービスしたいときに使用できます。

3. Apacheのさまざまな機能を使用することができる

  • Apacheで提供する便利なモジュールはTomcat単体では使用することができません。

脆弱性の詳細

Apacheのmod_jk Connectorモジュールの1.2.0〜1.2.44バージョンは脆弱性があります。Apache HTTPDとTomcat間の経路決定のうち、セミコロン文字列を処理する過程でのエラーによりアクセス制御を迂回できるという脆弱性です。

  • Apache HTTPDは、経路解析のためにURLのセミコロンを通常の文字として解釈しますが、Tomcatはクエリの区切り記号(「?」といった機能)と解釈します。これを利用した脆弱性と、さらに以前に発表されたCVE-2018-1323の脆弱性があります。
  • 攻撃者が http://server/java_app/..;と入力した場合、Apache HTTPD経路の通過(アクセス)を許容しませんが、Tomcatは文字列をそのまま「…」と解釈してアクセス迂回ができるため、これによりTomcatでアクセスできないリソースをインポートすることができます。(CVE-2018-1323)
  • 今回発見された CVE-2018-11759の脆弱性に似ているように見えますが、「..」ではない;(セミコロン)を処理する問題点を修正しなかったため、迂回可能の脆弱性が発生しました。

攻撃シナリオ

1. 一般的に、次のようなhttpdディレクティブを使ってJK Status Managerへのアクセスを制限します。(デフォルト値127.0.0.1のみアクセス可能)
2. 通常のページ(http://ドメイン/jkstatus)に接続しようとしますが、アクセス制限により「403 Forbbiden」が発生します。
3. しかし、「/jkstatus」URLの後ろにセミコロンを挿入(’/jkstatus;’)することにより、アクセス制御が設定されていたページに迂回可能です。
4. URL GETパラメータとGUIを利用して、AJP Workerのポートを任意に変更できます。
5. ウェブサービスにアクセスすると「503 service unavailable」が発生し、サービス障害が発生します。

  • 上記のような方法でJkMountからURLを設定した場合は、当該URLも同様に脆弱性となります。
  • 基本的にJkstatus(JK Status Manager)インタフェースを迂回してアクセスできる場合、サービスの内部情報やAJP Workerの設定を変更して、サービス障害を発生させることができます。

脆弱性の回避策

最新バージョンにアップデート
  • 脆弱性がパッチされたApache mod_jk Connector 1.2.46以上にアップデート
  • 最新バージョンのダウンロードパス:http://tomcat.apache.org/download-connectors.cgi
  • 下記「【参考】最新バージョンのインストール方法」を参考に、セキュリティ更新プログラムを進行

具体的に行った対応例の紹介

状況の確認
  • 管理対象サーバーのうち外部にオープン(グローバルIP使用)している数百台をチェック:異常なし
    • 「/jkstatus」や推測可能な「/admin」「/manager」など主要URIのスキャンを進行
  • 脆弱性のあるバージョンのモジュールを使用しているサービス担当者に案内メールを送信
  • セキュリティ機器の脆弱性検出パターンを作成して、セキュリティ監視を施行
措置スケジュール

上記の状況より、攻撃者から推測可能な外部へ露出しているページは現在ないと判断され、緊急性を要していませんでした。
ただし、セキュリティ部門で確認できていないページや潜在的な脆弱性によって、攻撃を受けサービス障害が発生する可能性もあったため、パッチを進行いただくことをお勧めしました。

【参考】最新バージョンのインストール方法

1. 最新バージョンのmod_jkをダウンロード

#wget http://mirror.apache-kr.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.46-src.tar.gz

2. ダウンロードファイルの圧縮解凍およびディレクトリの移動

#tar-xf tomcat-connectors-1.2.46-src.tar.gz#cd tomcat-connectors-1.2.46-src/native/

3. TomcatをConnectorにインストール(コンパイル)

# ./buildconf.sh
./configure--with-apxs=/usr/bin/apxs&&make&&make install * apxsの場合、httpdパスの/binディレクトリを確認

4. インストールの確認
Apacheのhttpd modulesパスの「mod_jk.so」最新バージョンを確認

#strings mod_jk.so|grep mod_jk

最新バージョン更新後の脆弱性確認

最新バージョンが適用され、CVE-2018-11759の脆弱性を利用したアクセス迂回が不可能であることを確認しました。

TOAST Meetup 編集部

TOASTの技術ナレッジやお得なイベント情報を発信していきます
pagetop