
CVE-2021-27289: Ksix Zigbee 기기에서 재생 보호 우회
안녕하세요 여러분,
제 생각에 전문적인 방법은 이 저장소의 이름을 원래대로 짓는 일이었을 거예요. 명확하고, 서술적이며, 요점을 바로 찌르는 이름이요. 하지만 정리하다 보니 몇 가지 다른 제목들이 떠오르더군요. 예를 들어:
어쨌든, 지금부터 그 이야기입니다.
새로운 취약점을 공개할 준비를 하던 중, 몇 년 전에 작업했던 일이 떠올랐습니다. Thread나 Zigbee 같은 IoT 프로토콜을 연구하면서 졸업 프로젝트로 발견했던 버그 말이죠. 당시 MITRE에 보고서를 보냈지만 답변을 받지 못해서 그냥 무시된 줄 알았습니다.
호기심이 생겨 제출할 때 사용했던 예전 Gmail 계정에 다시 로그인해 보았습니다. 그런데 놀랍게도 3년 후인 2023년에 실제로 CVE가 할당되어 있었습니다.
CVE-2021-27289, 제가 학생 때 신고했던 취약점과 연결된 CVE입니다.
왜 그렇게 오래 걸렸을까요? 처음에 벤더에 연락했을 때, 그들은 수정할 인력이 충분하지 않다고 하면서 그 변명만 반복했습니다. 저는 MITRE에 아무도 조치를 취하지 않는 것 같다고 알렸고, 아마 그들은 기다렸던 것 같습니다. 어차피 이 문제는 패치될 일이 없었을 테니까요.
이 버그는 Ksix가 만든 여러 Zigbee 기반 IoT 장치에 영향을 미쳤습니다. 핵심 문제는 Zigbee 사양에 정의되고 프레임 카운터를 통해 적용되는 재생 보호 메커니즘이 제대로 구현되지 않았다는 점이었습니다.
장치들이 프레임 카운터를 올바르게 확인하지 않았기 때문에, 공격자는 시퀀스 번호를 장치가 마지막으로 본 값보다 높은 값으로 증가시키는 것만으로 네트워크와 통신하고 패킷을 위조할 수 있었습니다. 이를 통해 캡처한 메시지를 재생하여 유효한 메시지로 받아들이도록 만들 수 있었으며, 사실상 인증 우회가 가능했습니다.
이 저장소에는 제 졸업 프로젝트에서 작업한 모든 내용이 포함되어 있습니다:
Ksix Zigbee IoT 장치는 Zigbee의 재생 보호 메커니즘을 잘못 구현하여 발생하는 재생 공격 취약점의 영향을 받습니다.
다음 버전은 테스트 결과 취약한 것으로 확인되었습니다. 이후 버전은 테스트하지 않았으므로 이 역시 영향을 받을 수 있습니다.
이 제품들은 벤더 웹사이트나 Amazon 같은 플랫폼에서 더 이상 구할 수 없으며, 단종된 것으로 보입니다.
영향받는 장치의 Zigbee 스택은 Zigbee 사양에 정의된 프레임 카운터 필드에 의존하는 재생 보호 메커니즘을 제대로 적용하지 않습니다. 이 필드는 수신된 메시지가 새로운 것이며 재생된 것이 아님을 보장하기 위한 것입니다.
그러나 이 구현에서는 프레임 카운터가 무시되거나 제대로 검증되지 않습니다. 그 결과 공격자는 정상적인 Zigbee 패킷을 캡처하고, 시퀀스 번호를 더 높은 값(예: 250)으로 증가시킨 다음 네트워크에 재생할 수 있습니다.
장치들이 시퀀스 번호만 확인하기 때문에 메시지를 새로운 것으로 받아들이게 되며, 인증이나 암호화를 깨지 않아도 위조된 통신과 승인되지 않은 동작이 가능해집니다.
장치 유형과 환경에 어떻게 통합되었는지에 따라, 사용자가 네트워크를 설정할 때 사용했던 앱에 가짜 알림이나 위조된 센서 상태(예: 움직임 감지, 문 열림)가 표시될 수 있습니다. 실제로는 아무 일도 일어나지 않았는데도 말이죠. 더 복잡한 구성에서는 위조된 데이터를 기반으로 자동화 워크플로를 불안정하게 만들거나 의도하지 않은 동작을 트리거할 수도 있습니다.
이 장치들은 일반적으로 Tuya Smart 같은 앱이나 유사한 플랫폼을 사용하여 구성됩니다. 이러한 앱은 센서가 트리거될 때(예: 문이 열리거나 움직임이 감지될 때) 사용자에게 실시간으로 알림을 보냅니다. 물리적 사건이 실제로 발생하지 않더라도, 바로 이 때문에 아래 공격이 특히 효과적입니다.
이 특정 재생 취약점의 직접적인 영향은 제한적이지만, 제 졸업 프로젝트에서 탐구한 것처럼 프로토콜에 대한 더 깊은 이해는 최소한의 리소스로 수행할 수 있는 더 고급 공격 시나리오를 드러냅니다.
#!/bin/bash
function usage(){ echo -e "\nUsage: $0 [ZigbeeChannel] [SecuenceNumber] [HexDumpFile] [ShortSource] [ExtendedSource] [ShortDestination] [ShortPanId] [FCS]" echo -e "Example: $0 11 250 Open_Door_Alert_Hex_Dump 0x0001 11:ff:11:ff:11:ff:11:ff 0x0000 0x3333 0x0000 \n" echo -e "IMPORTANT: This is a script that I developed to understand how an IEEE 802.15.4 / Zigbee packet is formed, modify some fields of the packet in a simple way and see the effect when forwarding it to the network. If you want to exploit the vulnerability, follow the steps that I specify in the comments I make in the script. I exploited the vulnerability by spoofing a packet (sequence number 250) that contained the message "Door open".\n" }