
ตั้งรหัสผ่านยาวไป ใช่ว่าปลอดภัยเสมอไป: บทเรียนจากช่องโหว่ที่ไม่คาดคิด
ในโลกของการรักษาความปลอดภัยทางไซเบอร์ ไม่มีอะไรที่เรียบง่ายอย่างที่เห็น บางครั้งการตัดสินใจที่ดูเหมือนสมเหตุสมผลสองครั้ง อาจนำไปสู่ช่องโหว่ร้ายแรงที่ไม่มีใครคาดคิดได้
เรื่องราวของช่องโหว่ในระบบปฏิบัติการ Alpine Linux ที่ทำให้ผู้โจมตีสามารถ เข้าสู่ระบบได้เพียงแค่พิมพ์อักษร 257 ตัวอะไรก็ได้ คือตัวอย่างที่ชัดเจนว่าความไม่สอดคล้องกันเล็กน้อยก็อาจเปิดประตูให้ผู้ไม่ประสงค์ดีได้อย่างไร
จุดเริ่มต้นของช่องโหว่: สองการตัดสินใจที่ดูสมเหตุสมผล
เรื่องนี้เริ่มต้นจากการตัดสินใจที่ดูเหมือนจะดีสองครั้ง ห่างกันถึงสี่ปีในโปรเจกต์ที่แตกต่างกัน
เมื่อปี 2018 ทีมพัฒนา Alpine Linux ได้ตัดสินใจที่จะจำกัดความยาวของรหัสผ่านที่รับมาจากคำสั่ง passwd ให้ไม่เกิน 256 ตัวอักษร รหัสผ่านที่ยาวกว่านี้จะถูกตัดทอนให้เหลือเพียง 256 ตัวแรกก่อนจะนำไปเข้ารหัสและจัดเก็บ การตัดสินใจนี้ทำขึ้นเพื่อเหตุผลด้านความปลอดภัยและประสิทธิภาพ เพราะรหัสผ่านที่ยาวเกินไปอาจถูกใช้ในการโจมตีแบบปฏิเสธการให้บริการ (Denial of Service) หรืออาจมีปัญหาในการทำงานร่วมกับอัลกอริทึมการเข้ารหัสบางชนิดในตอนนั้น ซึ่งถือเป็นการเลือกที่สมเหตุสมผลดี
สี่ปีต่อมา ในปี 2022 ได้มีการเพิ่มโมดูล pam_unix เข้ามาใน Alpine Linux เพื่อใช้ในการยืนยันตัวตน โมดูลนี้มีหน้าที่รับรหัสผ่านที่ผู้ใช้ป้อนเข้ามา แล้วส่งต่อไปให้ฟังก์ชัน crypt() เพื่อนำไปเข้ารหัสและเปรียบเทียบกับรหัสผ่านที่ถูกจัดเก็บไว้ แต่ประเด็นสำคัญคือ pam_unix ในเวอร์ชันนี้ ไม่ได้ตัดทอนรหัสผ่านที่ป้อนเข้ามา หากมันมีความยาวเกิน 256 ตัวอักษร อย่างไรก็ตาม ฟังก์ชัน crypt() ที่อยู่เบื้องหลัง มีข้อจำกัดภายใน ที่จะประมวลผลเพียง 256 ตัวอักษรแรกเท่านั้น ก่อนที่จะนำไปเข้ารหัส
การทำงานร่วมกันที่ผิดพลาด จนเกิดช่องทางแอบเข้าสู่ระบบ
เมื่อนำสองส่วนนี้มารวมกัน จึงเกิดปัญหาขึ้นอย่างไม่คาดฝัน
ลองนึกภาพว่ามีผู้ใช้ตั้งรหัสผ่านที่ ยาวกว่า 256 ตัวอักษร เช่น ตั้งเป็นรหัสผ่าน 257 ตัวอักษรผ่านคำสั่ง passwd ระบบจะทำการตัดทอนรหัสผ่านนี้ให้เหลือเพียง 256 ตัวอักษรแรกก่อนจะจัดเก็บลงในฐานข้อมูล
ปัญหาเกิดขึ้นเมื่อผู้ใช้พยายามเข้าสู่ระบบด้วยรหัสผ่าน เดิมที่ยาว 257 ตัวอักษร pam_unix จะรับรหัสผ่านเต็ม 257 ตัวอักษรนั้น แล้วส่งต่อไปให้ฟังก์ชัน crypt() ซึ่งเจ้า crypt() นี้จะประมวลผลแค่ 256 ตัวอักษรแรกของรหัสผ่านที่ป้อนเข้ามาเท่านั้น ก่อนจะนำไปเข้ารหัสและเปรียบเทียบกับรหัสผ่านที่จัดเก็บไว้
ผลลัพธ์ที่ตามมาคืออะไร? หากรหัสผ่าน Root หรือผู้ใช้คนใดคนหนึ่ง ถูกตั้งให้ยาวกว่า 256 ตัวอักษรโดยใช้คำสั่ง passwd ผู้โจมตีสามารถป้อนรหัสผ่านที่ ยาว 257 ตัวอักษรขึ้นไป โดยเป็นอักษร อะไรก็ได้ (เช่น พิมพ์ ‘a’ 257 ตัว หรือ ‘b’ 257 ตัว) แล้วจะสามารถ เข้าสู่ระบบได้สำเร็จ โดยไม่จำเป็นต้องรู้รหัสผ่านที่แท้จริงเลยแม้แต่น้อย
นี่คือช่องโหว่ร้ายแรงที่เกิดจากความไม่สอดคล้องกันของกระบวนการ: ส่วนหนึ่งตัดทอนก่อนเก็บ อีกส่วนหนึ่งตัดทอนก่อนยืนยัน แต่เมื่อทำงานร่วมกันในเงื่อนไขที่รหัสผ่านยาวเกิน 256 ตัวอักษร กลายเป็นว่าระบบมีการทำงานที่ผิดพลาด ทำให้การยืนยันตัวตนสำเร็จโดยอัตโนมัติเมื่อเจอกับรหัสผ่านที่ยาวผิดปกติ
บทเรียนที่ต้องจดจำ: ความสอดคล้องคือหัวใจ
เรื่องราวนี้เน้นย้ำให้เห็นถึงความสำคัญของการ ความสอดคล้อง ในทุกส่วนของระบบ โดยเฉพาะอย่างยิ่งในเรื่องที่เกี่ยวข้องกับความปลอดภัย การตัดสินใจที่ดูดีและมีเหตุผลในบริบทหนึ่ง อาจสร้างปัญหาใหญ่หลวงเมื่อระบบต่างๆ มาทำงานร่วมกัน
การป้องกันช่องโหว่เช่นนี้ต้องอาศัยหลักการ ความปลอดภัยตั้งแต่การออกแบบ (Security by Design) และ การป้องกันหลายชั้น (Defense in Depth) เพื่อให้แน่ใจว่าทุกคอมโพเนนต์ทำงานร่วมกันอย่างถูกต้องและคาดการณ์ได้ การแก้ไขช่องโหว่นี้คือการทำให้แน่ใจว่ากระบวนการตัดทอนรหัสผ่านเกิดขึ้นอย่างสอดคล้องกัน ไม่ว่าจะเป็นตอนตั้งค่าหรือตอนยืนยันตัวตน
สำหรับผู้ดูแลระบบและนักพัฒนาซอฟต์แวร์ บทเรียนนี้ตอกย้ำว่า แม้แต่การเปลี่ยนแปลงเล็กๆ น้อยๆ หรือการเพิ่มคุณสมบัติใหม่ๆ ก็ต้องมีการพิจารณาผลกระทบด้านความปลอดภัยอย่างรอบคอบ ไม่ว่าระบบจะซับซ้อนแค่ไหน การมองเห็นภาพรวมและการทำงานร่วมกันของทุกส่วนคือสิ่งสำคัญที่สุดในการสร้างระบบที่ปลอดภัยและแข็งแกร่ง