Address Space Layout Randomization

วันนี้เจอเรื่องประหลาดที่ไม่ค่อยได้เจอเยอะ เอามาจดเอาไว้

ปัญหาสำคัญในเรื่องของความปลอดภัยของซอฟต์แวร์คือเวลาที่โปรแกรมเมอร์ทำงานพลาด แล้วปล่อยให้แฮกเกอร์เอาโค้ดอื่นๆ มารันในซอฟต์แวร์ตัวเองได้ เช่นบั๊ก Buffer Overflow แฮกเกอร์มักหาทางไปต่อด้วยการหาคำสั่งอื่นๆ โดยเฉพาะพวก System Call ที่สร้างความเสียหายให้กับระบบ หรือเปิดช่องโหว่อื่นๆ ขึ้นมาเรื่อยๆ ง่ายๆ เช่นการสั่ง system() นั้นหมายความว่าแฮกเกอร์จะทำอะไรก็ได้เท่าที่ user ที่รันโปรแกรมนั้นทำได้

ตาม Murphy’s Law แล้ว โปรแกรมที่มีบั๊กนั้นมักจะรันใน root เสมอ

ในดอสนั้นปัญหาอย่างนี้เกิดง่ายมาก เพราะว่าตำแหน่งของ System Call ต่างๆ นั้นตายตัว ถ้าอ่านคู่มือของ OS มาเยอะๆ ก็จะรู้ทันทีว่าควร Jump ไปยัง Address ไหนเพื่อเรียก System Call อะไร เรียกว่าเจาะเข้า process ได้ปุ๊บก็เรียบร้อยกันไปเลย

แล้วอย่างนั้นจะทำยังไงดี

ตอบแบบกำปั้นทุบดินก็คงเป็นว่าไปบอกโปรแกรมเมอร์ให้เขียนโปรแกรมไม่มีบั๊ก เหมือนบอกว่านักการเมืองไม่โกงเมื่อใหร่แล้วบ้านเมืองจะดีเอง

ในทางวิศวกรรมมันมีทางออกที่มีปัญญามากกว่านั้น คือการลดความเสียหายเมื่อแฮกเกอร์เจาะเข้ามาในตัว process ได้แล้วนั้น แฮกเกอร์มีโอกาสสำรวจหน่วยความจำของโปรเซสไม่มากนัก เพราะถ้าทำอะไรมากเกินไปก็อาจจะทำตัว process ตายไปเองได้

คิดง่ายๆ คือเอา System Call ไปซ่อนมันซะเลย ทีนี้จะซ่อนมันที่ไหนดี เพราะถ้าถ้าซ่อนแล้วแฮกเกอร์รู้ มันก็ตามไปรังควานอีกจนได้นั่นแล

ในลินุกซ์นั้นเลยคิดอะไรที่ง่ายกว่านั้นคือการวางตำแหน่งของ ไลบราลี, Heap, Stack ฯลฯ ให้มั่วจนเละเทะ ทีนี่เวลาแฮกเกอร์เจาะเข้ามาได้ก็จะเริ่มทำอะไรไม่ถูก เพราะไม่รู้อะไรอยู่ตรงไหน จะไล่กวาดมั่วซั่ว ก็กวาดไปได้แป๊บเดียวก็พลาดไปทำ exception ขึ้นแล้วโปรแกรมก็ segmentation fault ไป

เทคนิคนี้เรียกย่อๆ ว่า ASLR (Address Space Layout Randomization) มันถูกเสนอขึ้นมาครั้งแรกในปี 2001 ถูกเปิดใช้งานเป็นค่ามาตรฐานในลินุกซ์ครั้งแรกในรุ่น 2.6.12 หรือช่วงปี 2005 ส่วนวินโดวส์นั้นใช้งานครั้งแรกตอน Vista และ Windows Server 2008 แต่พบว่ามีปัญหาในการสุ่มอยู่บ้าง และได้รับการแก้ไขใน SP1 ส่วน OS X นั้นรุ่น 10.5 แม้จะมีการสุ่มตำแหน่งไลบราลีบ้างแต่ก็ไม่ได้ทำเต็มที่อย่างเช่น OS ตัวอื่นๆ นัก

อ่อ ลืมไปว่าบล็อกนี้ geek จัด ถ้าอ่านมาแล้วเหมืนออ่านภาษาขอมก็ขออภัยผู้อ่านครับ

One thought on “Address Space Layout Randomization

  1. เคยแต่พัฒนาบนระบบ windows ง่ายๆ เลยไม่เคยรู้เรื่องแบบนี้เลยอ่ะ ช่วยขยายความให้หน่อยสิ(ถ้าเป็นไปได้) เพราะยังนึกภาพไม่ออก ถ้า path ต่างๆมัน random แบบนี้ คนพัฒนาเองจะ get ค่าต่างๆมายังไงอ่ะ สมมุติว่าเป็นเวป แล้วแฮกเกอร์แอบฝัง script ในระบบได้ ก็ไม่น่าจะต่างกันนะ

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>