Sep 15, 2026BY leehojune
publicglitchingchipwhispererphywhisperer

Chipwhisperer와 Phywhisperer 소개

1. Introduction

지난 글에서는 오실로스코프로 trezor one의 vdd와 vcap 파형을 관찰해 글리치가 칩에 들어갔는지를 확인하는 방법에 대해 소개했습니다. 오실로스코프도 정확한 폴트 인젝션을 위해 필요하지만, 실제 공격을 위해서는 글리치를 실제로 만들어서 정확한 시점에 발사하는 도구도 필요합니다. 이번 글에서는 글리치를 실제로 넣는 Chipwhisperer와, trezor one의 전원을 제어해 글리치를 반복하게 해주는 Phywhisperer를 소개하겠습니다.

2. Chipwhisperer

2.1 개요

d3b3538f-e1e9-4bb0-a90f-813e059e5c0e.jpg
Chipwhisperer는 임베디드 기기의 하드웨어 보안을 연구하고 실습하기 위한 오픈소스 툴체인입니다. 주로 장치의 전력 소비 정보를 이용해 공격을 수행하는 전력 분석과, 장치의 전원이나 클럭을 일시적으로 교란시켜 의도치 않은 동작을 유발하는 전압 및 클럭 글리칭 공격을 위해 사용됩니다.

2.2 Chipwhisperer 구성 요소

Chipwhiseprer는 총 4개의 오픈 소스 컴포넌트로 이루어져 있습니다.
하드웨어
  • 글리칭 공격을 수행하는데 사용되는 스코프 보드와 테스트 대상 장치(DUT) 역할을 하는 타겟 보드
  • chipwhisperer-capture Github 저장소에 설계 파일과 회로도 공개
펌웨어
  • 스코프 보드 펌웨어: FPGA용 베릴로그와 C로 작성되어 chipwhisperer-capture 저장소에 공개, Husky는 chipwhisperer-husky 저장소에 공개
  • 타겟 보드 펌웨어: 대부분 C로 작성되어 chipwhisperer 저장소에 공개
소프트웨어
  • 캡처 하드웨어를 제어하고 타겟과 통신하는 오픈소스 python 라이브러리
  • scope, target, capture, analyzer API chipwhisperer 저장소에 공개
Chipwhisperer 튜토리얼
  • 사이드 채널 분석과 폴트 인젝션 기본 메커니즘, Chipwhisperer를 활용한 여러 공격에 대한 튜토리얼
  • chipwhisperer-jupyter 저장소에 공개

2.3 하드웨어 라인업

Chipwhisperer 스코프 보드는 크게 Nano, Lite, Husky, Pro의 네 갈래로 나눌 수 있습니다. 현재 Pro는 단종되어 Husky Plus나 Husky로 대체되고 있다고 합니다. Nano나 Lite는 저사양 라인업이고, Husky가 일반적으로 빠르고 정밀한 글리치에 사용되고 있습니다.
모델ADC샘플 버퍼스트리밍
Nano (CW1101)저사양작음X
Lite (CW1173)105 MS/s, 10-bit24kX
Husky200 MS/s, 12-bit80k20 MSPS @ 8-bit
Pro(단종)
타겟 보드는 일반적으로 CW308 UFO 범용 타겟 보드에 STM32 등 개별 타겟 모듈을 꽂아서 사용하는 방식입니다.
피지컬랩 Trezor 폴트 인젝션 프로젝트에서는 Chipwhisperer Husky를 사용했습니다. Husky의 강점으로는 글리치 해상도를 내부 VCO 기반으로 조정할 수 있는데, 다른 모델에서는 글리치 소스 클럭을 기반으로 글리치를 만들기 때문에 Husky에서 더 정밀하고 재현성 높은 글리치를 만들 수 있다고 합니다.

2.4 글리치 생성 원리

글리칭에는 크게 클럭 글리칭과 전압 글리칭이 있습니다. 클럭 글리칭은 타깃의 클럭에 짧은 이상 펄스를 끼워 넣는 방식이고, 전압 글리칭은 공급 전압을 순간적으로 떨어트리는 방식입니다. RDP 다운그레이드처럼 외부에서 클럭을 건드릴 수 없는 대상에는 전압 글리칭을 씁니다.
ChipWhisperer의 전압 글리칭은 Crowbar 방식을 씁니다. MOSFET로 타깃의 VDD 또는 VCAP을 그라운드에 순간적으로 연결시켜 전압을 짧게 떨어뜨리는 것입니다. CMOS 로직은 전압이 충분해야 정상 동작하는데, 이 순간 노이즈 마진을 잃으면서 명령 하나가 건너뛰어지거나 잘못 실행되고, 이를 통해 RDP 검사를 통과시키는 것이 목표입니다.
글리치 폭이 너무 작으면 전압이 충분히 떨어지지 않아서 칩이 정상적으로 동작하게 되고, 글리치 폭이 너무 크면 칩이 리셋되기도 해서 그 사이의 적당한 폭을 찾아나가며 글리치를 주입행야 합니다.

2.5 글리치 파라미터

