- 캐나다의 Flipper Zero 금지 논란을 배경으로, 자동차 키 포브 RF 신호를 실제 캡처·분석해 단순 재생 공격이 어디까지 가능한지 확인함
- RTL-SDR는 24~1750MHz 범위의 원시 I/Q 데이터를 받아 시각화·저장·분석할 수 있고, Flipper Zero의 CC1101은 송수신은 가능하지만 올바른 RF 설정이 필요함
- 433.92MHz에서 버튼 입력마다 짧은 버스트 3개가 보였고, 중심 주파수 양쪽의 두 피크는 0과 1을 서로 다른 주파수에 싣는 2-FSK로 해석됨
- Universal Radio Hacker에서 FSK, 50 samples/symbol, Manchester II 디코딩을 적용하자 긴 무데이터 버스트, 3개의 주요 패킷, 짧은 최종 패킷 구조가 드러남
- 신호에는 롤링 코드용 고엔트로피 영역, 증가 카운터, lock/unlock 명령 바이트, 패킷 순번, XOR 체크섬, syncword가 식별돼 단순 재생만으로 대부분의 자동차를 훔치기 어렵다는 결론으로 이어짐
실험 목표와 맥락
- 몇 년간 RTL-SDR 동글로 무선 통신 프로토콜을 탐색해 왔고, 이번에는 자동차 키 포브가 데이터를 어떻게 전송하는지와 재생 공격 가능성을 확인하는 데 초점을 둠
- 이전에도 키 포브 신호를 캡처한 적은 있었지만, 테스트할 수 있는 자동차 접근이 제한돼 의미 있는 분석까지 이어지지 못함
- 이번 실험은 키 포브 신호를 실제로 역공학하고 재생하기 위한 준비 과정으로, 기초 RF 개념부터 분석 흐름까지 따라감
- 캐나다의 Flipper Zero 금지와 달리 대부분의 자동차는 단순 재생 공격만으로 훔치기 쉽지 않다는 문제의식도 함께 다룸
- Honda 관련 예외 사례로 RollingPwn이 언급됨
사용한 하드웨어
-
RTL-SDR
- 약 10달러짜리 지상파 TV/라디오 USB 동글을 다목적 RF 수신기로 바꿔 24~1750MHz 범위의 신호를 검사·디코딩할 수 있음
- RTL-SDR는 SDR을 사용할 수 있는 RTL2832U 칩 덕분에 강력함
- 일반적으로 하드웨어에서 처리되는 신호 처리를 건너뛰고, 호스트가 원시 I/Q 데이터에 직접 접근할 수 있음
- 원시 데이터를 받으면 변조 방식, 대역폭, 데이터율 같은 구체 설정을 미리 몰라도 수신·시각화·저장 후 직접 분석 가능함
-
Flipper Zero와 CC1101
- Flipper Zero에서 이 실험에 중요한 부분은 Sub-GHz 모듈임
- 해당 모듈은 CC1101 칩 기반이며, 일반 소비자 무선 기기에서 쓰이는 1GHz 이하 주파수를 지원함
- CC1101 모듈은 별도로 5달러 이상에 구매해 Arduino, Raspberry Pi, USB-to-TTL 어댑터와 함께 사용할 수도 있음
-
CC1101과 RTL2832U의 차이
- Flipper Zero의 CC1101은 트랜시버라서 신호 송수신이 모두 가능함
- RTL-SDR의 RTL2832U는 수신과 원시 신호 분석은 가능하지만 송신은 불가능함
- CC1101은 SDR을 지원하지 않기 때문에 완전히 처리된 데이터만 돌려주며, 송신 신호의 RF 설정이 맞아야 유용함
- 송수신 가능한 SDR 장비도 있지만 가격이 비싼 편임
RF 신호를 읽기 위한 기본 개념
- 무선 주파수 전송은 전자기파인 라디오파로 신호를 보냄
- 원래 전송하려는 신호보다 더 높은 주파수의 반송파를 사용해 공중 전송의 신뢰성을 높임
- 주파수는 반송파가 1초에 발생하는 횟수이며, 일반적으로 통신 채널을 정의하는 데 쓰임
- 변조는 데이터를 라디오파에 표현하는 방식임
- AM은 진폭 변화로 데이터를 표현함
- FM은 주파수 변화로 데이터를 표현함
- 대역폭은 변조된 RF 신호가 차지하는 주파수 범위이며, 신호가 실을 수 있는 데이터 양과 관련됨
SDR#로 확인한 키 포브 신호
-
도구와 주파수
- SDR#는 C#으로 작성된 무료 DSP 애플리케이션으로, SDR용 실시간 스펙트럼 시각화와 일부 일반 변조 복조를 지원함
- RTL-SDR 동글을 연결하고 기본 DVB-T 드라이버 대신 WinUSB 드라이버를 사용함
- 433.92MHz로 튜닝하면 근거리 리모컨 활동을 볼 수 있음
- 433.92MHz는 EU와 주변 국가, 그리고 거주지인 모로코에서 쓰이는 표준 비허가 주파수로 소개됨
-
관찰된 패턴
- 자동차 키 포브 버튼을 누를 때마다 연속된 짧은 버스트 3개가 생성됨
- 스펙트럼 중앙의 433.92MHz 양쪽에 두 개의 큰 피크가 나타남
- 일반 변조 방식을 조사한 결과, 이 형태는 2-FSK와 맞아 보임
- 화면에 보이는 작은 피크들은 저렴한 송신 하드웨어와 리모컨·안테나의 가까운 거리 때문에 생긴 원치 않는 주파수로 보고 무시함
-
2-FSK 해석
- FSK는 Frequency-Shift Keying으로, 반송파 주파수를 여러 이산 주파수 사이에서 바꾸며 데이터를 인코딩하는 주파수 변조 방식임
- 2-FSK의 “2”는 인코딩에 쓰이는 채널 수를 뜻함
- 이 경우 0과 1을 서로 다른 두 주파수로 인코딩하므로, 관찰된 두 피크를 설명할 수 있음
Universal Radio Hacker로 비트와 바이트 추출
-
URH를 사용한 분석
- Universal Radio Hacker는 무선 프로토콜 조사를 위한 오픈소스 도구 모음이며, 여러 SDR을 기본 지원함
- URH는 신호 복조와 변조 파라미터 자동 감지를 제공해 공중으로 오가는 비트와 바이트를 식별하는 데 사용됨
- 처음에는 올바른 파라미터를 찾지 못해 잘못된 결과가 나왔음
- 반복 신호를 한 번에 여러 개 녹음하자 자동 감지 성공률이 올라갔고, 해당 사례에서는 50 samples/symbol, FSK가 맞는 설정으로 나옴
-
버스트 구조와 Manchester 디코딩
- 신호를 확대하면 SDR#에서 본 3개 버스트가 다시 확인됨
- 두 번째 버스트는 다시 3개의 분리된 부분으로 이루어져 있어, 분석 대상은 총 5개 섹션이 됨
- 각 섹션에서 비트열을 자동 추출하고 16진수로 변환하자 반복 패턴이 보였지만, 같은 5개 16진수 숫자와 다수의
0x55바이트가 반복돼 추가 처리가 필요했음 - URH의 Analysis 탭에서 여러 디코딩 알고리듬을 시도한 결과, Manchester II가
0x55바이트를 null로 바꾸고 디코딩 오류를 만들지 않았음
-
Manchester 인코딩의 역할
- Manchester는 신호가 논리 low나 high 상태에 오래 머물지 않도록 하는 단순 디지털 변조 방식임
- 데이터 신호를 데이터와 동기화가 결합된 신호로 바꿔 clock recovery에 유용함
- 아날로그 매체는 잡음과 간섭에 취약하기 때문에, 이런 특성은 디지털 데이터를 보낼 때 도움이 됨
- Manchester에서는 이진 데이터를 서로 반대인 두 비트로 인코딩함
- 예:
0은01,1은10이 되거나 관례에 따라 반대로 사용됨
패킷 구조와 롤링 코드 추정
-
버튼 입력마다 보이는 구조
- 여러 캡처를 수동 비교한 결과, 각 버튼 입력은 일정한 구조를 가짐
- 긴 무데이터 버스트 1개가 있으며, 디코딩하면 null 바이트 100개가 됨
- 매우 비슷하지만 2바이트가 부분적으로 바뀌는 버스트 3개가 있음
- 앞의 3개와 상당히 비슷하지만 더 짧은 최종 버스트 1개가 이어짐
- 가운데 3개 버스트를 주요 패킷으로 보고 더 자세히 분석함
- 새 신호마다 1씩 증가하는 것으로 보이는 증가 ID가 발견됨
-
롤링 코드 메커니즘
- 롤링 코드는 키리스 엔트리 시스템에서 단순 재생 공격을 막기 위해 쓰임
- 공격자가 전송을 녹음했다가 나중에 재생해 수신기가 잠금 해제되도록 하는 방식을 방지함
- 자동차와 리모컨은 암호학적으로 안전한 알고리듬에 합의해 인증에 사용할 롤링 코드를 생성함
- 키는 카운터를 이용해 생성·추적되며, 리모컨과 자동차의 카운터가 동기화 상태를 유지해야 함
- 유효성 창은 자동차가 신호를 받지 못한 경우에도 리모컨이 동기화에서 벗어나지 않게 해줌
- 많은 구현에서 최대 255회의 범위 밖 버튼 입력을 허용하며, 이후에는 리모컨을 수동 재동기화해야 함
-
신호 필드 식별
- 롤링 코드가 암호학적으로 안전하므로, 신호에서 엔트로피가 가장 높은 부분이 해당 구현과 관련된 영역으로 식별됨
- 앞서 찾은 증가 ID는 롤링 코드 시스템의 카운터로 추정됨
- lock과 unlock 신호를 비교하자 명령을 나타내는 바이트가 식별됨
8= unlock4= lock
순번, 체크섬, syncword
-
패킷 순번으로 보이는 값
- 남은 가변 영역 중 하나는 캡처된 다른 신호들에서도 같은 값들이 반복됨
- 3개 값을 이진수로 보면 상위 비트가 순번처럼 증가함
0x6:01100xA:10100xE:1110- 4번째 최종 패킷까지 보면
0x13:10011 형태가 되어, 패킷 순번을 담는다는 해석과 맞음 - 최하위 비트 변화는 이 판단에서 제외함
-
XOR 체크섬
- 마지막 바이트는 패킷마다 바뀌고, 전체 신호 사이에서도 무작위처럼 바뀜
- 패킷 마지막 바이트이고 불규칙하게 변하므로 체크섬일 가능성이 있음
- 이 바이트와 앞서 분석한 순번 바이트를 XOR하면 각 예시에서 고정값이 나옴
- 예시 1:
0x06 ^ 0xB9 = 0xBF0x0A ^ 0xB5 = 0xBF0x0E ^ 0xB1 = 0xBF
- 예시 2:
0x06 ^ 0xCC = 0xCA0x0A ^ 0xC0 = 0xCA0x0E ^ 0xC4 = 0xCA
- 모든 패킷 바이트에 XOR를 적용하면 값이 항상 1만큼 어긋났고, 첫 2바이트가 체크섬에서 제외됐을 가능성이 높음
- 첫 2바이트는 수신기를 동기화하고 데이터 시작을 나타내는 syncword 역할로 해석됨
최종 신호 구성과 다음 단계
- 초기의 긴 버스트는 비활성 상태에서 저전력 모드에 있는 라디오 수신기를 깨워 데이터 수신을 준비시키는 역할을 함
- 리모컨이 거의 같은 데이터를 담은 패킷 3개를 보내는 이유는 전송 중 하나가 손상될 경우를 대비한 신뢰성 확보임
- 최종 라벨링 결과, 자동차 키 포브 신호는 syncword, 롤링 코드 관련 영역, 카운터, 명령 바이트, 패킷 순번, XOR 체크섬 등으로 나뉘어 해석됨
- 다음 단계는 이 신호 형식을 Flipper Zero에 통합해 읽기, 재직렬화, 재생을 지원하는 작업임
- 부정확한 정보나 개선 여지가 있으면 GitHub에서 pull request를 보낼 수 있음