티몬 앱의 플레이 스토어 리뷰에 반복해 올라오던 "앱이 저절로 실행된다"는 이슈를 모바일 개발 유닛이 추적한 기록이다. 2018년 4월에 시작해 앱 내부 코드, 외부 SDK, 실행 주체 로그, 재현 테스트, 시스템 로그를 차례로 파고들어 원인을 특정했다. 해결책보다 원인을 좁혀가는 과정 자체에 무게를 둔 글이다.
핵심 포인트- 원인은 티몬 앱이 아니라 다른 앱에 들어 있던 광고 SDK가 미리 클릭된 광고의 딥 링크를 재전송해 앱을 강제 실행시킨 것이었다.
- 그 SDK는 SCREEN_OFF, SCREEN_ON, USER_PRESENT, PACKAGE_ADDED, 네트워크 상태 변경 등 광고 수집과 무관한 브로드캐스트를 다수 수신하고 있었다.
- 롤리팝 이상에서 제공되는 getReferrer()로 어떤 패키지가 딥 링크를 넘겼는지 로그를 남겨 실행 주체를 특정했다.
- 자고 일어나면 실행돼 있다, 충전 중에 다른 앱이 떠 있다, 갑자기 특정 화면으로 이동한다는 리뷰 패턴이 그 브로드캐스트 목록과 맞아떨어졌다.
- 문의 결과 해당 앱들은 부정행위로 의심돼 광고 플랫폼에서 블록 처리됐다.
상세 정리- 시작: 유저 리뷰에 자동 실행 보고가 올라오기 시작했는데 내용이 정확하지 않아 광고 오클릭인지 푸시 오클릭인지조차 판단이 어려웠다.
- 조사 방향: 앱을 독립적으로 실행시킬 만한 코드가 있는지, 스마트폰 상태 변화에 반응하는 코드가 있는지 두 조건으로 좁혔다.
- AndroidManifest 확인: 마켓 설치 경로 분석용 SDK 설정과 스플래시 화면의 인텐트 필터가 있었지만 일반적인 딥 링크 처리 용도였고 의심할 부분은 없었다.
- 외부 SDK 확인: 티몬은 외부 광고 노출 SDK를 쓰지 않고 로그 수집용만 쓰고 있었다. 로그 추적용 SDK는 설치 경로 수집만 했고, 퍼포먼스용 SDK는 개발사와 확인한 결과 활성화 여부와 무관하게 현상이 발생했다.
- 범위 확대: 같은 현상을 겪는 다른 앱들이 있다는 것을 구글링과 타 마켓 리뷰로 확인해 티몬만의 문제가 아니라고 판단했다.
- 로그 심기: 딥 링크로 외부 앱이 실행시킨 경우 getReferrer()가 Uri 형태로 넘겨준 패키지 정보를 얻을 수 있다는 점을 이용해 실행 주체를 기록했다.
- 로그량 통제: 카카오톡 등 일반적인 공유로 인한 실행은 제외했고, 마켓을 통한 정상 유입 경로도 쌓이지 않도록 걸렀다.
- 로그 분석: 배포 후 대량의 데이터가 쌓였고 런처가 아닌 로그 중 유달리 자주 등장하는 패키지가 드러났다. 확인해보니 설치 수 천만 단위의 대중적인 앱이었다.
- 재현 테스트 설계: 수집된 앱들을 실제로 설치하고, 동일 패키지명과 딥 링크 수신부를 복제한 테스트 앱에 로그 코드를 넣어 기기에 깔았다.
- 재현 절차: 설치한 앱을 한 번씩 실행해 광고를 클릭하고, 화면 잠금 상태로 방치하고, 퇴근·취침 전 충전하며 최근 앱 목록을 모두 닫고 다음 날 확인하는 순서였다.
- 재현 결과: 다음 날 실제로 테스트 앱들이 강제 실행돼 있었고 adb 셸로 시스템 로그를 확인해 실행시킨 패키지를 특정했다.
- 교차 확인: 티몬은 애드맥스 배너를 통한 유입이었는데 정작 그 앱은 애드맥스를 쓰지 않고 있었다. 애드맥스 팀에 직접 문의했고 문의한 앱들은 부정행위 의심으로 블록됐다.
- 동기 추정: 광고 배너의 클릭 발생률을 이용해 수익을 가로채는 방식이 있다는 자료를 참고했으나, 다운로드 수가 큰 앱이 의도했다고 보기는 어려워 그 앱이 쓰는 광고 SDK 쪽을 확인하는 방향으로 갔다.
- 권한 확인: 해당 광고 SDK가 화면 켜짐·꺼짐, 홈 버튼 입력, 앱 설치·업데이트, 와이파이와 연결 상태 변경, 배터리 체크 등 광고와 무관한 이벤트를 광범위하게 수신하고 있었다. 나머지는 난독화돼 있어 전부 확인하지는 못했다.
- 결말: 원인을 알아도 해당 앱을 유저가 지우지 않으면 해결되지 않는 종류의 문제지만, 문의한 유저에게 설치 여부를 확인하고 이유를 안내할 근거가 마련됐다.
왜 읽나내 앱 코드에는 원인이 없는데 이상 동작 리포트가 계속 들어올 때, 실행 주체를 로그로 남기고 재현 환경을 복제해 외부 요인을 특정해가는 절차를 따라갈 수 있다.