1 điểm bởi GN⁺ 26 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Ứng dụng chính thức của Nhà Trắng dựa trên React Native sử dụng backend WordPress cùng Expo SDK 54 và engine Hermes, hoạt động như một cổng nội dung cung cấp tin tức, ảnh, chính sách và hơn thế nữa
  • Mọi WebView đều chứa mã chèn JavaScript để tự động loại bỏ banner cookie, hộp thoại đồng ý GDPR, thành phần paywall và tương tự
  • Chức năng theo dõi vị trí và lập hồ sơ người dùng thông qua OneSignal SDK được tích hợp đầy đủ, có thể thu thập dữ liệu GPS theo chu kỳ 4,5 phút đến 9,5 phút
  • Ứng dụng tải các dịch vụ thương mại bên ngoài như GitHub Pages, Elfsight, Mailchimp, Uploadcare, Truth Social nên tiềm ẩn rủi ro chuỗi cung ứng và khả năng theo dõi
  • Do không áp dụng SSL pinning, còn sót tài nguyên dành cho phát triển, khả năng thực thi mã bên ngoài, ứng dụng chính thức của chính phủ này dấy lên lo ngại về bảo mật và quyền riêng tư

Tổng quan ứng dụng

  • Ứng dụng chính thức White House là ứng dụng dựa trên React Native được phát hành trên App Store và Google Play
    • Sử dụng Expo SDK 54Hermes JavaScript engine
    • Backend là cấu trúc REST API tùy biến dựa trên WordPress
    • Theo cấu hình Expo, đơn vị tạo ứng dụng được ghi là “forty-five-press”
  • Logic ứng dụng được biên dịch thành gói bytecode Hermes dung lượng 5,5MB, còn mã native chỉ là lớp wrapper đơn giản
  • Phiên bản là 47.0.1, build 20, với Hermes và New Architecture đang được bật

Cấu hình Expo

  • Có hai plugin withNoLocationwithStripPermissions
    • Được cho là liên quan đến việc loại bỏ dữ liệu vị trí và tước quyền
  • OTA update bị vô hiệu hóa, hạ tầng cập nhật Expo vẫn được bao gồm nhưng không hoạt động

Chức năng thực tế của ứng dụng

  • Kết quả phân tích chuỗi trong bundle Hermes cho thấy ứng dụng tải nội dung thông qua WordPress REST API của whitehouse.gov
    • Các endpoint chính gồm /wp-json/whitehouse/v1/home, /news/articles, /wire, /live, /galleries, /issues, /priorities, /achievements, /affordability, /media-bias, /social/x và hơn thế nữa
  • Trong chuỗi nội bộ của ứng dụng có các nội dung như "THE TRUMP EFFECT", "Greatest President Ever!", "Text President Trump", "Visit TrumpRx.gov", "Visit TrumpAccounts.gov"
  • Ngoài ra còn có liên kết https://www.ice.gov/webform/ice-tip-form được nhúng trực tiếp
  • Tổng thể, đây là một cổng nội dung cung cấp tin tức, phát trực tiếp, ảnh, chính sách, feed mạng xã hội và nội dung quảng bá của chính quyền

Script chặn cookie và paywall

  • Trong WebView dùng để mở liên kết ngoài, mã chèn JavaScript được thực thi mỗi khi trang tải xong
    • Script này ẩn banner cookie, hộp thoại đồng ý GDPR, tường đăng nhập/đăng ký, thành phần upsell·paywall, hộp CMP và tương tự
    • Ép áp dụng body { overflow: auto !important } để mở khóa cuộn trang
    • Tiếp tục loại bỏ cả các hộp đồng ý mới được thêm vào bằng MutationObserver
  • Kết quả là ứng dụng chính thức của chính phủ Mỹ chèn mã để loại bỏ các thành phần cookie, GDPR và paywall của website bên thứ ba

