TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 29 READS

서명을 검증하지 않은 토큰 하나, 17조 행에 닿다

서명을 검증하지 않은 토큰 하나, 17조 행에 닿다
SOURCE IMAGE · HACKER NEWS

마이크로소프트 내부 분석 서비스에서 발견된 인증 취약점 하나가 이론상 17조 3천억 행 규모의 데이터에 접근할 수 있는 통로를 열어두고 있었다. 원인은 놀랄 만큼 단순했다. 로그인 토큰(JWT)의 서명을 아예 검증하지 않았던 것이다. 이 결함을 찾아낸 사람은 열여섯 살 보안 연구자 Faav로, 그는 취약점을 실제 고객 데이터나 개인정보를 건드리지 않고 마이크로소프트 버그 바운티 프로그램을 통해 신고했다. 참고로 이 글의 원문은 마이크로소프트가 사전 검토 권한을 갖고 일부 내용과 수치, 영향 서술을 조정한 뒤 공개됐다는 점을 연구자 스스로 밝히고 있다.

잠긴 앞문 대신 옆문

문제의 서비스는 'Titan'이라는 내부 분석 도구였다. 웹 프론트엔드는 사내 직원용 VPN 뒤에 숨어 있어 외부에서 접근할 수 없었지만, API는 별도의 Azure 클라우드 호스트에 노출돼 있었고 공개된 Swagger 문서가 네 개의 경로를 드러냈다. 그중 세 개는 Azure AD 베어러 인증을 요구했으나, 원시 SQL을 받아들이는 /v2/Query만 예외였다. 연구자는 여기서부터 파고들었다. 필요한 tableName 값은 Wayback Machine에 남아 있던 2023년 스냅샷에서 Superset 설정을 복원해 56개의 테이블 정의를 얻어냈다.

인증 우회 과정은 열흘에 걸쳐 진행됐다. 연구자가 개발한 AI 해킹 봇 Antares는 외부 테스트 테넌트의 토큰으로 시작해 테넌트 오류, 오디언스 오류, 애플리케이션 허용 목록 오류를 하나씩 통과시켰다. 이 과정에서 결정적 단서가 드러났다. 토큰의 페이로드(claim)를 계속 바꿔도 Titan이 새 값을 받아들였다는 점이다. 서명은 그대로 둔 채 내용만 고쳐도 통과됐다는 것은, 신분증의 이름만 확인하고 사진은 보지 않는 경비원과 같았다. 연구자는 곧장 서명이 빈 채로 끝나는 합성 JWT를 만들어 던졌고, Titan은 그것을 그대로 받아들였다.

정답은 그냥 'admin'이었다

마지막 관문은 upn 클레임에 어떤 값을 넣느냐였다. AI는 upn이 통상 이메일 형식의 Entra 신원이라는 전제 때문에 각종 이메일형 값만 반복해서 시도했고 끝내 유효한 사용자를 찾지 못했다. 돌파구는 사람의 직관에서 나왔다. 새벽 1시에 다시 붙잡은 연구자는 '백엔드가 이 값을 로컬 사용자명으로 쓰는 것은 아닐까'라고 생각을 바꿔 upn에 단순히 admin을 넣었다. 그러자 Titan은 이를 로컬 사용자 ID 1, 즉 Admin 역할로 해석했고 SQL이 실행됐다. 가장 뻔한 값이었기에 오히려 AI가 끝내 시도하지 못한 답이었다.

관리자 권한으로 SQL을 실행하게 되자 범위는 빠르게 확장됐다. SHOW DATABASES는 테스트 DB 너머의 플랫폼 메타데이터 데이터베이스를 드러냈고, 그 안에는 이름·이메일·로그인 이력을 담은 활성 사용자 계정 테이블, 그리고 Titan과 연관된 일부 직원의 직함·부서·조직 계층 정보가 있었다. 별도의 Bing 분석 소스도 닿을 수 있었는데, 연구자는 최신 파티션에서 단 두 건의 1행 샘플만 조회해 검색·식별자·국가/주 단위 위치 필드가 노출된다는 사실만 확인하고 멈췄다. 여러 데이터셋에 공통으로 등장하는 MUID 때문에 서비스 간 활동 상관관계 분석도 이론상 가능했지만 실제로 시도하지는 않았다.

전체 규모는 마지막에 계산됐다. 56개 라우팅 값 중 30개가 살아 있었고, 이는 24개 구성을 거쳐 17개 분석 데이터베이스와 9,863개의 고유 테이블로 이어졌다. 연구자는 ClickHouse 메타데이터에서 system.tables.total_rows와 system.parts 두 경로로 총량을 교차 검증했고, 두 값 모두 17조 3천억여 행이라는 동일한 숫자를 반환했다. 다만 이 수치는 이력·중복·파생 데이터를 포함한 저장 추정치라는 단서가 붙는다.

한국 실무자가 새길 두 가지

이 사례가 주는 교훈은 명확하다. 첫째, 인증에서 서명 검증은 타협 대상이 아니다. Titan은 테넌트·오디언스·앱 ID·사용자까지 모든 접근 제어 로직을 갖추고도 정작 가장 중요한 서명 확인 한 단계를 빼먹어 나머지를 무력화했다. 모든 방문에 키카드 리더기가 달려 있지만 아무 카드로나 모든 방이 열리는 호텔인 셈이다. JWT alg:none이나 빈 서명 우회는 오래된 패턴이지만 여전히 실제 서비스에서 재현된다는 점에서, 라이브러리 기본값에 의존하지 말고 서명 검증이 실제로 작동하는지 직접 테스트할 필요가 있다. 또한 upn 같은 사용자 제어 가능 클레임을 내부 권한 조회 키로 그대로 쓰는 설계가 얼마나 위험한지도 보여준다.

둘째, AI와 사람의 직관이 서로를 보완했다는 점이다. Antares는 서브도메인 열거, JWT 오류 한 단계씩 돌파, 공격면 매핑 같은 열흘치 노동을 대신했지만 'upn이 실은 UPN이 아니다'라는 발상 전환은 해내지 못했다. 반대로 사람 혼자서는 그 방대한 사전 작업을 감당하기 어려웠을 것이다. 자동화 도구를 도입한 팀이라면 공격자 역시 같은 방식으로 지치지 않고 문서·아카이브·오류 메시지를 긁어모은다는 전제로, 노출된 Swagger와 과거 설정 스냅샷 같은 부주의한 정보 흔적부터 점검하는 것이 현실적인 출발점이 된다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://blog.faav.net/how-i-couldve-accessed-17-trillion-mic...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...