Jul 1, 2026BY YunjeShin
Cellular SecurityCellular5Ghardwarepublic

Part 1 Building a 5G SA Fuzzing Lab on macOS USRP B210 Setup and USIM Key Extraction

들어가기에 앞서….

여러 시행착오가 있다. 항상 말하지만 하드웨어 해킹 제품은 정품을 그리고 intel위주로 하길 본 필자는 추천한다.

본 연구의 모든 실험은 격리된 차폐 랩에서 수행되었습니다. c6274e78-f2e8-49a8-881b-502c0f2bcdaf.jpeg 48cd5ceb-e0cc-41f1-8242-a2711ebf7b11.jpeg

Part 1. Mac 네이티브 환경 준비 (사전 검증 및 키 추출)

A. USRP B210 햄긱버전 설치

be5950d0-5edc-46ec-8fc4-1e99b544a7c1.png 저렴한 USB 허브에서는 대역폭 부족으로 인해 데이터 전송 오류가 반복적으로 발생하였다. 따라서 USB 3.x를 안정적으로 지원하는 허브 사용을 권장한다. 본 필자는 벨킨 제품을 사용하였습니다.

1. 환경 정보

  • Host OS: macOS (Apple Silicon M4 Pro)
  • Hardware: HamGeek B210 Pro (USRP B210 Clone)
  • Connection: USB 3.0 포트를 통한 직접 연결

2. 필수 소프트웨어 설치 (Homebrew)

Mac의 패키지 관리자인 Homebrew를 사용하여 UHD(USRP Hardware Driver)와 GNU Radio를 설치합니다. 터미널을 열고 아래 명령어를 순서대로 실행합니다.
# 1. Homebrew 패키지 매니저 업데이트
brew update

# 2. UHD (USRP Hardware Driver) 설치
brew install uhd

# 3. GNU Radio 설치 (SDR 시각화 및 블록 코딩 도구)
brew install gnuradio

💡 [오류 해결] GNU Radio 설치 중 링크 충돌(rpds-py 등) 에러가 발생할 경우 파이썬 패키지 충돌로 인해 Target /opt/homebrew/lib/python... already exists 에러가 나면서 설치가 중단될 수 있습니다. 이때는 아래 명령어로 기존 파일을 강제로 덮어쓰기(overwrite) 한 후 다시 설치합니다.
brew link --overwrite rpds-py
brew install gnuradio

3. FPGA / Firmware 이미지 다운로드

B210 하드웨어는 자체 펌웨어가 없기 때문에, USB로 연결될 때마다 Mac에서 기기로 펌웨어 이미지를 넣어주어야 합니다. 이 펌웨어를 다운로드하지 않으면 "No UHD Devices Found" 에러가 발생합니다.
# Ettus 서버로부터 기기별 펌웨어(약 50MB) 다운로드
sudo uhd_images_downloader

# 만약 위 명령어가 'command not found' 로 안 먹힐 경우 파이썬 스크립트 직접 실행:
sudo python3 /opt/homebrew/Cellar/uhd/4.9.0.1_2/lib/uhd/utils/uhd_images_downloader.py

7e35ae4c-facb-4fa5-b544-c2f5f57580df.png

4. 기기 인식 및 연결 테스트

다운로드가 완료되면 HamGeek B210 기기를 USB에 연결하고 터미널에서 다음 명령어를 실행하여 인식을 확인합니다.
[INFO] [UHD] Mac OS; Clang version 21.0.0; Boost_109000; UHD_4.9.0.1
[INFO] [B200] Loading firmware image: /opt/homebrew/Cellar/uhd/4.9.0.1_2/share/uhd/images/usrp_b200_fw.hex...
--------------------------------------------------
-- UHD Device 0
--------------------------------------------------
Device Address:
    serial: 193959
    name: MyB210
    product: B210
    type: b200

5. 추가 디버깅 명령어

기기의 세부 스펙(안테나 포트, 지원 주파수 대역, 샘플 레이트 등)을 확인하고 싶을 때 사용합니다.
uhd_usrp_probe
[INFO] [UHD] Mac OS; Clang version 21.0.0 (clang-2100.0.123.102); Boost_109000; UHD_4.9.0.1
[INFO] [B200] Detected Device: B210
[INFO] [B200] Operating over USB 3.
[INFO] [B200] Initialize CODEC control...
[INFO] [B200] Initialize Radio control...
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Performing register loopback test...
[INFO] [B200] Register loopback test passed
[INFO] [B200] Setting master clock rate selection to 'automatic'.
[INFO] [B200] Asking for clock rate 16.000000 MHz...
[INFO] [B200] Actually got clock rate 16.000000 MHz.
  _____________________________________________________
 /
