1 คะแนน โดย GN⁺ 2026-03-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แอปทางการของทำเนียบขาว ที่พัฒนาด้วย 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 pinning, มีทรัพยากรสำหรับพัฒนาเหลืออยู่, และมีความเป็นไปได้ในการรันโค้ดภายนอก จึงเกิด ข้อกังวลด้านความปลอดภัยและความเป็นส่วนตัว สำหรับการเป็นแอปทางการของรัฐบาล

ภาพรวมของแอป

  • แอปทางการ White House เป็นแอปพลิเคชันบนพื้นฐาน React Native ที่เผยแพร่บน App Store และ Google Play
    • ใช้ Expo SDK 54 และ Hermes JavaScript engine
    • แบ็กเอนด์เป็นโครงสร้าง REST API แบบปรับแต่งบน WordPress
    • ตามการตั้งค่า Expo ผู้สร้างถูกระบุเป็น “forty-five-press”
  • ลอจิกของแอปถูกคอมไพล์เป็น Hermes bytecode bundle ขนาด 5.5MB โดยโค้ดเนทีฟทำหน้าที่เป็นเพียงตัวห่อหุ้มแบบเรียบง่าย
  • เวอร์ชันคือ 47.0.1, บิลด์ 20 และเปิดใช้งาน Hermes กับ New Architecture

การตั้งค่า Expo

  • มีปลั๊กอินสองตัวคือ withNoLocation และ withStripPermissions
    • คาดว่าเกี่ยวข้องกับฟังก์ชันลบข้อมูลตำแหน่งและตัดสิทธิ์การเข้าถึง
  • ปิดการใช้งาน OTA update แม้ว่าจะมีโครงสร้างพื้นฐานสำหรับ Expo updates รวมอยู่ แต่ไม่ทำงาน

ฟังก์ชันการทำงานจริงของแอป

  • จากผลการวิเคราะห์สตริงใน Hermes bundle พบว่าแอปโหลดคอนเทนต์ผ่าน WordPress REST API ของ whitehouse.gov
    • endpoint หลักได้แก่ /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 เพื่อลบหน้าต่างขอความยินยอมที่ถูกเพิ่มใหม่อย่างต่อเนื่อง
  • ผลลัพธ์คือมีโครงสร้างที่ แอปทางการของรัฐบาลสหรัฐฯ ฉีดโค้ดเพื่อลบองค์ประกอบคุกกี้ GDPR และเพย์วอลล์ของเว็บไซต์บุคคลที่สาม

โครงสร้างพื้นฐานการติดตามตำแหน่ง

  • แม้จะมีปลั๊กอิน withNoLocation แต่ก็ยัง รวมโค้ดติดตามตำแหน่งของ OneSignal SDK ไว้อย่างสมบูรณ์
    • เงื่อนไขการเปิดใช้การติดตามมี 3 ข้อ
      1. ตั้งค่าแฟล็ก _isShared เป็น true (เมื่อเรียก setLocationShared(true))
      2. ผู้ใช้อนุญาตสิทธิ์เข้าถึงตำแหน่งขณะรัน
      3. อุปกรณ์มีผู้ให้บริการตำแหน่ง (GMS/HMS)
    • เมื่อครบเงื่อนไข จะมีการร้องขอ GPS ทุก 4.5 นาที (ขณะ foreground) และ 9.5 นาที (ขณะ background)
    • ข้อมูลที่เก็บ: ละติจูด ลองจิจูด ความแม่นยำ timestamp สถานะ foreground/background และระดับความละเอียดของตำแหน่ง
    • ข้อมูลถูกซิงก์ไปยังเซิร์ฟเวอร์ผ่าน PropertiesModel ของ OneSignal
    • มี background service รวมอยู่ด้วย จึงสามารถเก็บตำแหน่งได้แม้แอปไม่ได้ใช้งานอยู่
  • แม้จะยืนยันไม่ได้ว่ามีการเรียก setLocationShared ภายใน JS bundle หรือไม่ แต่ pipeline ทั้งหมดถูกคอมไพล์มาในสภาพที่พร้อมเปิดใช้งานได้