Hạ tầng theo dõi vị trí

  • Dù có plugin withNoLocation, mã theo dõi vị trí của OneSignal SDK vẫn được tích hợp đầy đủ
    • Có ba điều kiện để kích hoạt theo dõi
      1. Cờ _isShared được đặt thành true (khi gọi setLocationShared(true))
      2. Người dùng cho phép quyền vị trí trong lúc chạy
      3. Thiết bị có nhà cung cấp vị trí (GMS/HMS)
    • Khi đủ điều kiện, GPS được yêu cầu theo chu kỳ 4,5 phút (foreground), 9,5 phút (background)
    • Dữ liệu thu thập gồm: vĩ độ, kinh độ, độ chính xác, dấu thời gian, trạng thái foreground/background, mức độ chính xác vị trí
    • Dữ liệu được đồng bộ lên máy chủ thông qua PropertiesModel của OneSignal
    • Có cả dịch vụ nền nên vẫn có thể ghi nhận vị trí khi ứng dụng không hoạt động
  • Không thể xác nhận có lời gọi setLocationShared trong JS bundle hay không, nhưng toàn bộ pipeline đã được biên dịch ở trạng thái có thể kích hoạt

Lập hồ sơ người dùng bằng OneSignal

  • Ngoài thông báo đẩy đơn thuần, OneSignal SDK còn thực hiện theo dõi hành vi người dùng và phân khúc hóa
    • Các chức năng chính: addTag, addSms, addAliases, addOutcomeWithValue, addUniqueOutcome, notificationClicked, inAppMessageClicked, permissionChanged, subscriptionChanged, userStateChanged, setPrivacyConsentRequired, setPrivacyConsentGiven v.v.
    • Cơ sở dữ liệu cục bộ ghi lại trạng thái nhận, mở và bỏ qua thông báo
  • Kết quả là vị trí, tương tác với thông báo, nhấp vào tin nhắn trong ứng dụng, số điện thoại, tag và các thay đổi trạng thái đều được gửi tới máy chủ OneSignal

Rủi ro chuỗi cung ứng: tải mã bên ngoài

  • GitHub Pages

    • Thư viện react-native-youtube-iframe tải HTML từ lonelycpp.github.io
    • Nếu tài khoản GitHub này bị xâm nhập, JavaScript tùy ý có thể được thực thi trong WebView của ứng dụng
  • Widget Elfsight

    • Nhúng feed mạng xã hội thông qua platform.js của Elfsight
    • Mã SaaS thương mại được thực thi không có sandbox, tồn tại khả năng theo dõi
    • Widget ID 4a00611b-befa-466e-bab2-6e824a0a98a9 được hardcode
  • Các dịch vụ bên ngoài khác

    • Mailchimp: xử lý đăng ký email (whitehouse.us10.list-manage.com)
    • Uploadcare: lưu trữ ảnh (ucarecdn.com)
    • Truth Social: bao gồm hồ sơ Trump và nút “Follow”
    • Facebook: tải iframe plugin trang
    • Tất cả đều là dịch vụ thương mại bên ngoài, không phải hạ tầng của chính phủ

Cấu hình bảo mật

  • Không có SSL certificate pinning, sử dụng Android TrustManager tiêu chuẩn
    • Trong môi trường Wi‑Fi công cộng hoặc proxy, lưu lượng có thể bị lộ khi xảy ra tấn công MITM

Dấu vết còn sót từ môi trường phát triển

  • Bản build production vẫn chứa URL và tài nguyên dành cho phát triển
    • Có chuỗi localhost và IP của nhà phát triển (10.4.4.109)
    • Bao gồm Expo development client (expo-dev-client, expo-devlauncher, expo-devmenu)
    • Có tài nguyên dev_menu_fab_icon.png
    • Compose PreviewActivity được export trong manifest