|       Device: B-Series Device
|     _____________________________________________________
|    /
|   |       Mboard: B210
|   |   revision: 4
|   |   product: 2
|   |   name: MyB210
|   |   serial: 193959
|   |   FW Version: 8.0
|   |   FPGA Version: 16.0
|   |
|   |   Time sources:  none, internal, external, gpsdo
|   |   Clock sources: internal, external, gpsdo
|   |   Sensors: ref_locked
|   |     _____________________________________________________
|   |    /
|   |   |       RX DSP: 0
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       RX DSP: 1
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       RX Dboard: A
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       RX Frontend: A
|   |   |   |   Name: FE-RX2
|   |   |   |   Antennas: TX/RX, RX2
|   |   |   |   Sensors: temp, rssi, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       RX Frontend: B
|   |   |   |   Name: FE-RX1
|   |   |   |   Antennas: TX/RX, RX2
|   |   |   |   Sensors: temp, rssi, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 76.0 step 1.0 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       RX Codec: A
|   |   |   |   Name: B210 RX dual ADC
|   |   |   |   Gain Elements: None
|   |     _____________________________________________________
|   |    /
|   |   |       TX DSP: 0
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       TX DSP: 1
|   |   |
|   |   |   Freq range: -8.000 to 8.000 MHz
|   |     _____________________________________________________
|   |    /
|   |   |       TX Dboard: A
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       TX Frontend: A
|   |   |   |   Name: FE-TX2
|   |   |   |   Antennas: TX/RX
|   |   |   |   Sensors: temp, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       TX Frontend: B
|   |   |   |   Name: FE-TX1
|   |   |   |   Antennas: TX/RX
|   |   |   |   Sensors: temp, lo_locked
|   |   |   |   Freq range: 50.000 to 6000.000 MHz
|   |   |   |   Gain range PGA: 0.0 to 89.8 step 0.2 dB
|   |   |   |   Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz
|   |   |   |   Connection Type: IQ
|   |   |   |   Uses LO offset: No
|   |   |     _____________________________________________________
|   |   |    /
|   |   |   |       TX Codec: A
|   |   |   |   Name: B210 TX dual DAC
|   |   |   |   Gain Elements: None

B. PySim

1 . 준비물

0eeb114f-67d7-410c-861a-a15ee777619e.png
339ceb35-25f1-4d85-9b1a-a7028fc1c36c.png
  1. 프로그래머블 USIM: sysmocom sysmoISIM-SJA5-S17 등 5G SA 지원 USIM
  2. 스마트카드 리더기: USB로 연결되는 카드 리더기 (예: Generic USB2.0-CRWACR39U 등)
  3. Mac OS 컴퓨터 (터미널 사용)

2. 필수 소프트웨어 설치

Mac의 터미널(Terminal)을 열고 아래 명령어들을 한 줄씩 복사해서 실행합니다.

Step 1. Homebrew 설치 (이미 있다면 패스)

Mac 패키지 관리자인 Homebrew를 설치합니다.
/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Step 2. PC/SC 스마트카드 도구 설치

Mac 자체적으로 스마트카드를 지원하지만, 안정성을 위해 관련 라이브러리를 설치합니다.
brew install pcsc-lite
1f102246-e4b7-447e-8c34-8bcce046f39d.png

Step 3. pySim 전용 파이썬 가상환경 만들기

시스템 파이썬을 건드리지 않기 위해 pysim이라는 가상공간을 만듭니다. (Python 버전에 따라 python3로 대체 가능합니다.)
# 가상환경 생성 (pysim 폴더가 생깁니다)
python3 -m venv ~/venvs/pysim --system-site-packages

# 2. 가상환경 활성화 (진입) - 터미널 켤 때마다 pySim을 쓰려면 이 명령어를 쳐야 합니다.
source ~/venvs/pysim/bin/activate

pip install --upgrade pip setuptools wheel
pip install pyscard
pip install git+https://gitea.osmocom.org/sim-card/pysim.git
d7a1d19a-ec4e-49c7-becb-d076ba3a3e32.png

Step 4. pySim 및 통신 라이브러리 설치

USIM을 제어하는 핵심 오픈소스 프로그램인 pySim을 설치합니다.
# 스마트카드 통신 라이브러리 설치
~/venvs/pysim/bin/pip install pyscard

# pySim 최신 버전 다운로드 및 설치
~/venvs/pysim/bin/pip install git+https://gitea.osmocom.org/sim-card/pysim.git

3. 연결 방법(Important)

Step 1. macOS 내장 드라이버 버그 우회 (IFDCCID 사용)

Apple의 기본 스마트카드 드라이버가 오작동하는 것을 막기 위해, 오픈소스 드라이버를 쓰도록 Mac 설정을 변경합니다. (실행 시 Mac 비밀번호 필요)
sudo defaults write /Library/Preferences/com.apple.security.smartcard useIFDCCID -bool yes

Step 2. pySim 통신 방식(T=0) 강제 고정 패치

