1-click MMI execution in Android
안드로이드에서 한 번의 탭으로 MMI 명령 실행
안드로이드 앱의 CALL_PHONE 권한과 브라우저에서 열리는 다이얼러 딥링크를 조합하면, 사용자가 링크를 한 번 누르는 것만으로 USSD·MMI 명령을 실행할 수 있습니다. 연구자는 통화 착신 전환을 등록해 전화와 음성 인증 코드를 가로채는 과정을 실기기에서 확인했으며, Android 17에서는 서드파티 다이얼러 없이도 비슷한 경로가 생기는 별도 문제를 발견했습니다.
- 주제
AI 요약
CALL_PHONE 권한을 받은 앱은 일반 전화번호뿐 아니라 USSD와 MMI 코드도 실행합니다. 이 권한의 안내 문구는 “전화 걸기 및 관리”에 그치지만, 실제로는 이동통신사 계정의 설정을 바꾸는 명령까지 포함합니다. 사용자가 권한을 허용할 때 그 범위를 알기 어렵고, 명령 실행 전에 확인창도 뜨지 않습니다.
MMI·USSD 코드와 CALL_PHONE
MMI와 USSD는 다이얼러에 입력하는 숫자, 별표, 해시 조합입니다. *#06#처럼 기기 안에서 처리되는 코드도 있고, 이동통신사 망으로 전송되는 USSD도 있습니다. 통화 착신 전환 같은 부가 서비스 코드는 통신사에 등록됩니다. 예를 들어 **21*전화번호#는 해당 번호로 무조건 착신 전환을 설정합니다.
문제는 CALL_PHONE 권한이 이 명령을 실행하는 데도 쓰인다는 점입니다. 실행 전에 사용자가 거부할 절차가 없고, MMI 실행은 일반 통화 기록에도 남지 않습니다. 실행 중 잠시 나타나는 알림 외에는 사용자가 확인할 흔적이 거의 없습니다.
브라우저 링크에서 착신 전환까지
연구자는 통화·다이얼러·VoIP 앱 88개의 manifest를 조사했습니다. 66개가 CALL_PHONE 권한을 선언했고, 54개가 브라우저에서 접근 가능한 다이얼 경로를 노출했습니다. 다만 상당수는 번호를 다이얼러에 채우기만 하므로, 이 수치가 취약 앱의 수를 뜻하지는 않습니다. 실제 악용 여부는 딥링크가 입력값을 어떻게 처리하는지에 달렸습니다.
시연에는 설치 수가 500만 건을 넘는 ACR Phone / Cube ACR을 사용했습니다. 앱은 브라우저에서 열 수 있는 tel: 딥링크를 노출하며, 특정 경로에서 전달된 문자열을 확인 없이 자동 다이얼합니다. Chrome의 intent URI는 호출할 액션을 지정할 수 있습니다. 연구자는 android.intent.action.CALL_BUTTON을 지정해 ACR의 다이얼 경로를 실행했고, 앱이 가진 CALL_PHONE 권한으로 MMI 코드를 처리하게 했습니다. 이 시연에는 ACR이 기본 다이얼러 역할을 맡아야 한다는 조건도 있었습니다.
연구자는 먼저 *123# 잔액 조회를 실행해 경로가 MMI를 처리하는지 확인했습니다. 이어 **21*공격자가 통제하는 번호#를 링크에 넣어 착신 전환을 등록했습니다. 해시 문자는 링크에서 %23으로 인코딩해야 합니다. 실기기에서 한 번 탭하자 통신사 망이 등록 성공을 응답했고, 상태 표시줄에 착신 전환 표시가 나타났습니다. 다른 전화로 피해 기기에 전화했을 때 통화는 연구자의 번호로 연결됐고 피해 기기는 울리지 않았습니다. 착신 전환은 ##21#로 해제하고, *#21#로 상태를 확인합니다.
영향과 Android 17의 별도 문제
착신 전환 설정은 이동통신사 쪽에 저장됩니다. 따라서 다이얼러 앱을 삭제하거나 기기를 재부팅하고 초기화해도 설정이 취소되지 않습니다. 착신 전환이 유지되는 동안 공격자는 음성 일회용 비밀번호나 은행 인증 전화를 받을 수 있습니다. 통화 기록에는 MMI 실행이 남지 않으며, 사용자가 볼 수 있는 표시는 잠시 나타나는 대화상자와 상태 표시줄 아이콘뿐입니다.
연구자는 Android 17에서 별도의 플랫폼 문제도 발견했습니다. Telecom의 호출 처리를 넘기는 과정에서 원래 호출한 앱의 신원이 사라지고, 시스템 구성요소인 com.google.android.telecomui의 권한으로 발신자를 평가한다는 내용입니다. 그 결과 CALL_PHONE만 가진 앱이 ACTION_CALL로 MMI 문자열을 보내도 명령이 처리되는 현상을 에뮬레이터에서 확인했습니다. 실물 SIM이 없어 실제 통신사에 착신 전환이 등록되는지는 검증하지 못했습니다.
공개와 대응
Google은 CALL_PHONE·MMI 보고를 Android 자체 취약점이 아니라 서드파티 앱의 안전하지 않은 딥링크 처리 문제로 판단해 Won’t Fix (Infeasible)로 닫았습니다. 연구자는 권한 설명에 MMI 실행을 알리지 않고, 확인 절차도 없다는 점을 들어 플랫폼 차원의 수정이 필요하다고 주장합니다. 제안한 방안은 실행 전에 코드 내용을 보여주는 확인창을 띄우거나, 전화 발신 권한과 MMI 실행 권한을 분리하는 것입니다.
연구자는 ACR Phone 개발자에게 외부에서 접근 가능한 다이얼 경로가 MMI·USSD 문자열을 거부하도록 요청했습니다. 개발자는 다음 릴리스에 수정 사항을 반영하겠다고 답하고 검증용 베타를 제공했습니다. 이 경로는 앞서 보고된 CVE-2024-36064와도 다이얼 액티비티 입력값을 검증하지 않는다는 공통점이 있습니다. 이전 보고는 기기에 설치된 앱이 임의의 호출을 유발하는 문제였고, 이번 사례는 웹페이지에서 이동통신사 서비스 설정을 바꾸는 경로입니다.
Lobsters 반응
- @freddyb — 앱 개발자가 빠르게 반응하고 업데이트를 제공한 점은 좋습니다. 다만 Android에서도 더 많은 대응을 기대했습니다. 버그를 wontfix/infeasible로 닫은 건 다소 무성의해 보입니다. 생태계의 복잡한 절충점이 있다는 건 알지만, 별도의 MMI 권한을 만들고 일반 통화 권한에서 이 기능을 빼는 방안은 가능해 보입니다.
원문: karansaini.com / 번역·요약: Trawling