- พบกรณีที่เว็บอินเทอร์เฟซของอุปกรณ์ NAS ภายในบ้าน ส่งชื่อโฮสต์ที่ใช้ภายในเท่านั้นออกไปยังบริการภายนอก
- สคริปต์รายงานข้อผิดพลาดของ sentry.io ที่รวมอยู่ในเว็บ UI ของ NAS ส่งชื่อโฮสต์ภายในออกไปพร้อมกับสแต็กเทรซ
- สังเกตพฤติกรรมแปลกที่ฝั่ง sentry.io พยายามเชื่อมต่อ TLS ย้อนกลับ ไปยังชื่อโฮสต์ดังกล่าว แต่ไม่ได้ส่งคำขอจริง
- ด้วยการตั้งค่าไวลด์การ์ด DNS ไว้ล่วงหน้า จึงสามารถ ตรวจจับการรั่วไหล ได้ และหากใช้ชื่อโฮสต์ที่มีข้อมูลอ่อนไหวก็มีความเสี่ยงต่อการเปิดเผยข้อมูลอย่างร้ายแรง
- หากนำกลไกนี้ไปใช้ในทางที่ผิด อาจกลายเป็นปัญหาความปลอดภัยที่สามารถ ชักนำให้สแกน DNS ไปยังโฮสต์ตามอำเภอใจ ได้
การติดตั้ง NAS และการตั้งค่าชื่อโฮสต์ภายใน
- ซื้ออุปกรณ์ NAS มา ติดตั้งไดรฟ์ และเชื่อมต่อเข้ากับเครือข่ายในบ้าน โดยใช้งานในโหมด HTTPS
- ติดตั้ง ใบรับรอง TLS แบบไวลด์การ์ด สำหรับซับโซนย่อยของโดเมนที่ไม่มีความหมายบนอินเทอร์เน็ตสาธารณะ (เช่น
*.nothing-special.whatever.example.com)
- เพิ่ม รายการเฉพาะในเครื่อง เช่น
172.16.12.34 nas.nothing-special.whatever.example.com ลงในไฟล์ /etc/hosts เพื่อเข้าถึงจากเบราว์เซอร์
การค้นพบการเข้าถึงจากภายนอกที่ไม่คาดคิด
- ไม่กี่วันหลังติดตั้ง NAS ก็เริ่มมี คำขอจากภายนอก ("outside world") เข้ามายังชื่อโฮสต์เดียวกัน
- ชื่อโฮสต์ดังกล่าวเป็น ชื่อที่ใช้ภายในเท่านั้นโดยสมบูรณ์ และมีอยู่แค่ในไฟล์
/etc/hosts ของแล็ปท็อป
- เนื่องจากได้ตั้งค่า รายการ DNS แบบไวลด์การ์ด สำหรับ
*.nothing-special.whatever.example.com ทั้งหมดให้ชี้ไปยังเครื่องที่ตนเองดูแลไว้ล่วงหน้า จึงสามารถตรวจจับการรั่วไหลได้
- ทุกครั้งที่โหลด NAS จะมี โฮสต์ GCP พยายามเชื่อมต่อโดยนำเสนอชื่อโฮสต์ภายในนั้นเป็น SNI
สาเหตุของการรั่วไหล: การรายงานข้อผิดพลาดของ sentry.io
- เว็บอินเทอร์เฟซของ NAS มี ฟังก์ชัน phone home รวมอยู่ และส่วนหนึ่งของมันคือการส่งสแต็กเทรซไปยัง sentry.io
- เมื่อเบราว์เซอร์ทำคอลแบ็กไปยัง sentry.io ก็จะ ส่งชื่อโฮสต์ ที่ใช้กับอุปกรณ์จัดเก็บข้อมูลภายในไปด้วย
- ยืนยันได้ว่าฝั่ง sentry.io สร้างการเชื่อมต่อ TLS ย้อนกลับ ไปยังชื่อโฮสต์นั้น แต่ไม่ได้ส่งคำขอ HTTP จริงเลยแม้แต่น้อย
นัยด้านความปลอดภัยและการรับมือ
- หากชื่อโฮสต์มีข้อมูลอ่อนไหวรวมอยู่ด้วย (เช่น
mycorp-and-othercorp-planned-merger-storage) ก็มีความเสี่ยงต่อ การรั่วไหลของข้อมูลอย่างร้ายแรง
- สามารถอาศัยกลไกรายงานของ sentry นี้เพื่อ ชักนำให้เกิดการสแกน DNS ไปยังโฮสต์ภายนอกตามอำเภอใจ ได้ (วิธีการแบบเจาะจงขอปล่อยให้ผู้อ่านคิดต่อเอง)
- มาตรการรับมือคือเปิดใช้ Little Snitch และบล็อกทั้งโดเมนดังกล่าวสำหรับทุกแอป
1 ความคิดเห็น
ความเห็นใน Hacker News
ดูเหมือนว่าหลายคนกำลังเข้าใจผิด ประเด็นนี้ไม่ใช่ปัญหาของ CT log แต่เกี่ยวกับ wildcard certificate
Sentry เก็บ client-side trace แล้วดึง hostname ที่ส่งคำขอออกมา จากนั้นพยายาม poll กลับไปที่ hostname นั้นแต่ถูกปฏิเสธ
โดยพื้นฐานแล้ว hostname ไม่ใช่ข้อมูลส่วนตัว
มันสามารถรั่วออกไปภายนอกได้จากหลายทาง เช่น DNS query หรือ TLS certificate
ถ้าจะซ่อนบริการภายใน ควรใส่ความลับไว้ใน URL path แทน hostname จะดีกว่า
ตัวอย่างเช่น
fileservice.example.com/my-hidden-service-007-abc123/แบบนี้จะถูกส่งผ่าน HTTPS เท่านั้น จึงมีโอกาสรั่วน้อยกว่ามากมีคนสงสัยว่า “clown GCP Host” เป็นคำเทคนิคหรือเปล่า สุดท้ายพบว่าเป็นคำที่ผู้เขียนใช้ ล้อเลียน cloud
ประเด็นสำคัญคือเว็บอินเทอร์เฟซของ NAS ส่งล็อกไปยัง Sentry พร้อมแนบ internal hostname ไปด้วย
ถ้าเป็นฉัน คงเปลี่ยนไปใช้ โอเพนซอร์ส OS ที่เชื่อถือได้ หรือไม่ก็ใช้ DNS block อย่าง PiHole เพื่อกันไม่ให้เรียกหา Sentry
บางคนอธิบายว่าตัวเองใช้ local DNS กับ TLS proxy เพื่อปิดกั้นทราฟฟิกขาออกทั้งหมด
เพราะกรณีแบบนี้ ฉันเลยมองว่า uBlock Origin คือมาตรฐานขั้นต่ำของความปลอดภัยบนเว็บ
ตอนนี้เว็บส่วนใหญ่โหลด third-party script กันเยอะเกินไปจนข้อมูลรั่วกันหนักมาก
มันไม่ใช่ทางแก้ที่ราก แต่ก็เป็นสิ่งที่ดีที่สุดที่เราพอทำได้ตอนนี้
ถ้าจะป้องกันปัญหาแบบนี้ ควรวาง Nginx reverse proxy ไว้ด้านหน้าแล้ว inject CSP header
วิธีนี้อาจหยุดไม่ให้ NAS ส่งคำขอออกไปภายนอกเองไม่ได้ แต่สามารถบล็อกไม่ให้เบราว์เซอร์เป็นคนส่งแทนได้
ตัวอย่างเช่นคำขอ avatar ของ Steam (
https://avatars.steamstatic.com/HASH_medium.jpg) ก็สามารถบล็อกได้ด้วยนโยบาย CSPถ้าจำเป็นก็เปิดไว้แค่บางส่วนได้ และยังสามารถเพิ่ม Referrer-Policy: no-referrer เพื่อไม่ให้ hostname ไปโผล่ในล็อกภายนอก
ฉันเคยซื้อ Synology NAS แล้วเสียใจหลายครั้ง
แทบทำอะไรได้น้อยมากนอกจากใช้ซอฟต์แวร์จากคอมมูนิตี้
การตั้งค่า SSL ด้วย Let's Encrypt ก็ยุ่งยาก และ path ก็ไม่เป็นมาตรฐานจนหาตำแหน่ง config ได้ยาก
ทั้ง rsync เวอร์ชันเก่า ยูทิลิตีพื้นฐานที่ขาด ๆ หาย ๆ และเรื่องอื่นอีกมาก ทำให้รู้สึกว่าน่าจะไปใช้ NAS ที่อยู่บน Linux หรือ BSD ดีกว่า
ไม่นานมานี้ฉันเพิ่งลองตั้งค่า Sentry และพบว่าระบบนี้มีฟีเจอร์ที่พยายาม ตั้งค่า uptime monitoring อัตโนมัติ
ถ้ามันรู้จักโฮสต์ มันจะส่ง ping เป็นระยะ ๆ และถ้าตอบสนองได้เสถียรอยู่หลายวัน ก็จะแจ้งเตือนว่า “ต้องการตั้งค่า uptime monitoring ให้โฮสต์นี้ไหม?”
ส่วนตัวฉัน บล็อกทุกโดเมนที่เกี่ยวกับ Sentry ไปเลย
มันอาจไม่ใช่วิธีแก้ทั่วไป แต่ในสภาพแวดล้อมของฉัน นั่นคือทางเลือกที่ดีที่สุด
มักจะเห็น reverse lookup server พยายาม resolve แม้กระทั่งที่อยู่เครือข่ายภายในอย่าง ULA หรือ RFC1918
ถ้านำข้อมูลพวกนี้ไปรวมกับข้อมูลอื่น ก็อาจใช้อนุมานสถานะภายในได้
ยังมีคนบอกด้วยว่า “ตอนเก็บข้อมูล Darknet เคยจับ UDP audio ได้ด้วย”
เมื่อก่อนฉันเคยสืบกรณีคล้ายกันบน Heroku
เวลาสร้างแอปใหม่ ระบบจะให้ random subdomain มา และถึงจะยังไม่ได้ทำ DNS lookup ก็จะมี คำขอจาก vulnerability scanner เข้ามาทันที
พอไปถาม Heroku ก็ได้คำตอบว่าเป็นเพราะ URL ของแอปใหม่ถูกเปิดเผยใน Certificate Transparency (CT) log
พร้อมแชร์ลิงก์ How Certificate Transparency Works