🇰🇷 한글 설명
tinyMQTT 브로커(커밋 6226ade15bd4f97be2d196352e64dd10937c1962, 2024-02-18)는 CleanSession이 0으로 설정된 상태에서 Client ID 길이가 0인 CONNECT 패킷을 받으면 CONNACK 0x02(Identifier Rejected)를 응답하지만 TCP 연결을 명시적으로 종료하지 않습니다. 이로 인해 잘못된 CONNECT 요청마다 소켓이 열린 상태로 남아, 반복 공격 시 파일 디스크립터와 메모리가 고갈되어 서비스 거부(DoS)가 발생할 수 있습니다.
💡 쉬운 설명
잘못된 연결 요청을 받았을 때 서버가 연결을 제대로 끊지 않아 연결 통로가 계속 쌓입니다. 이 상태가 반복되면 서버 자원이 고갈되어 정상 사용자가 서비스를 이용할 수 없게 됩니다.
🇺🇸 원문 (English)
In tinyMQTT commit 6226ade15bd4f97be2d196352e64dd10937c1962 (2024-02-18), the broker mishandles protocol violations during CONNECT packet parsing. When receiving a CONNECT packet with a zero-length Client ID while CleanSession is set to 0, the broker correctly replies with a CONNACK return code 0x02 (Identifier Rejected) but fails to explicitly close the TCP connection. Since the surrounding connection teardown logic is not guaranteed to execute, each such invalid CONNECT attempt leaves the underlying socket open. Repeated attempts cause server-side resource exhaustion due to accumulating file descriptors and memory usage, potentially resulting in denial of service.
📍 영향받는 시스템
tinyMQTT 커밋 6226ade15bd4f97be2d196352e64dd10937c1962(2024-02-18) 이하 버전을 사용하는 MQTT 브로커
⚔️ 공격 벡터
원격의 공격자가 CleanSession=0이고 Client ID가 빈 CONNECT 패킷을 대량으로 반복 전송하여 서버 자원을 소진시킴
🛡️ 대응 방법
패치된 최신 tinyMQTT 버전으로 업데이트하고, 프로토콜 위반 시 TCP 연결을 명시적으로 close하도록 수정하며, 연결 수 제한 및 IP 기반 요청 제한을 적용
🔧 검증 코드
VULNERABLE이 출력되면 취약한 커밋이며, NOT_MATCHED이면 해당 커밋이 아니거나 저장소가 없는 것이므로 빌드된 바이너리 버전과 패치 여부를 별도로 확인해야 함
cd tinyMQTT 2>/dev/null && git log -1 --format=%H | grep -q 6226ade15bd4f97be2d196352e64dd10937c1962 && echo VULNERABLE || echo NOT_MATCHED