프로토콜 자동 협상 기능이 꼬이는 것을 막기 위해, 파이썬 코드를 뜯어고쳐 T=0 방식만 쓰도록 강제합니다. 아래와 같이 pcsc.py를 수정한다.
스마트카드 통신에는 크게 T=0(바이트 단위 구형 통신)과 T=1(블록 단위 신형 통신) 두 가지 프로토콜이 있습니다. SysmoISIM과 사용 중인 Realtek 리더기는 둘 다 지원합니다.
아래 issues에서 볼 수 있듯이 T0 프로토콜을 수동으로 강제해서 사용하면 자동 협상 기능이 꼬이지 않기에 T=0를 쓰도록 강제합니다. (카드가 T=0과 T=1을 보통 모두 지원하는데, 자동 프로토콜 협상이 정상적으로 동작하지 않는 경우가 있어 T=0을 강제로 선택하였다.)
--- pySim/transport/pcsc.py (원본)
+++ pySim/transport/pcsc.py (수정본)
@@ -90,12 +90,12 @@
             #  1) In case a card supports T=0 and T=1, we prefer to use T=0.
             #  2) The automatic protocol selection may be unreliabe on some platforms
             #     see also: https://osmocom.org/issues/6952)
-            self._con.connect()
+            self._con.connect(CardConnection.T0_protocol)
             atr = ATR(self._con.getATR())
-            if atr.isT0Supported():
-                self._con.setProtocol(CardConnection.T0_protocol)
-                self.set_tpdu_format(0)
-            elif atr.isT1Supported():
+            if atr.isT1Supported():
                 self._con.setProtocol(CardConnection.T1_protocol)
                 self.set_tpdu_format(1)
+            elif atr.isT0Supported():
+                self._con.setProtocol(CardConnection.T0_protocol)
+                self.set_tpdu_format(0)

Step 3. USIM 인식 테스트

리더기에 USIM을 꽂은 상태로 USB를 Mac에 연결합니다. 반드시 가상환경((pysim))이 켜진 상태에서 실행
pySim-read.py -p 0
b0820b76-2911-4253-9c88-f78232197111.png
Autodetected card type: sysmoISIM-SJA5
ICCID: 89xxxxxxxxxxxxxxxxx
IMSI: 99xxxxxxxxxxxxxxxxxxxxx

...
...
...
	Service 1 - P-CSCF address
	Service 4 - GBA-based Local Key Establishment Mechanism
	Service 5 - Support of P-CSCF discovery for IMS Local Break Out
	Service 10 - Support of UICC access to IMS
	Service 20 - WebRTC URI

Done !
위 사진과 같이 뜨면 완벽하게 정상입니다.

USIM 카드 정보확인

Sysmocom 마스터 키 시트 매칭

USIM 보안상 리더기로는 Ki, OPc를 읽을 수 없습니다. Sysmocom 이메일로 구입시 받은 받은 CSV의 IMSI와 대조하여 3가지 핵심 키 값을 메모합니다.
IMSIKi (Security Key)OPc (Operator Code)
99xxxxxxxxxxxxxxxxxxxxx<REDACTED_KI><REDACTED_OPC>
여기까지 완료했다면 SDR과 USIM 모두 정상적으로 동작하는 상태이다. 이제 확보한 IMSI, Ki, OPc 값을 이용하여 Part 2에서 Open5GS 및 srsRAN 기반 5G SA 환경을 구축한다.

REFERENCES

[1] Open5GS, "Open5GS: Open Source implementation for 5G Core (5GC) and EPC," https://open5gs.org/, 2024.
[2] Software Radio Systems, "srsRAN Project: O-RAN compliant 5G CU/DU/RAN," https://www.srsran.com/, 2024.
[3] Ettus Research (NI), "USRP Hardware Driver (UHD) and USRP B210 Documentation," https://www.ettus.com/, 2024.
[4] sysmocom s.f.m.c. GmbH, "sysmoISIM-SJA5 Programmable SIM/USIM/ISIM Card User Manual," 2023.
[5] Osmocom, "pySim: Tools related to SIM/USIM/ISIM cards, "https://gitea.osmocom.org/sim-card/pysim, 2024.
[7] 3GPP, "TS 23.501: System architecture for the 5G System (5GS)," V17.15.0, Release 17, 2023.
[8] 3GPP, "TS 23.502: Procedures for the 5G System (5GS)," V17.15.0, Release 17, 2023.
[9] 3GPP, "TS 33.501: Security architecture and procedures for the 5G System," V17.15.0, Release 17, 2023.
[10] 3GPP, "TS 38.331: NR; Radio Resource Control (RRC) protocol specification," V17.6.0, Release 17, 2023.
[11] 3GPP, "TS 24.501: Non-Access-Stratum (NAS) protocol for 5GS; Stage 3," V17.12.0, Release 17, 2023.

Comments (0)

Loading comments...

Please log in to leave a comment.

Log In