Tailscale SSH 루트 권한 탈취 취약점 발견
Tailscale에서 SSH 인자 처리 미흡으로 인해 ACL 정책을 우회하여 루트 권한을 탈취할 수 있는 취약점이 발견되었습니다. 또한 Tailscale Serve/Funnel에서 비정상 HTTP 요청으로 CPU를 100% 점유하는 서비스 거부(DoS) 공격도 가능했습니다. 해당 문제는 버전 1.98.9에서 모두 수정되었으므로 즉시 업데이트가 필요합니다.
설명: Tailscale SSH의 안전하지 않은 명령줄 인자 처리 방식으로 인해 ACL(접근 제어 목록)을 우회하여 루트 사용자 접근이 허용되는 취약점이 발견되었습니다.
무슨 일이 있었나요? 과거 Tailscale SSH는 맨 앞에 '-'(대시) 문자가 포함된 사용자 이름을 허용했습니다. Linux 플랫폼에서는 이러한 사용자 이름이 해당 passwd 항목을 검색하기 위해 getent(1) 명령어의 인자로 전달되었는데, 이때 공격자가 제어할 수 있는 플래그로 해석되는 문제가 있었습니다. 구체적으로, 사용자가 '-i'라는 사용자 이름으로 연결하면 이는 '--no-idn' 플래그로 해석되어 getent가 root 사용자부터 시작하여 전체 passwd 파일 내용을 출력하게 되고, 결국 Tailscale이 root 권한의 대화형 세션을 열게 됩니다. 현재 Tailscale SSH는 맨 앞에 대시가 있는 사용자 이름을 거부하도록 수정되었습니다. 이 취약점은 Tailscale 버전 1.98.9 이상에서 수정되었습니다.
어떤 영향이 있나요? Linux 노드에 대한 SSH 접근 권한이 있는 사용자가 '-i'라는 사용자 이름으로 연결하여 ACL 정책을 위반하고 root 세션을 획득할 수 있었습니다.
영향을 받는 대상은 누구인가요? Tailscale ACL의 autogroup:nonroot 사용자 제한에 의존하는 Linux 호스트에서 Tailscale SSH를 사용하는 사용자.
어떻게 조치해야 하나요? Tailscale SSH를 사용 중이라면 Tailscale 버전 1.98.9 이상으로 업그레이드하세요.
크레딧: 이 문제를 보고해 주신 Anthropic과 Ada Logics에 감사드립니다.
설명: Tailscale Serve 또는 Funnel을 실행하는 노드에 대한 단일 비정상 HTTP 요청이 하나의 CPU 코어를 무한정 점유하여 서비스 거부(DoS)를 유발할 수 있었습니다.
무슨 일이 있었나요? Tailscale Serve와 Tailscale Funnel은 요청 경로를 구성된 마운트 지점과 대조하여 들어오는 HTTP 요청을 로컬 백엔드로 프록시합니다. 요청에 대한 핸들러를 처리할 때, Tailscale은 요청 경로를 루트 경로(/)에서 종료될 것이라 예상하고 디렉터리 단위로 상향식으로 탐색했습니다. 그러나 경로가 '/'로 시작하지 않는 요청의 경우, 이 탐색은 루트 경로에 도달하지 못했고 마운트 지점과 일치하지 않아 루프가 무한히 반복되었습니다. 서버가 요청 시간 제한을 두지 않았기 때문에 이 무한 루프를 중단하는 것이 없었으며, 고루틴(goroutine)이 프로세스가 종료될 때까지 하나의 코어를 100%로 점유했습니다. 이제 Tailscale은 절대 경로가 아닌 경로에 대한 탐색을 종료하고, 핸들러를 반환하지 않으며 요청을 닫도록 수정되었습니다. 이 취약점은 Tailscale 버전 1.98.9 이상에서 수정되었습니다.
어떤 영향이 있나요? 공격자는 조작된 HTTP 요청을 전송하여 대상 노드의 CPU 코어 하나를 영구적으로 소모하게 만들 수 있었습니다. Tailscale Serve의 경우 해당 노드에 접근 권한이 있는 tailnet의 모든 피어에서 요청이 시작될 수 있었습니다. Tailscale Funnel의 경우 인터넷상의 인증되지 않은 모든 호스트에서 요청이 시작될 수 있었습니다.
영향을 받는 대상은 누구인가요? 1.98.9 이전 버전에서 Tailscale Serve 또는 Tailscale Funnel을 실행 중인 노드.
어떻게 조치해야 하나요? Tailscale Serve 또는 Tailscale Funnel을 실행 중이라면 Tailscale 버전 1.98.9 이상으로 업그레이드하세요.
크레딧: 이 문제를 보고해 주신 Anthropic과 Ada Logics에 감사드립니다.