pile·
모바일·티몬티몬·

자동실행추적기

티몬 앱의 플레이 스토어 리뷰에 반복해 올라오던 "앱이 저절로 실행된다"는 이슈를 모바일 개발 유닛이 추적한 기록이다. 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가 화면 켜짐·꺼짐, 홈 버튼 입력, 앱 설치·업데이트, 와이파이와 연결 상태 변경, 배터리 체크 등 광고와 무관한 이벤트를 광범위하게 수신하고 있었다. 나머지는 난독화돼 있어 전부 확인하지는 못했다.
  • 결말: 원인을 알아도 해당 앱을 유저가 지우지 않으면 해결되지 않는 종류의 문제지만, 문의한 유저에게 설치 여부를 확인하고 이유를 안내할 근거가 마련됐다.
왜 읽나내 앱 코드에는 원인이 없는데 이상 동작 리포트가 계속 들어올 때, 실행 주체를 로그로 남기고 재현 환경을 복제해 외부 요인을 특정해가는 절차를 따라갈 수 있다.
티몬
티몬 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 모바일·당근당근 테크블로그·

    웹뷰 다음의 레일을 깔다: 당근이 Lynx를 선택한 이유

    당근 프론트엔드코어팀이 WebView 기반 화면의 첫 프레임 렌더링 문제를 해결하기 위해 Lynx를 도입한 기록이다. 레퍼런스가 거의 없는 기술을 코드베이스 직접 분석으로 검증한 뒤 프로덕션에 적용했고, 1.9백만 사용자 A/B에서 Android 18%, iOS 37%의 첫 프레임 단축을 달성했다.

    요약 이어보기
    #cross-platform#webview#mobile-performance+2
  2. 모바일·토스 SLASH토스 SLASH·

    토스의 디바이스 팜 만들기

    토스가 각 팀이 각자 운영하던 작은 디바이스 팜을 하나의 중앙 플랫폼 '네뷸라(Nebula)'로 통합한 과정을 다룬다. Appium 대신 자체 드라이버를 개발해 클릭 13.5배, 텍스트 입력 10배의 성능을 달성했고, Android와 iOS 미러링도 직접 내재화해 실기기 원격 조작과 화면 실시간 공유를 동시에 가능하게 만들었다. 현재 100대를 넘어 수백 대를 향해 24시간 가동 중이다.

    요약 이어보기
    #android#ios#appium+2