このブログは、進学して株式会社Armorisに戻ってきたアルバイトのseigo2016が書いています。 あるもりすぶろぐの内容は個人の意見です。
はじめに
検証には自身で管理する環境を使用し、自己責任でお願いします。また、この情報を悪用することは絶対に行わないでください。
今回は2023/01/17に報告された、CVE-2023-23752についての検証を行いました。 これは、OSSのCMSである、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
SnortはOSSのネットワーク型の侵入検知システムです。
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でサーバーに向かって送られるパケット |
検知ログ
- Snortの検知ログ
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
- Apache2のアクセスログ
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以外の脆弱性を悪用した攻撃に対するこれらの有用性の検証も今後行っていきたいと思います。
自分が管理するサーバー以外では絶対に試さないでください。 また、検証は自己責任で行ってください。 この情報を悪用することは絶対に行わないでください。