백악관 공식 앱 디컴파일 결과 드러난 추적 및 외부 코드 구조
3 hours ago
1
- React Native 기반의 백악관 공식 앱은 WordPress 백엔드와 Expo SDK 54, Hermes 엔진을 사용하며, 뉴스·사진·정책 등 콘텐츠를 제공하는 포털 형태임
- 모든 WebView에 JavaScript 주입 코드가 포함되어 쿠키 배너, GDPR 동의창, 페이월 요소 등을 자동으로 제거함
-
OneSignal SDK를 통한 위치 추적 및 사용자 프로파일링 기능이 완전 포함되어 있으며, GPS 데이터를 4.5분~9.5분 간격으로 수집 가능함
- 앱은 GitHub Pages, Elfsight, Mailchimp, Uploadcare, Truth Social 등 외부 상용 서비스를 로드해 공급망 위험과 추적 가능성을 내포함
-
SSL 핀닝 미적용, 개발용 리소스 포함, 외부 코드 실행 가능성 등으로 인해 정부 공식 앱으로서는 보안·프라이버시 측면의 우려가 제기됨
앱 개요
-
White House 공식 앱은 App Store와 Google Play에 공개된 React Native 기반 애플리케이션
-
Expo SDK 54와 Hermes JavaScript 엔진을 사용
- 백엔드는 WordPress 기반의 커스텀 REST API 구조
- Expo 설정에 따르면 제작 주체는 “forty-five-press” 로 명시
- 앱 로직은 5.5MB 크기의 Hermes 바이트코드 번들로 컴파일되어 있으며, 네이티브 코드는 단순 래퍼 형태
- 버전은 47.0.1, 빌드 20, Hermes 및 New Architecture 활성화 상태
Expo 설정
- 두 개의 플러그인 withNoLocation 과 withStripPermissions 이 포함되어 있음
- 위치 정보 제거 및 권한 스트립 관련 기능으로 추정
-
OTA 업데이트 비활성화, Expo 업데이트 인프라는 포함되어 있으나 동작하지 않음
앱의 실제 기능
- Hermes 번들 문자열 분석 결과, 앱은 whitehouse.gov의 WordPress REST API를 통해 콘텐츠를 로드
- 주요 엔드포인트는 /wp-json/whitehouse/v1/home, /news/articles, /wire, /live, /galleries, /issues, /priorities, /achievements, /affordability, /media-bias, /social/x 등
- 앱 내 문자열에는 "THE TRUMP EFFECT", "Greatest President Ever!", "Text President Trump", "Visit TrumpRx.gov", "Visit TrumpAccounts.gov" 등이 포함
- 또한 https://www.ice.gov/webform/ice-tip-form 링크가 직접 포함되어 있음
- 전체적으로 뉴스, 생중계, 사진, 정책, 소셜 피드, 행정부 홍보 콘텐츠를 제공하는 포털 형태
쿠키·페이월 차단 스크립트
- 외부 링크를 여는 WebView에 매 페이지 로드 시 JavaScript 주입 코드가 실행됨
- 이 스크립트는 쿠키 배너, GDPR 동의창, 로그인/회원가입 벽, 업셀·페이월 요소, CMP 박스 등을 숨김
-
body { overflow: auto !important }를 강제 적용해 스크롤 잠금 해제
-
MutationObserver를 통해 새로 추가되는 동의창도 지속적으로 제거
- 결과적으로 미국 정부 공식 앱이 제3자 웹사이트의 쿠키·GDPR·페이월 요소를 제거하는 코드를 주입하는 구조
위치 추적 인프라
-
withNoLocation 플러그인이 있음에도 OneSignal SDK의 위치 추적 코드가 완전히 포함되어 있음
- 추적 활성화 조건은 세 가지
-
_isShared 플래그가 true로 설정 (setLocationShared(true) 호출 시)
- 사용자가 런타임에서 위치 권한을 허용
- 기기에 위치 제공자(GMS/HMS)가 존재
- 조건 충족 시 4.5분(전경), 9.5분(백그라운드) 간격으로 GPS 요청
- 수집 데이터: 위도, 경도, 정확도, 타임스탬프, 포그라운드/백그라운드 여부, 위치 정밀도
- 데이터는 OneSignal의 PropertiesModel을 통해 서버로 동기화
- 백그라운드 서비스도 포함되어 있어 앱 비활성 상태에서도 위치 캡처 가능
- JS 번들 내 setLocationShared 호출 여부는 확인 불가하지만, 전체 파이프라인이 활성화 가능한 상태로 컴파일되어 있음
OneSignal 사용자 프로파일링
- OneSignal SDK는 단순 푸시 알림 외에 사용자 행동 추적 및 세분화 기능을 수행
- 주요 기능: addTag, addSms, addAliases, addOutcomeWithValue, addUniqueOutcome, notificationClicked, inAppMessageClicked, permissionChanged, subscriptionChanged, userStateChanged, setPrivacyConsentRequired, setPrivacyConsentGiven 등
- 로컬 DB는 알림 수신·열람·무시 여부를 기록
- 결과적으로 위치, 알림 상호작용, 인앱 메시지 클릭, 전화번호, 태그, 상태 변화 등이 OneSignal 서버로 전송됨
공급망 위험: 외부 코드 로딩
-
GitHub Pages
-
react-native-youtube-iframe 라이브러리가 lonelycpp.github.io 에서 HTML을 로드
- 해당 GitHub 계정이 침해될 경우 임의의 JavaScript가 앱 WebView 내에서 실행 가능
-
Elfsight 위젯
-
Elfsight의 platform.js를 통해 소셜 피드 임베드
- 상용 SaaS 코드가 샌드박싱 없이 실행, 추적 가능성 존재
- 위젯 ID 4a00611b-befa-466e-bab2-6e824a0a98a9가 하드코딩
-
기타 외부 서비스
-
Mailchimp: 이메일 구독 처리 (whitehouse.us10.list-manage.com)
-
Uploadcare: 이미지 호스팅 (ucarecdn.com)
-
Truth Social: 트럼프 프로필 및 “Follow” 버튼 포함
-
Facebook: 페이지 플러그인 iframe 로드
- 이들 모두 정부 인프라가 아닌 외부 상용 서비스
보안 설정
-
SSL 인증서 핀닝 없음, 표준 Android TrustManager 사용
- 공용 Wi-Fi나 프록시 환경에서 MITM 공격 시 트래픽 노출 가능성
개발 잔여물
- 프로덕션 빌드에 개발용 URL 및 리소스가 포함
-
localhost 및 개발자 IP(10.4.4.109) 문자열 존재
-
Expo 개발 클라이언트(expo-dev-client, expo-devlauncher, expo-devmenu) 가 포함
-
dev_menu_fab_icon.png 리소스 존재
-
Compose PreviewActivity 가 매니페스트에 export 상태로 포함
권한 구조
- AndroidManifest는 일반적인 알림 중심 권한 외에 다수의 런처 배지 권한(삼성, HTC, Sony 등) 포함
- 런타임 요청 문자열로 정밀 위치, 대략적 위치, 백그라운드 위치 권한이 존재
- Google Play 설명에는 다음 권한도 명시
- “공유 저장소 수정/삭제”, “포그라운드 서비스 실행”, “다른 앱 위에 표시”, “부팅 시 실행”, “지문·생체인식 하드웨어 사용”
- FileProvider 설정은 외부 저장소 루트 전체 노출, WebView 파일 접근에 사용
포함된 SDK 목록
- 총 68개 이상 라이브러리 포함
-
프레임워크: React Native, Expo SDK 54, Hermes
-
푸시/참여: OneSignal, Firebase Cloud Messaging, Firebase Installations
-
분석/텔레메트리: Firebase Analytics, Google Data Transport, OpenTelemetry
-
네트워킹: OkHttp3, Apollo GraphQL, Okio
-
이미지: Fresco, Glide, Coil 3, Uploadcare CDN
-
비디오: ExoPlayer(Media3), Expo Video
-
ML: Google ML Kit Vision(바코드 스캐닝), Barhopper 모델
-
암호화: Bouncy Castle
-
저장소: Expo Secure Store, React Native Async Storage
-
WebView: React Native WebView (주입 스크립트 포함)
-
DI: Koin
-
직렬화: GSON, Wire(Protocol Buffers)
-
라이선스 검증: PairIP (Google Play 확인용)
- arm64 빌드에 25개의 네이티브 .so 라이브러리 포함
-
Homepage
-
개발자
- 백악관 공식 앱 디컴파일 결과 드러난 추적 및 외부 코드 구조