Cấu trúc quyền

  • AndroidManifest ngoài các quyền thông thường liên quan đến thông báo còn bao gồm nhiều quyền badge launcher (Samsung, HTC, Sony v.v.)
  • Trong chuỗi yêu cầu runtime có các quyền vị trí chính xác, vị trí gần đúng, vị trí nền
  • Mô tả trên Google Play cũng nêu các quyền sau
    • “sửa/xóa bộ nhớ dùng chung”, “chạy foreground service”, “hiển thị đè lên ứng dụng khác”, “chạy khi khởi động”, “sử dụng phần cứng vân tay/sinh trắc học”
  • Cấu hình FileProvider mở lộ toàn bộ gốc bộ nhớ ngoài, được dùng cho truy cập tệp từ WebView

Danh sách SDK được tích hợp

  • Bao gồm hơn 68 thư viện
    • Framework: React Native, Expo SDK 54, Hermes
    • Push/tương tác: OneSignal, Firebase Cloud Messaging, Firebase Installations
    • Phân tích/telemetry: Firebase Analytics, Google Data Transport, OpenTelemetry
    • Mạng: OkHttp3, Apollo GraphQL, Okio
    • Hình ảnh: Fresco, Glide, Coil 3, Uploadcare CDN
    • Video: ExoPlayer(Media3), Expo Video
    • ML: Google ML Kit Vision (quét mã vạch), mô hình Barhopper
    • Mật mã: Bouncy Castle
    • Lưu trữ: Expo Secure Store, React Native Async Storage
    • WebView: React Native WebView (bao gồm script chèn)
    • DI: Koin
    • Tuần tự hóa: GSON, Wire (Protocol Buffers)
    • Xác minh giấy phép: PairIP (dùng để xác nhận Google Play)
  • Bản build arm64 bao gồm 25 thư viện native .so