글리치 펄스는 scope.glitch 모듈로 만듭니다. 이렇게 만든 펄스를 클럭과 어떻게 결합해 내보낼지는 output 모드가 정하고, 전압 글리칭일 때는 scope.ioglitch_hp/glitch_lp로 crowbar MOSFET를 켜서 타깃 전원 라인에 실어 보냅니다.
주요 파라미터는 다음과 같습니다.
  • ext_offset: 트리거 후 글리치를 넣기까지의 지연
  • offset: 글리치 펄스 상승엣지가 클럭 엣지에서 얼마나 떨어질지
  • width: 글리치 펄스의 폭(지속 시간)
  • repeat: 한 트리거당 글리치 펄스 수 (enable_only 모드에서는 개별 펄스 대신 repeat 사이클만큼 폭이 넓은 단일 펄스)
  • output: 글리치를 클럭과 결합하는 방식 — clock_only / glitch_only / clock_or / clock_xor / enable_only
  • trigger_src: 글리치 트리거 방식 — continuous(계속) / manual(수동) / ext_single(조건 충족 시 1회) / ext_continuous(조건마다 반복)
  • clk_src: 글리치 모듈의 입력 클럭 — target(타깃 클럭) / clkgen(내부 CLKGEN DCM) / pll(Husky 전용)
이 프로젝트에서 실제로 쓴 값은 다음과 같습니다. 정확한 파라미터는 기기마다 달라질 수 있어서 브루트포스를 통해 찾아내야 합니다.
항목
clk_srcpll (Husky 온보드 PLL)
글리치 클럭24 MHz × 8 = 192 MHz (1 사이클 ≈ 5.21 ns)
trigger_srcext_single
outputenable_only
출력glitch_lp = True, glitch_hp = False
트리거nRST 상승엣지 (scope.trigger.triggers = "nrst")
ext_offset 스윕28,800 – 38,400 사이클 ≈ 150 – 200 µs
repeat(폭) 스윕30 사이클

2.6 트리거와 동기화 방식

글리치는 언제 발사하느냐가 거의 전부라, 트리거 소스를 무엇으로 잡느냐가 중요합니다. ChipWhisperer는 외부 GPIO, EXT 트리거 입력, nRST 같은 전용 핀 등을 트리거 소스로 받을 수 있습니다.
이 프로젝트에서는 nRST의 상승 엣지를 트리거로 잡았습니다(scope.trigger.triggers = "nrst"). 리셋을 걸어 둔 상태에서 scope.arm()으로 글리처를 무장시키고, 리셋을 풀면 그 상승엣지가 곧 부트롬 실행 시작점이자 트리거가 되는 구조입니다. 덕분에 매 시도가 항상 같은 기준점에서 출발하고, ext_offset이 곧 부팅 후 경과 시간이 됩니다.

3. PhyWhisperer

3.1 개요

e6333e5b-1771-4eab-9447-716889e72670.jpg
PhyWhisperer-USB(CW610) 는 USB PHY에 기반한 트리거 장비이자 기본적인 USB 스니퍼입니다. Xilinx Spartan 7S15 FPGA를 탑재했고, USB 2.0의 LS/FS/HS 트래픽을 다룰 수 있으며 Python API로 제어합니다. 오픈소스로 회로도·펌웨어·소프트웨어가 모두 공개되어 있습니다.

3.2 동작 방식

Phywhisperer는 USB 버스를 감시하다가 특정 데이터 패턴이 나타나는 순간 트리거를 발생시킬 수 있고, 이 트리거로 폴트 인젝션을 발사하거나 파워 트레이스 기록을 시작할 수 있습니다.
  • 프로그래머블 trigger offset delay & width: 트리거 후 지연과 폭을 설정해, ChipSHOUTER 같은 외부 글리처를 직접 구동
  • 내장 shunt: 전력 소모를 함께 모니터링
  • 디지털 데이터 핀 8개
즉, USB 상에서 이 요청이 지나가는 순간을 기점으로 글리치를 발사하는 정밀 트리거를 만들 수 있습니다.
또한 Phywhisperer는 타깃에 나가는 USB 전원을 직접 켜고 끌 수 있습니다(set_power_source). 글리칭은 부팅 직후의 좁은 창을 노리기 때문에 매 브루트 포스 시도마다 Trezor를 완전히 껐다 켜야 하고, 이 프로젝트에서는 글리치를 발사하는 것보다 이러한 전원 제어를 위해 Phywhisperer를 사용했습니다.

4. 회로 구성

52767e99-3536-4cbe-9bcb-54fd97e541b4.png
Chipwhisperer의 crowbar는 trezor one의 VCAP과 GND에 연결해 글리치를 주입합니다. 이때의 트리거는 trezor one의 nRST에 연결되어 nRST 핀의 상승 엣지를 감지해 ext_offset만큼 기다린 뒤 글리치를 주입하게 됩니다. Trezor의 전원은 Phywhisperer를 이용해서 켜고 끄며 브루트포스를 진행했습니다.

5. Conclusion

이번 글에서는 글리치를 만들고 타겟의 전원을 제어하는 Chipwhisperer와 Phywhisperer에 대해 간단히 소개했는데요, 사실 Chipwhisperer와 Phywhisperer를 제어하는 코드는 요즘 AI가 잘 짜주기 때문에 어떤 글리치 파라미터가 있고 각각의 파라미터가 어떤 역할을 하는지만 알고 있어도 충분한 것 같습니다. Chipwhisperer에서도 간단하게 오실로스코프처럼 전원을 관찰할 수 있는 기능이 있는데, 이번 프로젝트에서는 오실로스코프를 사용해서 안 써봤지만 다음에는 이 기능을 좀 더 써보면 좋을 것 같습니다.

Comments (0)

Loading comments...

Please log in to leave a comment.

Log In