การทำโปรไฟล์ผู้ใช้ด้วย OneSignal

  • OneSignal SDK ไม่ได้ทำแค่ push notification แต่ยังทำ การติดตามพฤติกรรมผู้ใช้และการแบ่งกลุ่ม
    • ฟังก์ชันหลัก: addTag, addSms, addAliases, addOutcomeWithValue, addUniqueOutcome, notificationClicked, inAppMessageClicked, permissionChanged, subscriptionChanged, userStateChanged, setPrivacyConsentRequired, setPrivacyConsentGiven เป็นต้น
    • ฐานข้อมูลภายในเครื่องจะบันทึก การรับ เปิดอ่าน และเพิกเฉยต่อการแจ้งเตือน
  • ผลลัพธ์คือข้อมูลอย่าง ตำแหน่ง การโต้ตอบกับการแจ้งเตือน การคลิกข้อความในแอป หมายเลขโทรศัพท์ แท็ก และการเปลี่ยนแปลงสถานะ จะถูกส่งไปยังเซิร์ฟเวอร์ของ OneSignal

ความเสี่ยงด้านซัพพลายเชน: การโหลดโค้ดภายนอก

  • GitHub Pages

    • ไลบรารี react-native-youtube-iframe โหลด HTML จาก lonelycpp.github.io
    • หากบัญชี GitHub ดังกล่าวถูกเจาะ ก็อาจทำให้ JavaScript ตามอำเภอใจถูกรันใน WebView ของแอปได้
  • วิดเจ็ต Elfsight

    • ฝังโซเชียลฟีดผ่าน platform.js ของ Elfsight
    • โค้ด SaaS เชิงพาณิชย์นี้ ทำงานโดยไม่มี sandboxing และมีความเป็นไปได้ในการติดตาม
    • มีการ hardcode widget ID 4a00611b-befa-466e-bab2-6e824a0a98a9
  • บริการภายนอกอื่น ๆ

    • Mailchimp: จัดการการสมัครรับอีเมล (whitehouse.us10.list-manage.com)
    • Uploadcare: โฮสต์รูปภาพ (ucarecdn.com)
    • Truth Social: มีโปรไฟล์ Trump และปุ่ม “Follow” รวมอยู่
    • Facebook: โหลด iframe ของ page plugin
    • ทั้งหมดนี้เป็น บริการเชิงพาณิชย์ภายนอก ไม่ใช่โครงสร้างพื้นฐานของรัฐบาล

การตั้งค่าความปลอดภัย

  • ไม่มีการทำ SSL certificate pinning และใช้ Android TrustManager มาตรฐาน
    • ในสภาพแวดล้อมอย่าง Wi‑Fi สาธารณะหรือพร็อกซี อาจทำให้ ทราฟฟิกถูกเปิดเผยได้หากเกิดการโจมตีแบบ MITM

ร่องรอยจากการพัฒนา

  • ใน production build ยังมี URL และทรัพยากรสำหรับพัฒนา รวมอยู่
    • พบสตริง localhost และ IP ของนักพัฒนา (10.4.4.109)
    • มี Expo development client (expo-dev-client, expo-devlauncher, expo-devmenu) รวมอยู่
    • มีทรัพยากร dev_menu_fab_icon.png
    • มี Compose PreviewActivity อยู่ใน manifest แบบ export

โครงสร้างสิทธิ์การเข้าถึง

  • AndroidManifest มีสิทธิ์ที่เกี่ยวกับการแจ้งเตือนทั่วไป รวมถึง สิทธิ์สำหรับ launcher badge จำนวนมาก (Samsung, HTC, Sony ฯลฯ)
  • ในสตริงคำขอสิทธิ์ขณะรันมีสิทธิ์ ตำแหน่งแบบละเอียด ตำแหน่งแบบคร่าว ๆ และตำแหน่งพื้นหลัง
  • ในคำอธิบายบน Google Play ยังระบุสิทธิ์ต่อไปนี้
    • “แก้ไข/ลบพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน”, “เรียกใช้ foreground service”, “แสดงทับบนแอปอื่น”, “ทำงานตอนบูตเครื่อง”, “ใช้ฮาร์ดแวร์ลายนิ้วมือ/ไบโอเมตริก”
  • การตั้งค่า FileProvider เปิดเผย root ของ external storage ทั้งหมด และใช้กับการเข้าถึงไฟล์ของ 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 มี native .so library รวมอยู่ 25 รายการ

