Mir0Auth는 피해자가 정상적인 Microsoft 로그인 절차를 밟는 동안 OAuth 기기 코드(device code) 흐름을 악용해 인증 토큰을 탈취하는 피싱 공격이다. ANY.RUN의 공개 분석과 Guardz의 관측·해석을 바탕으로, 방어자는 단일 로그인 알림보다 세션의 후속 사용과 네트워크 변화를 함께 살펴야 한다.

공격자는 업무 관련 이메일에 PDF를 첨부하고, 이를 통해 DocuSign처럼 꾸민 페이지로 피해자를 유도한다. 페이지 스크립트는 /task_queue.cs에 신호를 보내고 /context.go에서 새 기기 코드를 받아 피해자의 클립보드에 복사한 뒤, 정식 microsoft.com/devicelogin 페이지를 팝업으로 연다. 사용자가 정상적으로 인증하는 동안 페이지는 3초마다 /window.rs를 확인한다. 인증이 완료되면 공격자 측은 액세스 토큰과 갱신 토큰을 확보한다.

.cs, .go, .rs로 끝나는 경로는 소스 파일처럼 보이게 한다. Guardz는 application/octet-stream 형식의 POST 요청이 이런 경로로 3초마다 반복되는 양상이 위협 헌터의 주의를 끌 수 있다고 분석했다. 다만 경로 이름을 정한 공격자의 의도에 관한 해석은 원래 보고서에 명시되지 않았다고 덧붙였다.

초기 단계에서는 피해자가 정상 로그인 페이지에서 인증하므로 프록시 랜딩 페이지나 탈취된 비밀번호, 단순한 비정상 이동 알림이 남지 않을 수 있다. Guardz의 분석에 따르면 처음 세 단계에서는 ID 알림이 발생하지 않고, 네 번째 단계도 정상적인 성공 로그인으로 기록될 수 있다. 이후 토큰 재사용이 다른 IP와 네트워크에서 나타날 때 초기 로그인과 연결해야 침입을 포착할 수 있다. Guardz는 이 차이가 정상 로그인으로 사건을 종결하는 것과 며칠 뒤 금융팀이 BEC를 발견하는 상황을 가를 수 있다고 설명한다.

ANY.RUN은 피싱 키트의 C2 통신에서 반복 키 XOR 인코딩과 고정된 ASCII 키를 확인했다. URL 경로에는 Miro_xxxx, 요청 본문에는 M1r0Auth_xxxxxxxxx를 사용한다. 키는 페이지 측 자바스크립트가 트래픽을 직접 해독해야 하므로 샌드박스 캡처에서 추출할 수 있지만, 공격자가 키를 바꾸면 IOC로서의 유효성은 떨어질 수 있다. 따라서 Guardz는 키보다 기만적인 경로 이름, 3초 간격의 폴링, 반복되는 바이너리 POST 패턴을 탐지 기준으로 삼으라고 권고한다.

관측과 대응

Guardz는 자사 ITDR에서 의심스러운 로그인, 의심스러운 기기 코드 로그인, 기기 코드 흐름을 통한 OAuth 토큰 탈취 가능성을 함께 묶어 고위험 사건으로 탐지했다고 밝혔다. 다만 이 사례의 텔레메트리가 Mir0Auth 키트를 직접 특정한 것은 아니다. Guardz는 이를 기기 코드 공격 패턴의 사례로 제시했다.

해당 사례에서는 초기 인증 뒤 세션이 다른 네트워크의 RouterHosting IP에서 다시 사용됐다. 초기 로그인은 Microsoft Azure 주소에서 발생했고, 유효한 비밀번호와 MFA 인증이 기록됐다. 85초 안에 세션이 비정상 IP로 이동했으며, 두 번째 로그인 8초 뒤 계정에 불량 기기가 등록됐다. 공격자가 세션을 시작한 뒤 지속성을 확보하기까지 총 93초가 걸렸다. Guardz는 세션 ID를 따라 초기 로그인과 후속 네트워크 이동을 연결하고, 계정의 과거 접속 기준선이 공격자 활동으로 오염되지 않았는지 살피며, 대응 절차에 불량 기기 제거를 포함하라고 제안했다.

Guardz는 90일 동안 계정 로그인 중 99.94%가 단일 Tencent 데이터센터에서 발생했고, 자동화된 Python 토큰 갱신이 이를 만들었다고 설명했다. 계정이 10월 4일 관리자에 의해 초기화된 뒤 공격자는 새 세션을 시작해 RouterHosting IP에서 재사용했다. 이처럼 공격자의 활동이 과거 기준선을 차지하면 평소와 다른 행동을 탐지하는 모델이 이를 정상으로 취급할 수 있다. Guardz는 기본적인 ‘최초 확인 IP’ 규칙이 측면 이동을 포착했지만, 69일간 이어진 토큰 갱신은 오염된 기준선에서 정상으로 보였다고 밝혔다.

Guardz가 제시한 최종 대응은 기기 코드 흐름을 차단하는 조건부 액세스 정책이다. 즉시 차단하기 어려운 환경에서는 행동 상관분석을 보완책으로 삼고, 기기 코드 흐름은 꼭 필요한 계정에만 허용하라고 권고한다. 탐지에는 엔드포인트 텔레메트리(EDR), 브라우저 보안 텔레메트리, ID 위협 탐지 및 대응(ITDR)을 함께 활용해야 한다고 설명했다.

지표와 불확실성

지표유형지속성 전망
Miro_xxxxC2 URL용 XOR 키낮음, 교체 예상
M1r0Auth_xxxxxxxxxC2 본문용 XOR 키낮음, 교체 예상
/task_queue.cs신호 전송 경로중간
/context.go기기 코드 발급 경로중간
/window.rs3초 간격 세션 확인 경로중간
소스 파일 확장자 경로로 보내는 application/octet-stream POST프로토콜 패턴높음
기기 코드 로그인 뒤 60분 이내 다른 ASN에서 토큰 사용행동 패턴높음
PDF 미끼행동 패턴높음

공격을 시작하는 클라이언트 식별자는 아직 공개 분석에서 확인되지 않았다. 디코딩한 /context.go 응답이나 코드 입력 과정에서 Microsoft가 표시하는 애플리케이션 이름에 나타날 가능성이 있지만, 이는 확인된 사실이 아니다. 따라서 특정 앱 ID 차단이 가능한지, 행동 상관분석에 의존해야 하는지는 추가 정보가 필요하다. 로그 분석 지침도 Mir0Auth에서 확인된 절차라기보다 일반적인 기기 코드 공격 패턴을 바탕으로 한 가설로 봐야 한다.

Mir0Auth는 EvilTokens, Kali365, Wazza와 함께 최근 등장한 기기 코드 피싱 키트 중 하나다. 이 공격들은 Microsoft 구현의 결함을 이용하는 것이 아니라 의도된 기능을 악용한다. 따라서 특정 키트의 지표만 쫓기보다 기기 코드 흐름을 제한하고, 로그인 이후 세션과 토큰의 행동을 상관분석하는 것이 지속 가능한 방어책이라는 것이 Guardz의 결론이다.

참고 자료: ANY.RUN의 Mir0Auth 분석, Guardz 보안 연구 저장소