- Salt Labs ค้นพบว่าสามารถยึดบัญชีผู้ใช้ได้ผ่านช่องโหว่ในการติดตั้งใช้งาน OAuth ของบริการขนาดใหญ่มากที่มีผู้ใช้หลายร้อยล้านคนอย่าง Booking.com, Grammarly, Vidio, Bukalapak และเฟรมเวิร์กมือถืออย่าง Expo
- OAuth เป็นโปรโตคอลที่ปลอดภัยโดยพื้นฐาน แต่ชี้ให้เห็นว่าหากนำไปติดตั้งใช้งานไม่เหมาะสมก็อาจก่อให้เกิดช่องโหว่ร้ายแรงได้
- Booking.com
- ในการติดตั้งใช้งาน Facebook OAuth มีปัญหาที่สามารถเปลี่ยน
redirect_uri ไปเป็นพาธอื่นบนโฮสต์เดียวกันได้
- ภายใน booking.com มี endpoint ที่จะรีไดเรกต์ไปยังที่อยู่ดังกล่าว หากส่งที่อยู่ในรูปแบบ base64 ให้
- เมื่อนำสองสิ่งนี้มารวมกัน จึงสามารถดัดแปลงให้โทเค็นของ OAuth ถูกส่งต่อไปยังที่อยู่อื่นได้
- ในเวอร์ชันเว็บไม่มีช่องโหว่นี้ เพราะมีการตรวจสอบ
redirect_uri ระหว่างกระบวนการล็อกอิน แต่ในเวอร์ชันมือถือมีปัญหาที่ทำให้สามารถดัดแปลง redirect_uri ได้ด้วย จึงยึดบัญชีได้
- กล่าวคือ เป็นช่องโหว่ที่ผู้ใช้เพียงคลิกลิงก์ที่ดูถูกต้องตามปกติมาก ๆ และดำเนินการ OAuth ตามปกติ บัญชีก็อาจถูกยึดได้
- Expo
- เป็นช่องโหว่ที่พบในระบบติดตั้งใช้งาน OAuth แบบฝังตัวของ Expo ซึ่งเป็นเฟรมเวิร์กมือถือ
- ในการติดตั้งใช้งานดังกล่าว
returnUrl จะใส่ลิงก์เฉพาะของแอป Expo อย่าง exp://~~ แต่มีปัญหาที่สามารถใส่ที่อยู่เว็บอย่าง hTTps://~~ ได้
- แม้จะมีการป้องกันไม่ให้ป้อน
https:// โดยตรง แต่สามารถหลบเลี่ยงได้เพียงเปลี่ยนตัวพิมพ์เล็ก-ใหญ่
- จากนั้นข้อมูล
returnUrl จะถูกเก็บไว้ในคุกกี้ชื่อ RU และเมื่อ OAuth เสร็จสิ้น เซิร์ฟเวอร์ OAuth ของ Expo จะอ่านคุกกี้นั้นแล้วรีไดเรกต์
- อย่างไรก็ตาม ก่อนจะเปลี่ยนจาก Expo ไปยัง Facebook จะมีข้อความเตือนว่า
https://~~ 를 신뢰하는 경우... และผู้ใช้ต้องกดยอมรับ
- เพื่อหลบเลี่ยง จึงใช้วิธีเปิดลิงก์ 2 ลิงก์โดยอัตโนมัติ
- เปิดลิงก์แรกแล้วปิดทันที เพื่อให้ตั้งค่าเฉพาะคุกกี้ RU
- ลิงก์ที่สองให้ลิงก์ Facebook OAuth โดยตรง เพื่อข้ามข้อความเตือน RU
- ด้วยวิธีนี้จึงสามารถยึดบัญชีของ Codecademy.com ได้สำเร็จ
- ช่องโหว่นี้ได้รับรหัส CVE-2023-28131 และทีม Expo ได้แก้ไขปัญหานี้ภายในไม่กี่ชั่วโมงหลังได้รับการแจ้งครั้งแรก
- Grammarly, Vidio, Bukalapak
- ทั้ง 3 เว็บไซต์สามารถถูกยึดบัญชีได้ด้วยวิธีเดียวกันทั้งหมด
- ขั้นแรก สร้างเว็บไซต์ที่ดูถูกต้องตามกฎหมายขึ้นมาเพื่อเก็บ Facebook login token
- จากนั้นสำหรับ Vidio และ Bukalapak หากส่งโทเค็นที่ Facebook ออกให้มาให้ (ซึ่งถูกสร้างสำหรับเว็บไซต์อื่น) ก็จะล็อกอินสำเร็จทันที
- เป็นช่องโหว่ที่เกิดจากการไม่ตรวจสอบ App ID ของ Facebook token (การโจมตีแบบ token reuse)
- Grammarly แตกต่างออกไปเล็กน้อย เพราะใช้โค้ดแทนโทเค็น จึงไม่มีช่องโหว่ข้างต้น
- แต่พบว่าหากส่งโทเค็นไปยัง API ที่ส่งโค้ด โดยใช้ชื่อ
"access_token" แทน "code" ก็สามารถล็อกอินได้
- ดังนั้นทั้ง 3 เว็บไซต์จึงอาจถูกยึดบัญชีได้ทันที เพียงแค่ทำการเชื่อมต่อ Facebook ผ่านเว็บไซต์อื่นที่ถูกต้องตามกฎหมาย
- เมื่อติดตั้งใช้งาน OAuth จำเป็นต้องตรวจสอบจุดที่อาจเกิดช่องโหว่ด้านความปลอดภัย และเพื่อป้องกันช่องโหว่ ควรมีการตรวจสอบอย่างละเอียดในทุกขั้นตอนของกระบวนการ
3 ความคิดเห็น
ชวนให้ตระหนักจริง ๆ ครับ/ค่ะ ต้องระวังให้มากจริง ๆ
มีเว็บไซต์ขนาดใหญ่มาก ๆ จำนวนไม่น้อยที่มีช่องโหว่อยู่ มากกว่าที่คิดไว้เสียอีก
ดูแล้วน่าจะเป็นฟีเจอร์ที่ต้องใช้งานอย่างระมัดระวังแน่นอน
ก็ทำให้นึกว่าควรใช้ไลบรารีสำหรับยืนยันตัวตน...
แต่พอดูกรณีของ Expo แล้ว ก็รู้สึกว่าส่วนนี้เองก็จำเป็นต้องตรวจสอบด้วยตัวเองเหมือนกันครับ