1 ความคิดเห็น

 
GN⁺ 2026-03-29
ความคิดเห็นจาก Hacker News
  • เนื้อหาของบทความดูเหมือน AI เขียน เลยทำให้ค่อนข้างสงสัย
    ด้วยความอยากรู้เลยลองติดตั้งแอปเอง แต่ต่างจากที่บทความอ้าง แอปไม่ได้ขอสิทธิ์ตำแหน่งเลย
    ลอง decompile APK ด้วย Claude Code แต่เครื่องมือนี้ ไม่เก่งเรื่องการวิเคราะห์ความสามารถในการเข้าถึงโค้ด หรือการทำความเข้าใจ control flow ที่ซับซ้อน
    มันมอง dead code ที่ไม่ถูกเรียกใช้เหมือนเป็นฟังก์ชันที่ถูกใช้งานจริง จึงทำให้เกิดความเข้าใจผิด

    • ในรายการสิทธิ์ที่อยู่ในบทความก็ไม่มีสิทธิ์ตำแหน่งเช่นกัน
      ถ้าจะขอตำแหน่งตอนรันไทม์ จำเป็นต้องประกาศไว้ก่อน แต่ตรงนี้ไม่มี
      บนมือถือของฉัน (อาจเป็นเพราะ Graphene ก็ได้) Play บล็อกการติดตั้ง เลยไม่ได้ตรวจ APK โดยตรง
      ถ้าดูหัวข้อ “ข้อมูล → สิทธิ์” ใน Play Store เวอร์ชัน 47.0.1 มีแค่สิทธิ์ทั่วไปอย่างการเข้าถึงเครือข่าย การควบคุมการสั่น และการแสดงการแจ้งเตือน
      อาจเป็นไปได้ว่าเป็นเรื่องของ การทยอยปล่อยเวอร์ชัน หรือการกำหนดเป้าหมายตามอุปกรณ์
    • อยากรู้ว่ามีเหตุผลที่ชัดเจนไหมที่บอกว่า “เหมือน AI เขียน”
      ฉันไม่ได้รู้สึกแบบนั้น
    • บทความไม่ได้บอกว่าแอปขอสิทธิ์ตำแหน่ง แต่บอกว่า ใช้ JS แค่บรรทัดเดียวก็เอาตำแหน่งมาได้
    • หรือว่าเวอร์ชันแอปต่างกัน?
      ใน iPhone App Store เวอร์ชัน 47.0.1 เพิ่งอัปขึ้นเมื่อ 34 นาทีที่แล้ว และระบุว่า “แก้บั๊กเล็กน้อย”
      เป็นไปได้ว่าการแก้นั้นรวมโค้ดเกี่ยวกับตำแหน่งไว้ด้วย
    • อยากรู้ว่าในขั้นตอน decompile มีความเป็นไปได้ไหมที่แอป แสดงข้อมูลหลอก ออกมา
  • มันดูเหมือน แอปการตลาดของบริษัทที่ปรึกษา ทั่วไป
    เหมือนนักพัฒนาภายนอกใช้สถาปัตยกรรมมาตรฐาน แล้วโค้ดอย่างการติดตามตำแหน่งก็ถูกใส่มาเป็นค่าเริ่มต้น

    • โค้ดติดตามตำแหน่งนั้นอยู่ใน OneSignal SDK
      จริง ๆ แล้วนี่เป็นแค่แพลตฟอร์มสำหรับ push notification ถ้าแอปไม่ขอสิทธิ์เองก็จะไม่เกิดอะไรขึ้น
    • 45Press เป็นบริษัทแบบนั้น
      ดูเหมือนจะได้สัญญาสนับสนุนงานที่เกี่ยวกับทำเนียบขาว (มูลค่าราว 1.5 ล้านดอลลาร์) แล้วจึงทำแอปนี้ขึ้นมา
    • น่าเสียดาย ถ้ายังมี US Digital Service แบบเมื่อก่อนอยู่ ก็น่าจะทำของแบบนี้ได้ดีกว่า
      ตอนนี้แทบถูกยุบไปแล้วและเปลี่ยนเป็นองค์กรชื่อ DOGE แถมยังพัวพันกับคดีความหลายคดี
      บทความวิกิของ United States Digital Service
    • r8 เข้าใจโค้ด React Native ได้ไม่ดีพอ เลยทำ dead code removal (tree shaking) ได้ไม่สมบูรณ์
      จึงเหมือนมีร่องรอยของโค้ดที่นำกลับมาใช้จากแอปอื่นหลงเหลืออยู่
    • เห็นข้อความ “Visit TrumpRx.gov” แล้วตกใจมาก
      สงสัยว่าการใช้โดเมน .gov เพื่อ การโปรโมตเชิงพาณิชย์ ทำได้จริงหรือ
  • ถ้าเนื้อหาในบทความเป็นความจริง นี่คงเป็นเหตุการณ์ที่หมายถึง จุดจบเชิงสัญลักษณ์ของเสรีภาพ
    ให้ความรู้สึกว่าคุณค่าที่อเมริกาเคยภูมิใจได้หายไปแล้ว

  • น่าตกใจที่แอปทางการของรัฐบาลจะ แทรก CSS และ JavaScript ลงในเว็บไซต์ของบุคคลที่สามเพื่อเอา cookie banner หรือ paywall ออก
    ฉันคงไม่ติดตั้งแอปรัฐบาลแบบปิดซอร์ส แต่ในแง่ฟังก์ชันแล้วมันดูเป็นเรื่องดีคล้าย uBlock

  • เว็บไซต์ช้ามากจนแทบใช้งานไม่ได้
    บน MacBook Pro ปี 2019 + Chrome ของฉัน การเลื่อนกระตุกหนักมาก

    • บน Firefox 149 (Windows 10) การเลื่อนก็แย่มากเหมือนกัน
      น่าขันที่บทความซึ่งวิจารณ์งานเว็บกลับมี ปัญหาประสิทธิภาพเว็บ แบบนี้เอง
    • บน Firefox มือถือ (151.0a1) ก็หน่วงมากจนอ่านลำบาก
    • บน ThinkPad + Chrome ก็เจออาการเดียวกัน
    • เห็นด้วยว่า คุณภาพเว็บของต้นฉบับแย่มาก
    • บน Android 14 + Firefox 148.0.2 กลับทำงานปกติ
  • คำวิจารณ์ว่าไม่มี certificate pinning ดูจะพูดเกินไปหน่อย
    ต่อให้อยู่ในเครือข่ายที่ทำ MITM ได้ ถ้าอุปกรณ์ของฉันไม่เชื่อถือ CA นั้น ก็จะขึ้น TLS error อยู่ดี

    • แต่ถ้ามีใครออก certificate ที่เซ็นโดย CA ที่มือถือฉันเชื่อถือได้ เรื่องก็จะต่างออกไป
      เช่น อาจจินตนาการถึงกรณีดักทราฟฟิกในคาเฟ่ใกล้สถานทูตของบางประเทศที่การเฝ้าระวังเป็นเรื่องปกติ
      เรื่องแบบนี้อาจไม่เกิดบ่อย แต่ก็ไม่ถึงกับเป็นไปไม่ได้เลย
    • ถ้าเป็นองค์กรที่ใช้ MDM ก็มีข้อยกเว้น เพราะสามารถ push CA ของตัวเองลงอุปกรณ์ได้
    • การถกเถียงนี้อิงกับ แนวปฏิบัติด้านความปลอดภัยแบบเก่า อยู่แล้ว จึงไม่ค่อยมีความหมายมากนักในปัจจุบัน
  • เว็บไซต์นี้หนักจนเบราว์เซอร์ แทบค้าง
    ฉันอ่านได้แบบพอไหวเฉพาะใน reader mode

    • ฉันก็เจอเหมือนกัน
      ตอนแรกนึกว่าเป็นปัญหาที่แท็บเล็ตของตัวเอง แต่พอคนอื่นเจอด้วยก็น่าสนใจดี
  • ตอนเลื่อนหน้า GPU รับภาระหนักมาก ทำให้ การใช้ทรัพยากรกราฟิก สูง

  • ช่วงนี้ทำเนียบขาวดูเหมือนว่า การละเมิดกฎหมาย กลายเป็นเรื่องปกติไปแล้ว

  • ตั้งแต่แรกฉันก็ สมมติว่าเป็นมัลแวร์ และสุดท้ายก็เป็นอย่างที่คิด