1P by GN⁺ | ★ favorite | 댓글 1개
  • 캐나다의 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 II0x55 바이트를 null로 바꾸고 디코딩 오류를 만들지 않았음
  • Manchester 인코딩의 역할

    • Manchester는 신호가 논리 low나 high 상태에 오래 머물지 않도록 하는 단순 디지털 변조 방식임
    • 데이터 신호를 데이터와 동기화가 결합된 신호로 바꿔 clock recovery에 유용함
    • 아날로그 매체는 잡음과 간섭에 취약하기 때문에, 이런 특성은 디지털 데이터를 보낼 때 도움이 됨
    • Manchester에서는 이진 데이터를 서로 반대인 두 비트로 인코딩함
    • 예: 001, 110이 되거나 관례에 따라 반대로 사용됨

패킷 구조와 롤링 코드 추정

  • 버튼 입력마다 보이는 구조

    • 여러 캡처를 수동 비교한 결과, 각 버튼 입력은 일정한 구조를 가짐
    • 긴 무데이터 버스트 1개가 있으며, 디코딩하면 null 바이트 100개가 됨
    • 매우 비슷하지만 2바이트가 부분적으로 바뀌는 버스트 3개가 있음
    • 앞의 3개와 상당히 비슷하지만 더 짧은 최종 버스트 1개가 이어짐
    • 가운데 3개 버스트를 주요 패킷으로 보고 더 자세히 분석함
    • 새 신호마다 1씩 증가하는 것으로 보이는 증가 ID가 발견됨
  • 롤링 코드 메커니즘

    • 롤링 코드는 키리스 엔트리 시스템에서 단순 재생 공격을 막기 위해 쓰임
    • 공격자가 전송을 녹음했다가 나중에 재생해 수신기가 잠금 해제되도록 하는 방식을 방지함
    • 자동차와 리모컨은 암호학적으로 안전한 알고리듬에 합의해 인증에 사용할 롤링 코드를 생성함
    • 키는 카운터를 이용해 생성·추적되며, 리모컨과 자동차의 카운터가 동기화 상태를 유지해야 함
    • 유효성 창은 자동차가 신호를 받지 못한 경우에도 리모컨이 동기화에서 벗어나지 않게 해줌
    • 많은 구현에서 최대 255회의 범위 밖 버튼 입력을 허용하며, 이후에는 리모컨을 수동 재동기화해야 함
  • 신호 필드 식별

    • 롤링 코드가 암호학적으로 안전하므로, 신호에서 엔트로피가 가장 높은 부분이 해당 구현과 관련된 영역으로 식별됨
    • 앞서 찾은 증가 ID는 롤링 코드 시스템의 카운터로 추정됨
    • lock과 unlock 신호를 비교하자 명령을 나타내는 바이트가 식별됨
    • 8 = unlock
    • 4 = lock

순번, 체크섬, syncword

  • 패킷 순번으로 보이는 값

    • 남은 가변 영역 중 하나는 캡처된 다른 신호들에서도 같은 값들이 반복됨
    • 3개 값을 이진수로 보면 상위 비트가 순번처럼 증가함
    • 0x6: 0110
    • 0xA: 1010
    • 0xE: 1110
    • 4번째 최종 패킷까지 보면 0x13: 10011 형태가 되어, 패킷 순번을 담는다는 해석과 맞음
    • 최하위 비트 변화는 이 판단에서 제외함
  • XOR 체크섬

    • 마지막 바이트는 패킷마다 바뀌고, 전체 신호 사이에서도 무작위처럼 바뀜
    • 패킷 마지막 바이트이고 불규칙하게 변하므로 체크섬일 가능성이 있음
    • 이 바이트와 앞서 분석한 순번 바이트를 XOR하면 각 예시에서 고정값이 나옴
    • 예시 1:
      • 0x06 ^ 0xB9 = 0xBF
      • 0x0A ^ 0xB5 = 0xBF
      • 0x0E ^ 0xB1 = 0xBF
    • 예시 2:
      • 0x06 ^ 0xCC = 0xCA
      • 0x0A ^ 0xC0 = 0xCA
      • 0x0E ^ 0xC4 = 0xCA
    • 모든 패킷 바이트에 XOR를 적용하면 값이 항상 1만큼 어긋났고, 첫 2바이트가 체크섬에서 제외됐을 가능성이 높음
    • 첫 2바이트는 수신기를 동기화하고 데이터 시작을 나타내는 syncword 역할로 해석됨

