ผู้ที่ติดตามข่าวสารด้าน ภัยคุกคามทางไซเบอร์ (Cyber Threat) เป็นประจำ ไม่ว่าจะเป็นการจารกรรมข้อมูลของแฮกเกอร์, เทคนิคที่ มัลแวร์ (Malware) ใช้ในการเจาะเข้าสู่ระบบของเหยื่อ หรือจะเป็นช่องโหว่ที่ถูกค้นพบในซอฟต์แวร์อะไรก็ตาม บ่อยครั้งที่เราจะได้ยินคำว่า "Buffer Overflow"
สำหรับ Buffer Overflow เป็นเทคนิคหนึ่งที่ได้รับความนิยมจาก แฮกเกอร์ (Hacker) เป็นอย่างมาก ซึ่งก็แสดงให้เห็นว่ามันเป็นช่องโหว่ (Vulnerability) ที่ได้ผล ไม่อย่างนั้นมันคงไม่ได้รับความไว้วางใจจากแฮกเกอร์มาอย่างยาวนานขนาดนี้
คำถามคือแล้ว Buffer Overflow มันคืออะไร ? หลายคนน่าจะสงสัยเหมือนกับผู้เขียน ซึ่งเราได้ไปหาข้อมูลมาแล้วพบว่าเรื่องราวมันน่าสนใจดี เลยนำมาเล่าให้อ่านกันในบทความนี้
เราเคยอธิบายไปในบทความเรื่อง หน่วยความจำแรม (RAM) ว่าการทำงานของคอมพิวเตอร์จะมีการเรียกข้อมูลไปเก็บไว้ในหน่วยความจำเพื่อเตรียมรอไว้สำหรับการประมวลผล ซึ่งการเขียนข้อมูลลงในหน่วยความจำนั้นเป็นงานที่ค่อนข้างละเอียดอ่อน และมีโอกาสเกิดข้อผิดพลาดขึ้นได้
ในกระบวนการจัดเก็บข้อมูลนั้นจะมีกระบวนการหนึ่งที่เรียกว่าการทำบัฟเฟอร์ (Buffering) โดยมันเป็นพื้นที่หน่วยความจำที่ถูกสร้างขึ้นชั่วคราวเพื่อใช้เก็บข้อมูล มีไว้สำหรับจัดเก็บข้อมูลที่รอการประมวลผลหรือการถ่ายโอนข้อมูลระหว่างส่วนต่าง ๆ ของซอฟต์แวร์ กับระบบ
หรือในการส่งข้อมูลระหว่างเครือข่าย ก็มีการ Buffer มาใช้เพื่อช่วยลดการสูญเสียที่เกิดขึ้นในกระบวนการการถ่ายโอนข้อมูล อย่างเช่น เวลาที่เราสตรีมวิดีโอ เพื่อลดการขาดช่วงในกรณีที่ข้อมูลดาวน์โหลดไม่ทันก็จะใช้เทคนิค Buffer เข้ามาช่วย
ส่วนที่อยู่เลยแถบสีเหลือง ก็คือการทำ Buffer นั่นเอง
ภาพจาก : https://www.avast.com/c-how-to-stop-buffering
ในบางกรณี Buffer ถูกใช้เพื่อช่วยในการจัดการข้อมูลที่ถูกส่งผ่านระบบ, เช่น การอ่านข้อมูลจากไฟล์หรือการรับข้อมูลจากเครือข่าย. การใช้ Buffer ช่วยลดประสิทธิภาพที่สูญเสียในกระบวนการการถ่ายโอนข้อมูล
ทีนี้ อย่างที่เราได้อธิบายไปข้างต้นว่า การ Buffer จะสร้างพื้นที่หน่วยความจำขึ้นมาชั่วคราวเพื่อใช้เก็บข้อมูลเพื่อรอการนำไปใช้ต่อ ซึ่งขนาดของพื้นที่นี้จะมีขนาดจำกัด แล้วแต่ว่าซอฟต์แวร์ หรือระบบจะกำหนดมาว่าจะให้ Buffer มีพื้นที่เท่าไหร่
Buffer Overflow คำว่า Overflow นั้นถ้าแปลเป็นภาษาไทยความหมายก็ประมาณว่า "ล้น" หรือ "เกิน" ดังนั้น Buffer Overflow คือสถานการณ์ที่ขนาดข้อมูลมีขนาดใหญ่เกินกว่าขนาดที่ Buffer รองรับได้ ส่งผลให้ระบบพยายามที่จะเขียนข้อมูลลงใน Buffer ทับไปยังตำแหน่งหน่วยความจำที่อยู่ติดกันแทน ซึ่งเหตุการณ์นี้อาจเกิดขึ้นได้จากข้อผิดพลาดที่มีอยู่ในซอฟต์แวร์ หรือระบบ หรืออาจเกิดจากการถูกแฮกเกอร์โจมตีก็เป็นได้
ตัวอย่างเช่น Buffer ของระบบยืนยันตัวตนที่ใช้ในการเข้าสู่ระบบ ออกแบบมาให้ข้อมูลบัญชี และรหัสผ่าน มีขนาด 8 ไบต์ (Bytes) แต่ถ้าหากว่าเกิดเหตุการณ์ข้อมูลถูกป้อนเข้าไป 10 Bytes แทน ทำให้มีส่วนเกินออกมา 2 Bytes เป็นเหตุให้ระบบพยายามเขียนข้อมูลเกินขอบเขต Buffer ที่ถูกกำหนดไว้
ภาพจาก : https://www.imperva.com/learn/application-security/buffer-overflow/
ดังนั้น Buffer Overflow นั้นสามารถเกิดขึ้นได้กับซอฟต์แวร์ทุกประเภท และเมื่อมันเกิดขึ้นแล้ว ก็มีโอกาสที่ซอฟต์แวร์จะทำงานผิดพลาด หรือถูกแฮกเกอร์ใช้โอกาสนี้ในการดึงข้อมูลที่ต้องการออกจากหน่วยความจำ หรือใช้เป็นช่องโหว่ในการโจมตีด้วยเทคนิคอื่น ๆ เป็นลำดับต่อไป
แฮกเกอร์จะอาศัยหลักการทำงานของ Buffer Overflow เพื่อเขียนข้อมูลที่ต้องการลงบนหน่วยความจำของซอฟต์แวร์ที่ถูกโจมตี โดยแฮกเกอร์มักจะใช้เทคนิคนี้เพื่อเปลี่ยนตำแหน่งการเขียนข้อมูล เพื่อจารกรรมข้อมูลออกมาจากหน่วยความจำ หรือเขียนโค้ดอันตรายเข้าไปแทนที่โค้ดการทำงานเดิมเพื่อให้ได้สิทธิ์ในการเข้าถึงส่วนสำคัญของระบบได้
ถ้าหากแฮกเกอร์รู้รูปแบบหน่วยความจำ (Memory Layout) ของซอฟต์แวร์ ก็ไม่ใช่เรื่องยากที่แฮกเกอร์จะสามารถป้อนข้อมูลที่ตัว Buffer ไม่สามารถจัดเก็บได้ และเขียนข้อมูลโค้ดอันตรายทับลงไป เช่น สั่งให้ซอฟต์แวร์อ่าน Payload (โค้ดอันตรายที่ถูกแทรกเข้าไปในระบบเพื่อทำการโจมตี หรืออะไรก็ตามที่ตามปกติระบบไม่อนุญาตให้ทำได้)
ภาพจาก : https://avinetworks.com/glossary/buffer-overflow/
เทคนิคในการใช้ช่องโหว่ของ Buffer Overflow นั้นมีอยู่หลายประเภทขึ้นอยู่กับเทคนิคที่ใช้, สถาปัตยกรรม, ระบบปฏิบัติการ และประเภทของหน่วยความจำ ดังนั้นการโจมตีแบบ Buffer Overflow ที่สามารถพบเห็นได้บ่อยครั้ง จะมีดังต่อไปนี้
ในขณะที่ซอฟต์แวร์กำลังทำงาน จะมีการใช้เทคนิคที่เรียกว่า Stack โดยมันเป็นโครงสร้างข้อมูลที่จัดเก็บข้อมูลแบบเข้าหลังออกก่อน (Last-In-First-Out - LIFO) ถ้าแฮกเกอร์สามารถส่งข้อมูลที่มีขนาดเกินกว่าขนาด Buffer ที่ใช้ใน Stack ได้ ก็จะเกิด Buffer Overflow ขึ้น
Heap คือพื้นที่หน่วยความจำที่ใช้ในซอฟต์แวร์ที่ทำงานแบบ Dynamic Memory Allocation ซึ่งเป็นหน่วยความจำที่สามารถเปลี่ยนแปลงขนาดได้ตลอดเวลา และคืนค่าหน่วยความจำที่ไม่ถูกใช้งานได้ เพื่อเพิ่มความยืดหยุ่นในการทำงานให้กับตัวซอฟต์แวร์
แต่ถ้าข้อมูลที่ถูกเขียนลงไปใน Buffer ของ Heap มีขนาดใหญ่เกินกว่าที่มันจะรองรับได้ มันก็เลยทำให้เกิด Buffer Overflow ในที่สุด
เป็นช่องโหว่ที่เกิดขึ้นเมื่อซอฟต์แวร์ไม่ได้ตรวจสอบข้อมูลที่ถูกใส่เข้าไปอย่างถูกต้อง โดยตามปกติแล้ว ในการทำงานของซอฟต์แวร์จะมีการตรวจสอบข้อมูลที่ถูกป้อนเข้าไปโดยใช้คุณสมบัติ Format String ในการตรวจสอบ
แต่ถ้าซอฟต์แวร์มีช่องโหว่ ไม่มีการตรวจสอบข้อมูลที่ถูกป้อนเข้าไปให้ดีพอ แฮกเกอร์ก็สามารถใช้ช่องโหว่นี้ป้อนโค้ดที่ต้องการเข้าไปแทน ทำให้การเขียนข้อมูลเกิดข้อผิดพลาด ที่สามารถใช้ในการโจมตีได้
อย่างที่เราทราบกันอยู่แล้วว่า เบื้องหลังการทำงานของคอมพิวเตอร์นั้นอาศัยหลักคณิตศาสตร์ในการทำงานแทบทุกอย่าง Integer Overflow เกิดจากการที่ค่าจำนวนเต็ม (Integer) สูงเกินขีดจำกัดที่ระบบสามารถเก็บได้ จะทำให้เกิดข้อผิดพลาดขึ้นได้
ตัวอย่างเช่น ถ้าค่า Integer มีค่าเท่ากับ 9,223,372,036,854,775,807 ซึ่งเป็นค่าสูงสุดที่ Integer ของระบบ 64 บิต สามารถรองรับได้ แต่ถูกบวกค่าเพิ่มเข้าไปอีก 1 จะทำให้ตัวแปรกลับไปติดลบทันที ซึ่งถือว่าเป็นการทำงานที่ผิดพลาด แฮกเกอร์สามารถใช้มันในการโจมตีระบบได้
แม้เทคนิคโจมตีด้วย Buffer Overflow จะดูมีความอันตราย แต่นักพัฒนาก็สามารถป้องกันการโจมตีรูปแบบนี้ได้ด้วยใส่มาตรการรักษาคความปลอดภัยเข้าไปในโค้ด หรือใช้ระบบป้องกันที่ตัวภาษาโปรแกรมมิ่งเตรียมไว้ให้ (มีแค่ในบางภาษา)
นอกจากนี้ ในตัวระบบปฏิบัติการในยุคนี้ ก็มีการใส่ระบบป้องกันการโจมตีด้วยเทคนิค Buffer Overflow เข้ามาให้ด้วย
สำหรับแนวทางป้องกันที่นิยมใช้กันจะมีอยู่ 3 เทคนิค ประกอบไปด้วย
เทคนิคนี้จะใช้การสุ่มเปลี่ยนตำแหน่งของหน่วยความจำ (Memory Address) ของซอฟต์แวร์ใหม่ทุกครั้งที่เปิดใช้งาน ส่งผลให้แฮกเกอร์ไม่สามารถคาดเดารูปแบบหน่วยความจำ (Memory Layout) ได้ง่าย ๆ ทำให้ยากต่อการหาตำแหน่งของข้อมูล หรือตำแหน่งที่โค้ดจะเขียนทับได้อย่างถูกต้อง
คุณสมบัตินี้จะกำหนดพื้นที่บนหน่วยความจำเอาไว้เลย ว่าส่วนไหนที่อนุญาตให้ใช้ได้ และส่วนไหนที่ไม่อนุญาตให้ใช้ เพื่อป้องกันไม่ให้เกิดการรันโค้ดจากพื้นที่บนหน่วยความจำที่ไม่ได้รับอนุญาต นั่นหมายความว่ามันจะช่วยให้ไม่เกิดการ Buffer Overflow ได้
ในระบบปฏิบัติการ Windows จะมีคุณสมบัติที่เรียกว่า Structured Exception Handler (SEH) มันมีหน้าที่จัดการข้อผิดพลาดต่าง ๆ ที่อาจเกิดขึ้นระหว่างการทำงานของซอฟต์แวร์ หรือที่เรียกว่า "Exceptions" ในการจัดการกับ Exceptions ที่เกิดขึ้นก็คือหน้าที่ของ SEH นั่นเอง
Structured Exception Handler Overwrite Protection (SEHOP) เป็นเทคนิคที่ใช้พัฒนาขึ้นมาเพื่อใช้ป้องการโจมตีที่เกี่ยวข้องกับซอฟต์แวร์ที่มีการใช้ SEH ในระบบปฏิบัติการ Windows ด้วยการตรวจสอบ และป้องกันการเขียนข้อมูลทับของ Structured Exception Handler ในหน่วยความจำ
|
แอดมินสายเปื่อย ชอบลองอะไรใหม่ไปเรื่อยๆ รักแมว และเสียงเพลงเป็นพิเศษ |