1 bình luận

 
Ý kiến trên Hacker News
  • Nội dung bài báo trông giống như do AI viết, nên tôi hơi nghi ngờ
    Vì tò mò, tôi đã tự cài ứng dụng để kiểm tra, nhưng trái với những gì bài báo khẳng định, hoàn toàn không có yêu cầu quyền vị trí
    Tôi đã dùng Claude Code để decompile APK, nhưng công cụ này khá yếu trong phân tích khả năng truy vết hoặc hiểu các luồng điều khiển phức tạp
    Nó cũng coi cả dead code không được gọi tới như thể là các hàm đang được sử dụng thực sự, dễ gây hiểu lầm

    • Ngay cả trong danh sách quyền được nêu trong bài cũng không có quyền vị trí
      Muốn yêu cầu vị trí lúc chạy thì bắt buộc phải khai báo trước, nhưng ở đây không có phần đó
      Trên điện thoại của tôi (có thể là do Graphene), Play chặn cài đặt nên tôi không trực tiếp kiểm tra APK được
      Nếu xem mục “Thông tin → Quyền” trên Play Store thì bản 47.0.1 chỉ có các quyền thông thường như truy cập mạng, điều khiển rung, hiển thị thông báo
      Có lẽ đây là trường hợp rollout theo phiên bản hoặc nhắm mục tiêu theo từng thiết bị
    • Tôi muốn biết liệu có căn cứ cụ thể nào cho nhận định “trông như AI viết” hay không
      Cá nhân tôi thì không thấy vậy
    • Bài báo không nói ứng dụng yêu cầu quyền vị trí, mà giải thích rằng chỉ với một dòng JS là có thể lấy vị trí
    • Có thể phiên bản ứng dụng khác nhau chăng?
      Trên iPhone App Store, bản 47.0.1 được đăng lên cách đây 34 phút và ghi là “sửa lỗi nhỏ”
      Có thể phần sửa đó đã bao gồm mã liên quan đến vị trí
    • Tôi thắc mắc liệu trong quá trình decompile, ứng dụng có thể đã hiển thị thông tin sai lệch hay không
  • Trông giống một ứng dụng marketing của công ty tư vấn điển hình
    Có vẻ như bên phát triển thuê ngoài dùng kiến trúc chuẩn, nên những thứ như mã theo dõi vị trí được đưa vào mặc định

    • Mã theo dõi vị trí nằm trong OneSignal SDK
      Đây chỉ là nền tảng cho push notification, nên nếu ứng dụng không tự yêu cầu quyền thì sẽ không có gì xảy ra
    • 45Press đúng là kiểu công ty đó
      Có vẻ họ đã giành được hợp đồng hỗ trợ liên quan đến Nhà Trắng (khoảng 1,5 triệu USD) và làm ra ứng dụng này
    • Thật tiếc vì nếu US Digital Service vẫn còn như trước thì có lẽ họ đã có thể làm thứ này đàng hoàng hơn
      Giờ thì gần như đã bị giải thể và đổi thành tổ chức DOGE, lại còn đang vướng vào nhiều vụ kiện
      Bài viết Wikipedia về United States Digital Service
    • r8 không thực sự hiểu được mã React Native nên không thể loại bỏ dead code (tree shaking) đúng cách
      Vì thế có vẻ vẫn còn sót lại dấu vết được tái sử dụng từ các ứng dụng khác
    • Tôi đã giật mình khi thấy dòng “Visit TrumpRx.gov”
      Tôi nghi ngờ liệu có được phép dùng tên miền .gov cho mục đích quảng bá thương mại hay không
  • Nếu nội dung bài báo là thật, thì đây sẽ là một sự việc mang ý nghĩa như cái chết mang tính biểu tượng của tự do
    Cảm giác như những giá trị mà nước Mỹ từng tự hào đang biến mất

  • Việc một ứng dụng chính thức của chính phủ chèn CSS và JavaScript vào các website bên thứ ba để gỡ banner cookie hoặc paywall thật đáng ngạc nhiên
    Tôi sẽ không cài một ứng dụng chính phủ không minh bạch như vậy, nhưng bản thân tính năng này thì tôi lại thấy tích cực theo kiểu uBlock

  • Trang web chậm đến mức gần như không dùng được
    Trên MacBook Pro 2019 của tôi với Chrome, cuộn bị giật rất nặng

    • Trên Firefox 149 (Windows 10) thì cuộn cũng tệ y như vậy
      Trớ trêu là một bài báo chỉ trích phát triển web lại gặp đúng vấn đề hiệu năng web như thế này
    • Trên Firefox di động (151.0a1), cuộn cũng giật đến mức khó đọc
    • Trên ThinkPad + Chrome cũng gặp hiện tượng tương tự
    • Tôi đồng ý rằng chất lượng web của trang gốc quá tệ
    • Trên Android 14 + Firefox 148.0.2 thì lại hoạt động bình thường
  • Chỉ trích rằng không có certificate pinning có vẻ hơi cường điệu
    Dù ở trong một mạng có thể bị MITM, nếu thiết bị của tôi không tin CA đó thì cùng lắm chỉ phát sinh lỗi TLS

    • Nhưng nếu ai đó có thể lấy được chứng chỉ được ký bởi CA mà điện thoại tôi tin tưởng thì câu chuyện sẽ khác
      Ví dụ, có thể tưởng tượng tình huống chặn lưu lượng ở một quán cà phê gần đại sứ quán của một quốc gia nơi giám sát là chuyện thường ngày
      Những việc như vậy hiếm thật, nhưng không phải là hoàn toàn bất khả thi
    • Với các tổ chức dùng MDM thì lại là ngoại lệ, vì họ có thể đẩy CA riêng lên thiết bị
    • Cuộc thảo luận này vốn đã dựa trên thực hành bảo mật lỗi thời, nên ở thời điểm hiện tại cũng không còn nhiều ý nghĩa
  • Trang này nặng đến mức trình duyệt gần như treo máy
    Tôi chỉ đọc nổi nhờ chế độ reader mode

    • Tôi cũng gặp y hệt
      Ban đầu tôi tưởng là do máy tính bảng của mình, nhưng thấy người khác cũng vậy thì khá thú vị
  • Khi cuộn trang, tải lên GPU rất nặng nên mức sử dụng tài nguyên đồ họa cao

  • Dạo này Nhà Trắng có vẻ xem vi phạm pháp luật là chuyện thường ngày

  • Ngay từ đầu tôi đã mặc định đây là malware, và đúng là dự đoán đó đã chính xác