- ในบางชุดค่าผสมของแอปและสถานะบน Android DNS query อาจออกไปนอก VPN tunnel ได้ และ Mullvad มองว่าสาเหตุคือบั๊กของ Android OS มากกว่าตัวแอป VPN
- การรั่วอาจเกิดขึ้นได้ในช่วงเปลี่ยนผ่านสั้น ๆ เช่นตอนที่เปิด VPN อยู่แต่ เซิร์ฟเวอร์ DNS ยังว่างเปล่า, ระหว่างการ reconfigure tunnel, หรือเมื่อแอป VPN ถูกบังคับปิดหรือ crash
- ผลกระทบดูจะกระจุกอยู่กับแอปที่เรียก
getaddrinfoโดยตรง ส่วนแอปที่ใช้เฉพาะ Android API อย่าง DnsResolver ไม่พบการรั่ว - แม้จะเปิด Always-on VPN และ “Block connections without VPN” ก็ยังป้องกันปัญหานี้ได้ไม่หมด และมีการยืนยันในหลายเวอร์ชันรวมถึง Android 14
- Mullvad จะบรรเทาบางกรณีชั่วคราวด้วยการตั้งค่าเซิร์ฟเวอร์ DNS ปลอม แต่การรั่วระหว่าง reconnect ยังยากจะปิดกั้นได้ทั้งหมดหากไม่มีการแก้ไขที่ระดับ OS
เงื่อนไขที่ทำให้เกิด DNS leak บน Android
- Mullvad ยืนยันจากรายงานของผู้ใช้ Reddit เมื่อวันที่ 22 เมษายนว่า เมื่อเปิด “Block connections without VPN” ไว้ การปิดแล้วเปิด VPN ใหม่อาจทำให้เกิด DNS leak ได้
- จากการตรวจสอบภายใน พบสถานการณ์เพิ่มเติมที่ Android OS อาจส่งทราฟฟิก DNS ออกนอก VPN
- VPN ทำงานอยู่แต่ ยังไม่ได้กำหนดค่าเซิร์ฟเวอร์ DNS
- ระหว่างที่แอป VPN กำลัง reconfigure tunnel
- ช่วงเวลาสั้น ๆ ที่แอป VPN ถูกบังคับปิดหรือ crash
- พฤติกรรมนี้ไม่ใช่สิ่งที่ Android OS ควรทำตามที่คาดหวังไว้ และต้องแก้ที่ระดับ OS ชั้นบน
แอปที่ได้รับผลกระทบและเส้นทางการ resolve ชื่อ
- การรั่วดูจะเกิดในแอปที่เรียกใช้ C function
getaddrinfoโดยตรงเพื่อ resolve ชื่อโดเมน - ไม่พบการรั่วในแอปที่ใช้เฉพาะ Android API DnsResolver
- เบราว์เซอร์ Chrome เป็นตัวอย่างของแอปที่อาจใช้
getaddrinfoโดยตรง- ตำแหน่งโค้ดที่เกี่ยวข้องใน Chromium ก็เปิดเผยอยู่แล้ว
- การใช้
getaddrinfoเองไม่ใช่เรื่องผิด และหากต้องการปกป้องผู้ใช้ Android ทุกคน ก็จำเป็นต้องมี วิธีแก้ที่ระดับ OS
ข้อจำกัดของ Always-on VPN และการตั้งค่าบล็อก
- การรั่วที่ยืนยันแล้วเกิดขึ้นได้ไม่ว่าจะเปิด Always-on VPN และ “Block connections without VPN” หรือไม่ก็ตาม
- แม้เมื่อเปิด “Block connections without VPN” ทราฟฟิกที่ออกนอกอุปกรณ์ควรมีเพียงทราฟฟิก WireGuard ที่เข้ารหัสเท่านั้น แต่ในการทดสอบกลับสังเกตเห็น DNS แบบ plaintext ที่เราเตอร์
- Mullvad ประเมินว่าการตั้งค่านี้ยังไม่เป็นไปตามชื่อหรือพฤติกรรมที่มีการอธิบายไว้ในเอกสาร และมีข้อบกพร่องหลายอย่าง
- ทราฟฟิก DNS อาจรั่วได้ภายใต้เงื่อนไขข้างต้น
- ทราฟฟิกตรวจสอบการเชื่อมต่อที่เคยรายงานก่อนหน้านี้ก็ยังคงรั่ว
การบรรเทาชั่วคราวในแอป Mullvad และปัญหาที่ยังเหลือ
- ปัจจุบันแอป Mullvad จะไม่ตั้งค่าเซิร์ฟเวอร์ DNS ในสถานะบล็อก
- หากการตั้งค่า tunnel ล้มเหลวในลักษณะที่กู้คืนไม่ได้ แอปจะเข้าสู่ สถานะบล็อก
- ในสถานะนี้จะกันไม่ให้ทราฟฟิกออกนอกอุปกรณ์ แต่เมื่อไม่มีเซิร์ฟเวอร์ DNS ก็อาจเกิดเงื่อนไขที่ทำให้รั่วได้
- เพื่อหลบเลี่ยงบั๊กของ OS ชั่วคราว Mullvad วางแผนจะตอบสนองด้วยการตั้งค่า เซิร์ฟเวอร์ DNS ปลอม ไปก่อน และคาดว่าจะออกรุ่นที่มีการแก้ไขนี้ในเร็ว ๆ นี้
- การรั่วที่เกิดระหว่างการ reconnect tunnel บรรเทาจากฝั่งแอปได้ยากกว่า
- Mullvad กำลังหาทางแก้
- อาจลดจำนวนครั้งของการ reconfigure tunnel ได้ แต่ตอนนี้ยังไม่มองว่าสามารถป้องกันการรั่วนี้ได้อย่างสมบูรณ์
- Mullvad ได้รายงานปัญหาและข้อเสนอเพื่อการปรับปรุงไปยัง Google
สิ่งที่สังเกตได้จากการทดสอบซ้ำด้วย WireGuard และ Chrome
- กรณีที่สองซึ่งเป็นการรั่วระหว่างการเปลี่ยนการตั้งค่า VPN tunnel สามารถทดสอบซ้ำได้ด้วยแอป WireGuard และ Chrome
- WireGuard ถูกใช้เป็นกรณีอ้างอิงของการทำ VPN บน Android
- Mullvad มองว่ามีความเป็นไปได้ที่จะทดสอบซ้ำได้ในแอป VPN อื่นบน Android ด้วย
- Chrome ถูกใช้เป็นตัวกระตุ้นการรั่ว เพราะเป็นแอปที่ยืนยันแล้วว่าใช้
getaddrinfo
- ขั้นตอนการทดสอบซ้ำประกอบด้วยองค์ประกอบต่อไปนี้
- ดาวน์โหลด spam_get_requests.html
- ติดตั้งแอป WireGuard และ Chrome
- import wg1.conf, wg2.conf เข้าไปใน WireGuard
- เปิดใช้ tunnel wg1 ใน WireGuard และอนุญาตสิทธิ์ VPN
- ในการตั้งค่า VPN ของ Android ให้เปิด Always-on VPN และ “Block connections without VPN” สำหรับ WireGuard
- เริ่มจับแพ็กเก็ตที่เราเตอร์ด้วย
tcpdump -i <INTERFACE> host <IP of android device> - เปิด WireGuard กับ Chrome แบบ split screen, รัน
spam_get_requests.htmlใน Chrome แล้วสลับระหว่าง wg1 และ wg2 ใน WireGuard
- ที่เราเตอร์สามารถสังเกตเห็น A record query และการตอบกลับ NXDomain ที่มุ่งไปยังพอร์ต 53 ของเราเตอร์ OpenWrt จากอุปกรณ์ Android
- DNS leak สามารถถูกใช้เพื่อระบุตำแหน่งโดยประมาณของผู้ใช้หรือเว็บไซต์และบริการที่เข้าใช้งานได้ จึงอาจมี ผลกระทบด้านความเป็นส่วนตัว สูง
- ขึ้นอยู่กับ threat model การใช้งานที่อ่อนไหวอาจควรหลีกเลี่ยง Android หรือใช้มาตรการบรรเทาอื่นเพื่อป้องกันการรั่ว
- ผู้ใช้แอป Mullvad ควรอัปเดตแอปให้เป็นเวอร์ชันล่าสุด เพราะอาจมีการบรรเทาบางส่วนรวมอยู่
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
แม้จะไม่ได้ใช้ Mullvad แต่ก็ทำให้รู้สึกนับถือจริง ๆ ข้อมูลมีความหนาแน่นสูงและจัดเรียงอย่างดี ตั้งแต่ คำอธิบายปัญหา, วิธีเลี่ยงชั่วคราว, วิธีเลี่ยงที่คนอื่นอาจใช้ได้ ไปจนถึงส่วนที่ Android ควรแก้ไข
ข้อเสียคือในกรณีของผม เวลา ping สูงกว่า quad9 หรือ cloudflare ค่อนข้างมาก
ผมเขียนวิธีบล็อกโฆษณาระดับ DNS และข้อมูลเกี่ยวกับ cloudflare ไว้ในเธรดนี้: https://news.ycombinator.com/item?id=40056162
พวกเขาแก้ปัญหาการชำระเงินได้รวดเร็ว และเรื่อง iptables ก็ได้รับคำตอบละเอียดพร้อมข้อดีข้อเสียของหลายวิธี พูดสั้น ๆ คือยอดเยี่ยม
ผมเป็นนักพัฒนา rethinkdns
สำหรับประโยคที่ว่า “ปัญหาเหล่านี้ต้องแก้ใน OS เพื่อปกป้องผู้ใช้ Android ทุกคน ไม่ว่าจะใช้แอปอะไร” นั้น ระบบเครือข่ายแบบหวาดระแวง ของ Android มีข้อยกเว้นให้แอประบบและแอปจาก OEM มาโดยตลอด นั่นรวมถึงแอปของ Google ด้วย
การแก้บั๊กเหล่านี้ส่วนใหญ่ก็น่าจะไม่เปลี่ยนสมมติฐานหลักนั้น ดูโค้ดที่เกี่ยวข้องได้ที่: https://github.com/celzero/rethink-app/issues/224
ส่วนประโยคที่ว่า “การรั่วไหลระหว่างการเชื่อมต่ออุโมงค์ใหม่บรรเทาในแอปได้ยากกว่า เรายังหาทางแก้กันอยู่” นั้น Android รองรับ การสลับแบบไร้รอยต่อ ระหว่างอุปกรณ์ TUN สองตัวระหว่างการกำหนดค่าใหม่ ทำให้ถูกต้องนั้นยุ่งยาก แต่ทำได้
นี่เป็นปัญหาที่มีมานานแล้วบน Android ต่อให้คุณอยากบังคับให้ใช้เฉพาะเซิร์ฟเวอร์ DNS ภายใน Android ก็จะสลับไปใช้เซลลูลาร์แล้วใช้ DNS นั้น หากมันตัดสินว่าจำเป็นหรืออยากใช้
เมื่อเร็ว ๆ นี้ผมเฝ้าดู adb debug เพื่อดูว่าการเชื่อมต่อไร้สายหลุดทำไม/เมื่อไร สุดท้ายถ้ามันไม่เห็นหรือแปลผลอะไรบางอย่างในกระบวนการตรวจสอบการมีชีวิตอยู่ มันก็จะเปิดข้อมูลเซลลูลาร์แล้วลอง
มันน่าหงุดหงิดเป็นพิเศษเวลาใช้ DNS record ที่มีอยู่เฉพาะภายใน โทรศัพท์กลับทำงานตามอำเภอใจไม่ได้ ทั้งที่อุปกรณ์เชื่อมกับ Wi‑Fi ที่ให้เซิร์ฟเวอร์ DNS ภายในซึ่งมี record นั้นอยู่ แต่ด้วยเหตุผลบางอย่างของ Android กลับไป resolve จากภายนอก
ไม่รู้ว่า Apple เป็นยังไง แต่จากที่โดยพื้นฐานแล้วพวกเขาพยายามพร็อกซีแม้กระทั่ง DNS ผ่าน DoH ด้วย “privacy” VPN ของตัวเอง ก็ยากจะจินตนาการได้ว่าจะดีกว่าเมื่อใช้สิ่งที่ถือเป็นผลิตภัณฑ์คู่แข่ง และเราก็รู้ว่า Apple ปฏิบัติต่อผลิตภัณฑ์แบบนั้นอย่างไร
ตัวอย่างจริงดูได้จากตัวบล็อกโฆษณาทั้งระบบนี้: https://myxxdev.github.io/depictions/MYbloXXforiOS/MYbloXXfo...
ปัญหาเดียวที่ผมเจอคือ แม้อุปกรณ์จะเชื่อมต่อกับ AP ไร้สายที่ทำงานปกติ แต่มันกลับแสดงว่าไม่มีอินเทอร์เน็ต จริง ๆ แล้วใช้งานได้ แต่ดูเหมือนมันตรวจสอบว่าอินเทอร์เน็ตใช้งานได้หรือไม่ด้วยเซิร์ฟเวอร์ Google เพื่อจุดประสงค์ของไอคอนแถบสถานะและโค้ดระบบภายในอื่น ๆ
ถ้าให้ความสำคัญกับความเป็นส่วนตัว ก็ควรอยู่ห่างจาก Android และอาจต้องระวังเทคโนโลยีโดยรวมด้วย
เมื่อหลายปีก่อนตอนทดสอบคอนฟิก VPN หลายแบบสำหรับโปรเจกต์ ผมมักวาง อุปกรณ์ไฟร์วอลล์ MikroTik ไว้ระหว่างคอมพิวเตอร์กับเราเตอร์หลัก จุดประสงค์มีแค่บล็อกทราฟฟิกทั้งหมดที่ปลายทางไม่ใช่ IP address ของเซิร์ฟเวอร์ VPN ที่ PC จะเชื่อมต่อไป
วิธีนี้ทำงานได้ดีมากในการรับประกันว่าไม่มีทราฟฟิกรั่วออกนอกเส้นทางจาก PC ไปยังเซิร์ฟเวอร์ VPN ส่วน IP address ของเซิร์ฟเวอร์ VPN ที่ใช้ก็แทบไม่เปลี่ยน และถ้าเปลี่ยนก็แก้ในไฟร์วอลล์ MikroTik ได้ง่าย
ถ้าไม่รู้ IP ของเซิร์ฟเวอร์หรือมันเปลี่ยนไป ก็มีวิธีบล็อกทราฟฟิกทั้งหมดที่ไม่ใช่คู่พอร์ต/โปรโตคอลที่เซิร์ฟเวอร์ VPN ใช้ เช่น ทิ้งทราฟฟิกที่ปลายทางไม่ใช่ UDP 1194 ตามชนิดของ VPN
เราเตอร์ MikroTik ยังมีเครื่องมือเล็ก ๆ ชื่อ torch สำหรับดูทราฟฟิกได้อย่างรวดเร็วและง่ายดาย และรองรับการจับแพ็กเก็ตด้วย ราคามีตั้งแต่ 30 ดอลลาร์ถึง 3000 ดอลลาร์ ไม่มีไลเซนส์ซอฟต์แวร์ และถ้ารู้วิธีใช้ก็ทรงพลังและมีความสามารถมาก
ถ้าพูดอย่างเคร่งครัด slug ของจริงคือไฟร์วอลล์เลเยอร์ 2 แบบโปร่งใสที่ไม่มี IP address ถูกกำหนดไว้ แต่ในที่นี้ไม่จำเป็นต้องลงรายละเอียดนั้น
https://john.kozubik.com/pub/NetworkSlug/tip.html
การกรองขาออก ตามที่อยู่ต้นทาง/ปลายทางและพอร์ต เป็นแนวคิดพื้นฐานของไฟร์วอลล์และเป็นการตั้งค่ามาตรฐานของทุกแพลตฟอร์มไฟร์วอลล์-เราเตอร์ การทำ policy-based routing ที่กรองตามเกตเวย์ก็อยู่ในบริบทเดียวกัน: https://en.wikipedia.org/wiki/Policy-based_routing
โดยทั่วไปแล้ว มีแค่ผลิตภัณฑ์สำหรับผู้บริโภคหรือกึ่งมืออาชีพเท่านั้นที่ตั้งค่าเริ่มต้นให้อนุญาตทราฟฟิกขาออกทั้งหมด อยากรู้ว่าในคอนฟิกนี้ “เราเตอร์หลัก” คืออะไร เป็นอุปกรณ์ที่ ISP ให้มาหรือเปล่า?
ถ้าเราแทรกไฟร์วอลล์ไว้ระหว่างแอปมือถือกับโมเด็มได้ก็คงดี
ปัญหา DNS ของ Android อยู่ที่แพลตฟอร์มนี้ไม่สามารถตั้งค่า เซิร์ฟเวอร์ IPv6 DNS เองได้ ทุกครั้งที่มีอะไรเปลี่ยนแปลงกับ Wi‑Fi มันก็จะเปลี่ยนไป
แม้แต่ Android ที่รูทแล้ว ก็ไม่มีแอปที่ทำให้ระบบปฏิบัติการเปลี่ยนมันไม่ได้
ถ้าใช้เราเตอร์ที่แจกจ่ายที่อยู่ IPv6 ตลอดเวลาและทำให้ปิดไม่ได้ ก็เท่ากับติดอยู่ตรงนั้น
ก็ไม่รู้เหมือนกันว่าจะติดตั้งอุปกรณ์ไฟร์วอลล์ไว้หลังเราเตอร์นั้น แล้วลบเซิร์ฟเวอร์ IPv6 DNS ที่เราเตอร์โฆษณาออกได้หรือไม่
ถ้ากังวลเรื่อง DNS request รั่วไหล ยังไงก็ควรใช้ DoT หรือ DoH อยู่แล้ว
อยากรู้ว่า Wi‑Fi tethering ก็เกิดแบบเดียวกันไหม ถ้าใช้ VPN บนแล็ปท็อปที่เชื่อมต่อผ่าน Wi‑Fi ของโทรศัพท์ จะรั่วด้วยวิธีเดียวกันหรือเปล่า?
คอนฟิกที่ปลอดภัยที่สุดน่าจะเป็นการปิด mobile data ของโทรศัพท์ แล้วพก ฮอตสปอต OpenWRT ที่จัดการ VPN อยู่เหนือโทรศัพท์ไปด้วย
“VPN ที่เปิดตลอดเวลา” ตั้งค่าได้เฉพาะบนอุปกรณ์ที่อยู่ในสถานะ “supervised” ผ่านโซลูชัน MDM ขององค์กรที่ Apple อนุมัติเท่านั้น ต้องมีการยื่นคำขอเป็นเอกสารและคุยโทรศัพท์กับพนักงานปัจจุบัน
ไม่อย่างนั้นก็ต้องใช้แอป Apple Configurator บน Mac เท่านั้น ถึงจะสร้างโปรไฟล์การตั้งค่าที่มีคีย์ “always-on VPN” ได้
การแจ้งเตือนก็มักล่าช้าด้วย
ถ้าไม่ใช่เครือข่ายของฉันเอง ก็ไม่ควรเชื่อมต่อโดยตรงโดยไม่มี เราเตอร์มือถือ
The Grugq เคยทำเครื่องมือสำหรับจุดประสงค์นี้ไว้เมื่อ 10 ปีก่อน ตอนนี้น่าเสียดายที่ไม่ได้มีการดูแลต่อแล้ว: https://github.com/grugq/portal
มันเป็นส่วนหนึ่งของงานนำเสนอเรื่องความปลอดภัยเชิงปฏิบัติการสำหรับแฮกเกอร์ และถ้าสนใจกรณีของแฮกเกอร์หลายคนที่มีชื่อเสียงหรือฉาวโฉ่ ซึ่งคิดว่าตัวเองปลอดภัยแต่สุดท้ายก็ถูกจับ ก็ควรดู: https://www.youtube.com/watch?v=9XaYdCdwiWU
ระบบที่ไม่มี สิทธิ์เข้าถึง root โดยนิยามแล้วไม่ปลอดภัย Android กับ iOS นี่น่าขำมาก
น่าเสียดายแทนเด็ก ๆ ที่เติบโตมา หรือกำลังจะเติบโตมา โดยมี “คอมพิวเตอร์” หลักเป็นอุปกรณ์ที่ออกแบบมาเพื่อการบริโภคสื่อและการเก็บข้อมูลส่วนตัวเป็นหลัก
https://en.wikipedia.org/wiki/PinePhone_Pro
ถ้าคุณเอาสำเนา SSH private key ของฉันจากอุปกรณ์พวกนั้นมาได้ ผมจะให้เงินสด 100,000 ดอลลาร์โดยไม่ถามอะไรสักคำ
นิยามนั้นไม่มีความหมาย และไม่เป็นประโยชน์ต่อการให้เหตุผลหรือการสื่อสารเลย
“บล็อกการเชื่อมต่อเมื่อไม่มี VPN” กำลังพิสูจน์ตัวเองว่าเชื่อถือไม่ได้พอ ๆ กับความยับยั้งชั่งใจของฉันตอนอยู่หน้าบุฟเฟต์ ถ้าผมไม่ได้เข้าใจผิด DNS leak แบบนี้สามารถเปิดเผยทั้งเว็บไซต์ที่เข้าชมและตำแหน่งได้ไม่น้อย จนทำลายวัตถุประสงค์ของ VPN ไปเลย
Android อาจปล่อยข้อมูล DNS รั่วแม้เปิด VPN อยู่ ดังนั้นถ้าใส่ใจความเป็นส่วนตัวจริง ๆ ก็ควรคิดไกลกว่าการใช้ Android เอง หรือย้ายงานที่อ่อนไหวออกจากโทรศัพท์จะดีกว่า
บางครั้งก็อดสงสัยไม่ได้ว่า “บั๊ก” แบบนี้ถูกวางไว้ตั้งใจอย่างเหมาะเจาะหรือเปล่า โดยเฉพาะเมื่อบริษัทเทคโนโลยียักษ์ใหญ่เคยร่วมมือกับหน่วยงานข่าวกรองหลายแห่ง
นี่ก็ไม่ใช่ครั้งแรกที่ได้ยินบั๊กประเภทนี้บน Android ดังนั้นตอนนี้ยากจะเชื่อแล้วว่าบั๊กมากขนาดนี้ถูกใส่เข้ามา “โดยไม่ตั้งใจ”
ตั้งแต่ก่อนหน้านี้ก็สงสัยอยู่พอสมควรว่ามันน่าจะเป็นแบบนี้ แม้เปิด VPN บน Android แล้ว MMS และ Visual Voicemail ก็ยังทำงานอยู่
ทั้งสองอย่างอาจต้องมีการเข้าถึงเครือข่ายมือถือโดยตรง หรือไม่อย่างนั้นก็ถูกปฏิเสธได้ บางครั้งต้องอยู่บนเครือข่ายมือถือเท่านั้น หรือถ้าคำขอไม่ได้มาจากภายในเครือข่ายมือถือก็จะถูกปฏิเสธ สงสัยว่า VoLTE ก็น่าจะเหมือนกัน ถ้ามี VPN ฟีเจอร์พวกนี้อาจรวนได้
บน Mobile Linux จะรู้ได้เพราะพอเปิด VPN แล้วฟีเจอร์เหล่านี้พังทั้งหมด
ดูเหมือนไม่มีวิธีแก้ที่ชัดเจนบน Android โดยไม่ทำให้ฟีเจอร์ที่ผู้ใช้คาดหวังเสียหายไปมาก
ผมเคยต้องต่อสู้กับทีมซัพพอร์ตขั้นสูงของ AT&T เรื่องปัญหา VVS บน iOS ที่เปิด VPN อยู่ จึงยืนยันได้ว่าปัญหานี้ไม่ได้จำกัดอยู่แค่ Android
bearer ที่ต่างกันอาจมีลำดับความสำคัญ/QCI ที่ต่างกัน หรือก็คือคุณภาพบริการที่ต่างกันได้ ในเครือข่าย LTE ที่แออัด VoLTE ควรให้ประสบการณ์ที่ดีกว่า VOIP บน bearer ที่มีลำดับความสำคัญต่ำ