TP-Link 공유기 구매 후 커널 익스플로잇 작성하기
원제 Wanted to download an ISO, ended up writing a kernel exploit
158 포인트댓글 81

Key Point
자신의 공유기에서 발견한 하드웨어 버그를 해결하기 위해 커널 익스플로잇까지 작성해야 했던 이유와 제조사가 지원을 중단한 기기를 사용자가 직접 고칠 수 없도록 하는 구조적 문제를 드러낸다.
핵심 요약
- 2023년 8월 구매한 TP-Link EAP770 Wi-Fi 7 공유기가 대용량 파일 다운로드 시 데이터를 손상시키는 문제가 발생했으며, SSH 연결의 MAC 에러와 큰 파일의 rsync 전송 실패로 나타났다.
- 문제 재현을 위해 여러 프로토콜을 시도했고, WireGuard 터널 내에서만 작동한 후 나중에 HTTP/2와 TLS 레코드 에러로 재현되었으며, 패킷 분석 결과 1440바이트 TCP 세그먼트에 64바이트가 연속으로 손상되었다.
- 손상된 세그먼트는 유효한 TCP 체크섬을 가지고 있었으므로, 경로 어딘가에서 TCP 헤더가 재계산되었으며, 테스트 결과 여러 TCP 스트림이 동시 실행될 때 LAN-Wi-Fi 방향에서만 발생했다.
- 64바이트는 IPQ9574 코어의 캐시 라인 크기이고, CCMP MIC와 유선 연결의 완벽함을 고려하면 Qualcomm의 SFE/PPE 오프로드 엔진이 Ethernet-Wi-Fi 브리징 경로에서 손상을 일으키는 것으로 특정되었다.
- TP-Link은 2024년 6월 기기를 EOL 처리했으며 펌웨어 업데이트 지원을 중단했고, v1 펌웨어 이미지도 없었으며 사용자가 직접 패치할 수 없었다.
- /sys/sfe/l2_feature와 /sys/sfe/ppe_rfs_feature를 0으로 설정하면 오프로드를 비활성화할 수 있지만, TP-Link SSH 셸은 uid 1로 실행되어 쓰기 권한이 없었다.
- CVE-2022-0185 정수 언더플로우와 파이프 버퍼 조작을 이용한 커널 익스플로잇을 작성하여 unprivileged 사용자 네임스페이스에서 4 KiB slab 객체를 오버플로우시켰고, 임의 쓰기 권한을 확보했다.
- 익스플로잇은 modprobe_path를 덮어써서 root 권한으로 임의 명령을 실행했으며, Opus 5.5와 협력하여 약 17시간에 걸쳐 안정적인 형태로 개발했다.
- 근본 원인은 qca-nss-dp 드라이버가 버퍼 재사용 시 CPU 캐시를 동기화하지 않아, 이전 사용의 더티 캐시 라인이 새로운 DMA 패킷 데이터를 덮어쓰고, SFE/PPE가 손상된 페이로드에 대해 유효한 체크섬을 재계산하는 DMA 캐시 일관성 버그였다.
- 오프로드 비활성화 후 8192 MiB 테스트에서 나쁜 블록이 3개에서 0개로 감소했으며, 다운로드 속도는 약 8% 저하되었다.
- 설정은 부팅 후 초기화되므로, NAS의 watcher가 주기적으로 익스플로잇을 재실행하여 오프로드를 비활성화 상태로 유지하고, 실패 시 공유기를 리부팅한다.
- 부가적으로 Framework 16의 Qualcomm WCN785x 카드에서 Wi-Fi 7 사용 중 데이터 전송이 1~4분 간 멈추는 별도의 펌웨어 버그를 발견했으며, Wi-Fi 6으로 변경하여 관찰 중이다.
- OpenWrt는 이 버그를 포함하지 않으며, Qualcomm의 out-of-tree NSS 드라이버 코드가 공개되지 않았고, 커널의 다른 드라이버에서도 유사한 DMA 캐시 유지 문제를 발견했다.