최종 신호 구성과 다음 단계

  • 초기의 긴 버스트는 비활성 상태에서 저전력 모드에 있는 라디오 수신기를 깨워 데이터 수신을 준비시키는 역할을 함
  • 리모컨이 거의 같은 데이터를 담은 패킷 3개를 보내는 이유는 전송 중 하나가 손상될 경우를 대비한 신뢰성 확보임
  • 최종 라벨링 결과, 자동차 키 포브 신호는 syncword, 롤링 코드 관련 영역, 카운터, 명령 바이트, 패킷 순번, XOR 체크섬 등으로 나뉘어 해석됨
  • 다음 단계는 이 신호 형식을 Flipper Zero에 통합해 읽기, 재직렬화, 재생을 지원하는 작업임
  • 부정확한 정보나 개선 여지가 있으면 GitHub에서 pull request를 보낼 수 있음

댓글과 토론

Hacker News 의견들
  • AliExpress에서 산 저가 자동차 키 리모컨을 전자 프로젝트 때문에 역공학해야 했는데, 오실로스코프와 Wikipedia만으로도 오래 붙잡고 있으니 해낼 수 있었음
    다음에는 이 블로그 글의 방법을 써보고, 더 나은 해커가 되어볼 생각임

  • 비슷한 목적의 GNU Radio 흐름 그래프도 있음: https://github.com/bastibl/gr-keyfob
    발표 자료: https://www.fleark.de/keyfob.pdf

  • 리모컨과 자동차 사이에서 카운터로 키를 생성·추적해 동기화를 유지한다면, 학습형 리모컨은 이걸 어떻게 우회하는지 늘 궁금했음
    내 차에는 내장 차고문 버튼이 몇 개 있고, 차를 학습 모드로 둔 상태에서 차고 리모컨 버튼을 눌러 설정했던 것 같음. 단순 재생이 아니라 신호를 디코딩하고 종류를 인식한 뒤 오프너와 페어링을 시작하는 식의 훨씬 복잡한 기능인지 궁금함

    • 그건 HomeLink처럼 들리고 실제로 더 복잡한 방식임
      여러 회사와 협력해서 고정 코드와 롤링 코드를 지원하고, 해당 차고문에 페어링할 수 있게 하는 것으로 이해함. 미국 최대 차고문 제조사인 Chamberlain[0]은 여러 브랜드를 소유하고 있고, 디코딩 가능한 알려진 롤링 코드 알고리즘을 사용함[1]
      [0] https://www.chamberlain.com/
      [1] https://github.com/argilo/secplus
    • 대부분의 차고문 오프너는 롤링 키가 아니라 매번 같은 코드를 보내는 것으로 이해하고 있음
    • 방향이 반대임. 학습하는 쪽은 차고문 오프너 본체이고, 자동차 버튼은 그냥 신호를 송신함
      이 과정은 오프너에게 “이 새 리모컨 소리 들리지? 얘도 문을 열 수 있게 해줘”라고 알려주는 것에 가까움. 자동차 쪽 버튼은 흔한 프로토콜 몇 개를 순환하는 듯하고, 현실적으로 미국에서 널리 쓰이는 건 Chamberlain/Liftmaster나 Genie 계열의 4~5개 정도일 것임
    • 고정 코드 시스템에서는 리모컨이 매번 같은 신호를 보내며, 보통 리모컨과 본체의 DIP 스위치 같은 방식으로 이웃과 다른 고정 신호를 설정함
      이런 시스템의 학습형 리모컨은 녹음한 신호를 그대로 재생하는 것만으로도 동작할 수 있지만, 녹음 중 같은 대역의 무선 초인종 같은 다른 신호가 섞이면 엉뚱한 것도 함께 재생될 수 있음. 그래서 최소한 실제 문 신호 부분만 잘라내는 처리가 필요하고, 더 낫게는 신호를 디코딩해 코드를 알아낸 뒤 매번 깨끗한 새 신호를 생성하는 방식이 좋음
      미국의 거의 모든 가정용 차고문 오프너 회사는 1990년대에 신모델을 롤링 코드로 바꿨기 때문에, 설치된 지 25년 안팎 이하라면 거의 확실히 롤링 코드를 씀. 보통 원격 리모컨이 시드를 가진 의사난수열을 생성하고, 누를 때마다 다음 값을 보내며, 본체는 학습 모드에서 연속 값 몇 개를 보고 해당 시드를 추정해 리모컨 목록에 추가함
      동작 중에는 본체가 받은 순열 값을 디코딩해 알려진 리모컨 중 예상 범위에 있는지 확인하고, 맞으면 문을 열고 해당 리모컨의 위치를 갱신함. 아이가 이동 중 버튼을 여러 번 눌러도 집에 와서 안 열리는 일이 없도록 약간의 여유 범위도 둠
      기존 롤링 코드 리모컨을 복제하는 학습형 리모컨도 원리상 가능하지만, 본체 입장에서는 복제본과 원본이 같은 리모컨임. 둘 중 하나를 오래 안 쓰는 사이 다른 쪽이 순열을 여유 범위 밖으로 밀어버리면 한쪽이 작동하지 않을 수 있고, 재페어링도 시스템 세부 구현에 따라 꼬일 수 있음
      실제로 본 롤링 코드용 범용 리모컨들은 기존 리모컨에서 배우기보다, 본체 종류를 리모컨에 알려준 뒤 제조사 리모컨처럼 본체와 새로 페어링하는 방식이었음. 사용자 인터페이스가 빈약해서 설명서 표에서 번호를 찾고 숨겨진 버튼을 누른 다음, 프로그램할 버튼을 그 번호만큼 누르는 식일 가능성이 큼
      기존 리모컨 신호를 보고 어떤 롤링 코드 시스템인지 자동 판별하면 좋겠지만, 그러려면 수신기가 필요하고 그 용도 외에는 쓸 일이 거의 없어 정당화하기 어렵다. 차고문 페어링과 개폐 명령은 기본적으로 리모컨에서 본체로 가는 단방향임
  • 글쓴이는 모두 디코딩했지만 실제로 차 문을 연 것은 아님. 아직 롤링 코드를 깨야 하고, 거기에 1을 더해 다시 보내는 식으로는 안 됨
    외부에서 보면 다음 롤링 코드는 무작위처럼 보여야 함

    • 그래서 첫머리에 “생각만큼 취약하지는 않다”고 적혀 있음
    • 무차별 대입이 어려운지가 관건임. 어렵다면 스니핑은 가능해도, 진짜 버튼 입력을 먼저 녹음하지 않고는 차를 열 수 없음
  • 자동차 제조사들이 지갑에 넣을 수 있는 아주 작은, 어쩌면 RFID 리모컨을 만들기 시작했으면 좋겠음
    아니면 신용카드 크기의 작은 Flipper 비슷한 기기가 같은 일을 해주길 기대함. 진지하게, 자동차 키는 내 주머니에서 휴대폰 다음으로 큰 물건이고 적어도 두께 기준으로는 꽤 거슬림

    • 원하는 건 결국 휴대폰이 자동차 키가 되는 것 같음
    • BYD 전기차에는 차를 열고 시동을 걸 수 있는 신용카드 크기의 NFC 키가 함께 제공됨
  • 오랜만에 이해할 수 있는 글이라 신선했음

  • 키 프로그래밍 장비 접근이 쉬워지면서, 키 프로그래밍 권한이 더 강한 “보안” 뒤로 들어가는 흐름이 흥미로움
    무엇이 “보안” 시스템의 일부인지는 제조사가 정하고, 키뿐 아니라 수많은 모듈까지 확장될 수 있음. 규칙을 잘 지키는 것으로 유명한 범죄자들에게 효과가 있을지는 논쟁적이지만(/s), 일부 업체에는 분명 영향을 줌
    범죄 기록이 있으면 참여가 막힐 수 있음. 형기를 마친 뒤 자영업을 시작해 성공하는 길이 전과자에게는 중요한 경로 중 하나인데, 이 제도에서는 막막해질 수 있음
    https://wp.nastf.org/?page_id=367
    https://wp.nastf.org/wp-content/uploads/2023/07/ApplicationC...

  • 굳이 신호를 가로채고 디코딩하고 다시 인코딩할 필요가 있을까? 큰 안테나로 키 리모컨과 차량 사이를 중간자 공격해서 서로 더 가까이 있다고 믿게 만들면 됨

    • 패시브 키리스 엔트리가 이렇게 널리 퍼진 게 놀라움. 보안 기능보다 외형과 편의가 우선된 설계임
    • 기가헤르츠 대역일 텐데, 소비자 수준의 어떤 안테나가 자동차가 감지할 만큼 과한 신호 대 잡음비를 만들지 않고 키 리모컨 신호를 전달하거나 증폭할 수 있는지 궁금함
  • 요즘은 차 안에 들어가기만 하면 OBD 도구로 새 키를 프로그래밍하고 그대로 몰고 갈 수 있어서, 이게 훨씬 더 흥미롭고 심각하게 불안전함

  • 기본 Flipper도 원시 신호를 수신할 수 있음