CVE-2023-23752の検証

このブログは、進学して株式会社Armorisに戻ってきたアルバイトのseigo2016が書いています。 あるもりすぶろぐの内容は個人の意見です。

はじめに

検証には自身で管理する環境を使用し、自己責任でお願いします。また、この情報を悪用することは絶対に行わないでください。

今回は2023/01/17に報告された、CVE-2023-23752についての検証を行いました。 これは、OSSCMSである、Joomla!APIエンドポイントに不正なアクセスが可能になるものです。 また、パッチ適用までの攻撃への軽減方法の検証として、SnortおよびWAF(mod_security)を使用した対応も検討しました。

概要 

CVE-2023-23752

該当ソフトウェア: Joomla!
影響を受けるバージョン: 4.00 - 4.27
CVSSv3 Score: 5.3

脆弱性の検証

該当するエンドポイントのpublicパラメーターにtrueを指定をすることで、本来は認証が必要な情報が取得できてしまうものです。 下記の例では、認証なしにアカウント情報が表示されています。

脆弱性の原因

Joomlaのルーティングエントリのうち、ルートディレクトリのapi/index.php(開発者向けのREST API)が影響を受けます。
このAPIでは、parseApiRouteメソッドで、対応するルーティング情報にパースしています。
また、publicパラメーターは外部に公開するかを制御でき、デフォルトは非公開falseとなっています。
しかし、ユーザーが該当エンドポイントのパラメーターにpublic=trueを指定すると、デフォルトの値が上書きされ、本来認証を必要とする情報も、認証なしに公開されてしまいます。

影響の受けるエンドポイントには、データベースのアカウント番号やパスワードなど、重要な情報を取得することのできるものが含まれています。

修正されたJoomla4.2.8では、以下のように、publicパラメータが指定されていた場合、値を破棄することで修正されています。

// Remove the public key as it is only supported coming from the route definition
if (array_key_exists('public', $query)) {
    unset($query['public']);
}

また、Apache2のアクセスログを確認すると、脆弱性が存在するバージョンで該当エンドポイントにアクセスされた場合、ステータスコード200が返っていますが、修正後は401が返っています。

  • 修正前
172.16.0.97 - - [07/Mar/2023:05:09:41 +0000] "GET /エンドポイント?public=true HTTP/1.1" 200 2801 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0"
  • 修正後
172.16.0.97 - - [07/Mar/2023:05:12:51 +0000] "GET /エンドポイント?public=true HTTP/1.1" 401 595 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0"

攻撃の検出

次に、この脆弱性を悪用した攻撃をSnortとmod_securityで検出する方法について検証します。

環境

環境 バージョン
OS Ubuntu22.04
apache2 2.4.52
PHP 8.1.2
mariadb 15.1
Joomla 4.2.7
mod_security 2.9.5
Snort 3.1.56.0

mod_security

ModSecurityはオープンソースのWebアプリケーションファイアウォール(WAF)です。
今回はこれをJoomla!の起動しているホストのApache2で利用します。

環境構築

sudo apt install libapache2-mod-security2
sudo a2enmod security2
sudo systemctl restart apache2
cd /etc/modsecurity
sudo mv modsecurity.conf-recommended modsecurity.conf

独自ルールの作成

  • /usr/share/modsecurity-crs/rules/CVE-2023-23752.conf
SecRule ARGS:public "@contains true" "phase:1,id:730160,deny,status:403,msg:'CVE-2023-23752'"

ルール説明

項目 説明 備考
SecRule 検証ルールの設定
ARGS:name "@contains value" 検知する引数名と値を指定
phase: 処理を実行するタイミング 1:リクエストヘッダー,
2:リクエストボディ,
3:レスポンスヘッダー,
4:レスポンスボディ,
5:ロギング
id: すべてのルールにおいて一意のID
deny リクエストを拒否
status 応答ステータスコード
msg レスポンスボディ

検知ログ

指定した403で接続が拒否されました。

適切にログにも記録されています。

--863e664b-H--
Message: Access denied with code 403 (phase 1). String match "true" at ARGS:public. [file "/etc/modsecurity/CVE-2023-23752.conf"] [line "1"] [id "730160"] [msg "CVE-2023-23752"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client 172.16.0.97] ModSecurity: Access denied with code 403 (phase 1). String match "true" at ARGS:public. [file "/etc/modsecurity/CVE-2023-23752.conf"] [line "1"] [id "730160"] [msg "CVE-2023-23752"] [hostname "joomla-test.local"] [uri "エンドポイント"] [unique_id "ZAHAWG2I-FXmVvHMNIZYvQAAAAA"]
Action: Intercepted (phase 1)
Stopwatch: 1677836376179544 441 (- - -)
Stopwatch2: 1677836376179544 441; combined=159, p1=9, p2=0, p3=0, p4=0, p5=150, sr=0, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.5 (http://www.modsecurity.org/); OWASP_CRS/3.3.2.
Server: Apache/2.4.52 (Ubuntu)
Engine-Mode: "ENABLED"

--863e664b-Z--

Snort

SnortOSSのネットワーク型の侵入検知システムです。
Snortは自分でビルドする必要があります。
Snort のビルド手順及び環境構築については、後日別のエントリーで公開する予定ですのでそちらをご参照ください。

独自ルールの作成

Snortでは指定したrulesディレクトリ配下にを記載することで、独自ルールを設定することができます。

  • /usr/local/etc/rules/CVE-2023-23752.rules
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS ( msg:"Joomla Improper access check in webservice endpoints CVE-2023-23752"; content:"public=true"; reference:cve,2023-23752; flow:to_server,established; service:http; )

ルール説明

項目 説明 備考
alert アラート
tcp プロトコル指定
$EXTERNAL_NET any 外部ネットワークのすべてのポートからの通信
-> 通信の方向
$HOME_NET $HTTP_PORTS 通信を受けるサーバーのアドレス・ポート
msg ログに表示するメッセージ
content 指定した文字列がパケットのペイロードに含まれるか
reference 外部情報の参照
flow パケットの向き to_serverでサーバーに向かって送られるパケット

検知ログ

03/03-10:43:03.014939 [**] [1:0:0] "Joomla Improper access check in webservice endpoints CVE-2023-23752" [**] [Priority: 0] {TCP} 172.16.0.97:54704 -> 172.16.0.96:80
172.16.0.97 - - [07/Mar/2023:05:07:11 +0000] "GET エンドポイント?public=true HTTP/1.1" 403 494 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0"

最後に

今回はCVEの検証に加え、mod_security及びSnortで検出するルールの検証を行いました。
脆弱性を悪用した攻撃への対策として、セキュリティパッチを適用することが最重要ですが、 修正までの期間の軽減策としてmod_securityやSnortを使用することで、脆弱性を悪用した攻撃の検知や防御をできる場合があります。 Snort・mod_securityは非常に自由度が高く、環境に合わせたチューニングが重要ですが、OWASP ModSecurity Core Rule Setなどの基本的な攻撃を検出するルールセットも提供されています。 今回のCVE-2023-23752以外の脆弱性を悪用した攻撃に対するこれらの有用性の検証も今後行っていきたいと思います。

自分が管理するサーバー以外では絶対に試さないでください。 また、検証は自己責任で行ってください。 この情報を悪用することは絶対に行わないでください。