- แอปทางการของทำเนียบขาว ที่พัฒนาด้วย 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 ข้อ
- ตั้งค่าแฟล็ก
_isShared เป็น true (เมื่อเรียก setLocationShared(true))
- ผู้ใช้อนุญาตสิทธิ์เข้าถึงตำแหน่งขณะรัน
- อุปกรณ์มีผู้ให้บริการตำแหน่ง (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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เนื้อหาของบทความดูเหมือน AI เขียน เลยทำให้ค่อนข้างสงสัย
ด้วยความอยากรู้เลยลองติดตั้งแอปเอง แต่ต่างจากที่บทความอ้าง แอปไม่ได้ขอสิทธิ์ตำแหน่งเลย
ลอง decompile APK ด้วย Claude Code แต่เครื่องมือนี้ ไม่เก่งเรื่องการวิเคราะห์ความสามารถในการเข้าถึงโค้ด หรือการทำความเข้าใจ control flow ที่ซับซ้อน
มันมอง dead code ที่ไม่ถูกเรียกใช้เหมือนเป็นฟังก์ชันที่ถูกใช้งานจริง จึงทำให้เกิดความเข้าใจผิด
ถ้าจะขอตำแหน่งตอนรันไทม์ จำเป็นต้องประกาศไว้ก่อน แต่ตรงนี้ไม่มี
บนมือถือของฉัน (อาจเป็นเพราะ Graphene ก็ได้) Play บล็อกการติดตั้ง เลยไม่ได้ตรวจ APK โดยตรง
ถ้าดูหัวข้อ “ข้อมูล → สิทธิ์” ใน Play Store เวอร์ชัน 47.0.1 มีแค่สิทธิ์ทั่วไปอย่างการเข้าถึงเครือข่าย การควบคุมการสั่น และการแสดงการแจ้งเตือน
อาจเป็นไปได้ว่าเป็นเรื่องของ การทยอยปล่อยเวอร์ชัน หรือการกำหนดเป้าหมายตามอุปกรณ์
ฉันไม่ได้รู้สึกแบบนั้น
ใน iPhone App Store เวอร์ชัน 47.0.1 เพิ่งอัปขึ้นเมื่อ 34 นาทีที่แล้ว และระบุว่า “แก้บั๊กเล็กน้อย”
เป็นไปได้ว่าการแก้นั้นรวมโค้ดเกี่ยวกับตำแหน่งไว้ด้วย
มันดูเหมือน แอปการตลาดของบริษัทที่ปรึกษา ทั่วไป
เหมือนนักพัฒนาภายนอกใช้สถาปัตยกรรมมาตรฐาน แล้วโค้ดอย่างการติดตามตำแหน่งก็ถูกใส่มาเป็นค่าเริ่มต้น
จริง ๆ แล้วนี่เป็นแค่แพลตฟอร์มสำหรับ push notification ถ้าแอปไม่ขอสิทธิ์เองก็จะไม่เกิดอะไรขึ้น
ดูเหมือนจะได้สัญญาสนับสนุนงานที่เกี่ยวกับทำเนียบขาว (มูลค่าราว 1.5 ล้านดอลลาร์) แล้วจึงทำแอปนี้ขึ้นมา
ตอนนี้แทบถูกยุบไปแล้วและเปลี่ยนเป็นองค์กรชื่อ DOGE แถมยังพัวพันกับคดีความหลายคดี
บทความวิกิของ United States Digital Service
จึงเหมือนมีร่องรอยของโค้ดที่นำกลับมาใช้จากแอปอื่นหลงเหลืออยู่
สงสัยว่าการใช้โดเมน .gov เพื่อ การโปรโมตเชิงพาณิชย์ ทำได้จริงหรือ
ถ้าเนื้อหาในบทความเป็นความจริง นี่คงเป็นเหตุการณ์ที่หมายถึง จุดจบเชิงสัญลักษณ์ของเสรีภาพ
ให้ความรู้สึกว่าคุณค่าที่อเมริกาเคยภูมิใจได้หายไปแล้ว
น่าตกใจที่แอปทางการของรัฐบาลจะ แทรก CSS และ JavaScript ลงในเว็บไซต์ของบุคคลที่สามเพื่อเอา cookie banner หรือ paywall ออก
ฉันคงไม่ติดตั้งแอปรัฐบาลแบบปิดซอร์ส แต่ในแง่ฟังก์ชันแล้วมันดูเป็นเรื่องดีคล้าย uBlock
เว็บไซต์ช้ามากจนแทบใช้งานไม่ได้
บน MacBook Pro ปี 2019 + Chrome ของฉัน การเลื่อนกระตุกหนักมาก
น่าขันที่บทความซึ่งวิจารณ์งานเว็บกลับมี ปัญหาประสิทธิภาพเว็บ แบบนี้เอง
คำวิจารณ์ว่าไม่มี certificate pinning ดูจะพูดเกินไปหน่อย
ต่อให้อยู่ในเครือข่ายที่ทำ MITM ได้ ถ้าอุปกรณ์ของฉันไม่เชื่อถือ CA นั้น ก็จะขึ้น TLS error อยู่ดี
เช่น อาจจินตนาการถึงกรณีดักทราฟฟิกในคาเฟ่ใกล้สถานทูตของบางประเทศที่การเฝ้าระวังเป็นเรื่องปกติ
เรื่องแบบนี้อาจไม่เกิดบ่อย แต่ก็ไม่ถึงกับเป็นไปไม่ได้เลย
เว็บไซต์นี้หนักจนเบราว์เซอร์ แทบค้าง
ฉันอ่านได้แบบพอไหวเฉพาะใน reader mode
ตอนแรกนึกว่าเป็นปัญหาที่แท็บเล็ตของตัวเอง แต่พอคนอื่นเจอด้วยก็น่าสนใจดี
ตอนเลื่อนหน้า GPU รับภาระหนักมาก ทำให้ การใช้ทรัพยากรกราฟิก สูง
ช่วงนี้ทำเนียบขาวดูเหมือนว่า การละเมิดกฎหมาย กลายเป็นเรื่องปกติไปแล้ว
ตั้งแต่แรกฉันก็ สมมติว่าเป็นมัลแวร์ และสุดท้ายก็เป็นอย่างที่คิด