𝗖𝗼𝗻𝗰𝘂𝗿𝗿𝗲𝗻𝘁 𝗟𝗼𝗴𝗶𝗻 𝗦𝗲𝗰𝘂𝗿𝗶𝘁𝘆
การเข้าสู่ระบบได้ไม่จำกัดจำนวนครั้งอาจซ่อนข้อบกพร่องร้ายแรงในตรรกะทางธุรกิจ (Business Logic)
ผู้ใช้เข้าสู่ระบบผ่านแล็ปท็อป ไม่กี่วินาทีต่อมา บัญชีเดียวกันก็เข้าสู่ระบบผ่านเบราว์เซอร์อื่น จากนั้นก็ผ่านอุปกรณ์มือถือ และตามด้วย API client ทุกอย่างทำงานได้อย่างสมบูรณ์แบบ
สิ่งนี้ดูเหมือนจะไม่มีปัญหาเพราะแอปพลิเคชันจำนวนมากรองรับหลายอุปกรณ์ แต่คุณต้องตั้งคำถามว่า: ทุกแอปพลิเคชันควรอนุญาตให้มีเซสชัน (session) ได้ไม่จำกัดหรือไม่?
ในบางระบบ การมีหลายเซสชันถือเป็นฟีเจอร์ แต่ในบางระบบ มันคือข้อบกพร่องที่ผู้โจมตีใช้เพื่อซ่อนตัว นี่คือช่องโหว่ทางตรรกะทางธุรกิจ (Business Logic Vulnerability) โค้ดทำงานตามที่ออกแบบไว้ แต่ตัวการออกแบบเองนั้นอ่อนแอ
ความแตกต่าง: • บั๊กทั่วไป (Traditional bugs) อาศัยความผิดพลาดในการเขียนโค้ด • บั๊กทางตรรกะทางธุรกิจ (Business logic bugs) อาศัยการตัดสินใจในการออกแบบ
ลองนึกถึงบริการสตรีมมิ่งภาพยนตร์ หากการสมัครสมาชิกหนึ่งครั้งอนุญาตให้คนสิบคนดูพร้อมกันได้ ระบบการเข้าสู่ระบบก็ทำงานได้ปกติ แต่กฎทางธุรกิจนั้นล้มเหลว
สิ่งนี้ใช้ได้กับระบบธนาคาร, แผงควบคุมผู้ดูแลระบบ (admin panels) และผลิตภัณฑ์ SaaS
วิธีทดสอบเรื่องนี้:
- เข้าสู่ระบบผ่านเบราว์เซอร์ A และเปิดค้างไว้
- เปิดหน้าต่างไม่ระบุตัวตน (incognito) ในเบราว์เซอร์ B
- เข้าสู่ระบบด้วยข้อมูลประจำตัว (credentials) เดียวกัน
- ตรวจสอบว่าเซสชันแรกยังคงใช้งานได้หรือไม่
- ตรวจสอบว่าคุณสามารถดำเนินการที่สำคัญ (sensitive actions) บนทั้งสองเซสชันได้หรือไม่
แอปพลิเคชันที่มีความปลอดภัยสูงมักจะบังคับใช้กฎเหล่านี้:
- หนึ่งบัญชีต่อหนึ่งเซสชันที่ใช้งานอยู่
- ออกจากระบบเซสชันเก่าเมื่อมีการเข้าสู่ระบบใหม่
- มีระบบควบคุมเพื่อจัดการอุปกรณ์
- มีการแจ้งเตือนเมื่อมีการเข้าสู่ระบบใหม่
หากผู้โจมตีขโมยข้อมูลประจำตัวไปได้ พวกเขาสามารถอยู่ในระบบได้ตลอดไปหากคุณอนุญาตให้มีเซสชันได้ไม่จำกัด พวกเขาจะยังคงใช้งานอยู่ได้ในขณะที่ผู้ใช้ตัวจริงก็ใช้งานอยู่เช่นกัน โดยที่ไม่มีใครสังเกตเห็นผู้บุกรุกเลย
บริบทคือทุกสิ่ง แอปที่ต้องการหลายเซสชัน:
- แอปส่งข้อความ
- โซเชียลมีเดีย
- บริการอีเมล
แอปที่ต้องการการควบคุมที่เข้มงวด:
- ระบบธนาคาร
- แดชบอร์ดผู้ดูแลระบบ
- แพลตฟอร์มด้านสุขภาพ
วิธีแก้ไข:
- เก็บ Session ID ที่ใช้งานอยู่ไว้ในฐานข้อมูล
- เมื่อมีการเข้าสู่ระบบใหม่ ให้ยกเลิกเซสชันเก่าทันที
- ให้ผู้ใช้สามารถดูอุปกรณ์และตำแหน่งที่ตั้งที่กำลังใช้งานอยู่ได้
- เพิ่มปุ่ม "ออกจากระบบจากทุกอุปกรณ์" (Log out from all devices)
- ส่งการแจ้งเตือนผ่านอีเมลหรือ SMS เมื่อมีการเข้าสู่ระบบใหม่
อย่ามองหาแค่บั๊กในโค้ดอย่าง SQL injection เท่านั้น แต่จงมองหาช่องว่างระหว่างสิ่งที่แอปของคุณทำ กับสิ่งที่ธุรกิจของคุณต้องการ
ตรวจสอบนโยบายเซสชันของคุณตั้งแต่วันนี้ ความเสี่ยงที่ใหญ่ที่สุดของคุณอาจไม่ใช่โค้ดที่พัง แต่อาจเป็นตรรกะที่พัง