심볼릭 링크 하나가 인증 검사 전체를 우회하는 뒷문이 됐다
심볼릭 링크 하나가 인증 검사 전체를 우회하는 뒷문이 됐다
분류: Bugbounty · IoT·임베디드 · 무인증 원격코드실행(RCE) [정보성]
덱. KAIST Hacking 연구팀(Kanghyuk Lee, Insu Yun)은 국내 공유기 제조사 ipTIME의 AX2004M 모델(펌웨어 14.19.0)에서, 관리 기능을 처리하는 CGI 바이너리의 인증 검사 로직이 URL 경로 하나로 완전히 우회된다는 것을 발견했습니다. 웹 서버 설정에 걸려 있던 심볼릭 링크 하나가 그 우회 경로를 열어줬고, 최종적으로는 로그인 없이 관리자 비밀번호를 재설정하고 원격 셸까지 얻을 수 있었습니다. 이 취약점은 KISA의 취약점 식별체계에 KVE-2023-0133으로 등재돼 있습니다.
리드
인증 검사는 대개 “이 요청이 어떤 경로로 들어왔는가”를 기준으로 판단됩니다. 문제는 그 판단 기준이 실제 파일시스템 경로가 아니라 URL 문자열의 접두사 같은 표면적인 특징에 의존할 때입니다. 웹 서버 설정에 같은 실행 파일을 가리키는 경로가 두 개 이상 존재하면(예: 심볼릭 링크), 인증 로직이 그중 하나만 검사 대상으로 삼고 다른 하나는 놓칠 수 있습니다. 이번 사례는 이 “같은 목적지, 다른 이름”이라는 흔한 웹 서버 설정 패턴이 어떻게 인증 우회로 직결되는지를 명확하게 보여줍니다.
핵심 사실 요약
- AX2004M의 관리 기능은
timepro.cgi라는 CGI 바이너리가 처리합니다. 이 바이너리의 코드는 요청 URL이 세션 URL(/sess-bin/으로 시작하는 경로)일 때만 인증 여부를 검사하고, 그렇지 않으면 별도 인증 절차 없이 곧바로 요청을 처리하도록 짜여 있었습니다. - 웹 서버 설정 파일(
boa_vh.80.conf)에는/sess-bin/경로가 실제 CGI 바이너리 폴더(/cgibin/)로 매핑돼 있었습니다. 정상적인 관리 페이지 접근은 이/sess-bin/경로를 거치므로 인증 검사를 통과해야 했습니다. - 그런데 연구자들은 실제 파일시스템(
/home/httpd/cgi/)에서timepro.cgi가/cgibin/timepro.cgi를 가리키는 심볼릭 링크로 별도 등록돼 있는 걸 발견했습니다. 이 경로는/sess-bin/이 아니라/cgi/였습니다. 즉http://{host}/cgi/timepro.cgi로 접근하면 정확히 같은 바이너리가 실행되지만, URL이/sess-bin/으로 시작하지 않으므로 바이너리 내부의 인증 검사 자체가 아예 실행되지 않았습니다. - 이 우회 경로를 통해 인증 없이도
timepro.cgi가 제공하는 관리 기능 전체를 호출할 수 있었습니다. 연구자들이 구성한 익스플로잇은 이를 두 단계로 활용했습니다: ①timepro.cgi의 비밀번호 재설정 기능을 인증 없이 호출해 관리자 계정 비밀번호를 공격자가 원하는 값으로 바꾸고, ② 기기의 “원격 지원(remote support)” 옵션을 활성화해 셸을 실행하는 기능을 호출했습니다. - 원격 지원 기능은 원문에서 “다른 글에서도 지적된 바 있는 사실상의 백도어처럼 동작한다”고 언급됩니다. 이 기능이 활성화되면 공격자는 셸을 얻어 기기에서 임의 명령을 실행할 수 있었고, 연구팀이 공개한 시연 영상에서는
id명령 결과로uid=0(root)가 확인됩니다. - 저장소는 이 취약점을 KISA에 이미 먼저 제보한 익명의 연구자가 있었다는 점을 크레딧에 함께 밝히고 있습니다. ⚠️미확인 — 정확한 신고·패치 배포 일자, 영향받는 정확한 펌웨어 버전 범위, 벤더 측 공식 보안 공지는 이 초안에서 1차출처(ipTIME 공식 공지·KISA 등재 정보)로 별도 확증하지 않았습니다.
짧은 논평
이 사례가 반복되는 클래스인 이유는 원인이 코드 로직 하나가 아니라 “코드”와 “서버 설정” 두 계층이 서로 다른 진실을 갖고 있었다는 데 있습니다. timepro.cgi의 인증 검사는 “URL이 /sess-bin/으로 시작하면 인증된 것으로 취급하지 않는다(즉, 인증 검사를 켠다)“는 가정 위에서 짜여 있었지만, 그 가정이 성립하려면 그 바이너리에 도달하는 URL 경로가 오직 /sess-bin/ 하나뿐이어야 합니다. 웹 서버 설정에 남아 있던 심볼릭 링크 하나가 이 전제를 깨버렸습니다. 저희가 다른 사례에서도 짚는 원칙과 같습니다 — 인증 검사를 URL 패턴으로 걸 때는, 그 바이너리·핸들러에 도달할 수 있는 경로가 정말 그 패턴 하나뿐인지를 서버 설정 전체에서 확인해야 한다는 것입니다. IoT 기기처럼 오래된 CGI 기반 웹 서버 구조를 그대로 쓰는 임베디드 제품군에서는 이런 “설정에 남은 여분의 경로”가 특히 흔한 공격 표면이 됩니다.
References / 참고자료
- Kanghyuk Lee, Insu Yun (KAIST Hacking), “ipTIME AX2004M pre-auth remote code execution (KVE-2023-0133)” — 이 글이 재구성한 원 분석. 인증 우회 경로 발견부터 비밀번호 재설정·원격 지원 기능을 이용한 셸 획득까지 전 과정을 다룸. https://github.com/kaist-hacking/KVE-2023-0133
이 글은 위 원 분석을 우리 관점에서 다시 쓰고 짧은 논평을 더한 정보성 초안입니다. 특정 문장·코드·스크린샷을 그대로 옮기지 않았으며, 작동하는 재현 절차는 싣지 않았습니다. ⚠️미확인 표시 항목은 발행 전 독립 팩트체크에서 확증·정정되어야 합니다.