ช่องโหว่และการใช้ประโยชน์จากช่องโหว่
ช่องโหว่คือข้อบกพร่องในซอฟต์แวร์ที่ละเมิดข้อสันนิษฐานด้านความปลอดภัย การใช้ประโยชน์จากช่องโหว่คือการเปลี่ยนข้อบกพร่องดังกล่าวให้เป็นการกระทำที่ผู้โจมตีควบคุมได้ ตั้งแต่การรั่วไหลของข้อมูลไปจนถึงการประมวลผลโค้ดอย่างสมบูรณ์
Definition
ช่องโหว่คือจุดอ่อนในระบบที่ผู้โจมตีสามารถใช้เพื่อละเมิดนโยบายความปลอดภัยของระบบได้ ส่วน exploit คือเทคนิคหรือโปรแกรมที่ใช้ประโยชน์จากช่องโหว่เฉพาะเพื่อบรรลุผลที่ไม่ได้รับอนุญาต
Scope
หัวข้อนี้ครอบคลุมประเภทช่องโหว่หลักๆ ได้แก่ ข้อบกพร่องที่เกิดจากการเสียหายของหน่วยความจำ (buffer overflows, use-after-free), การแทรกข้อมูล (injection), ข้อผิดพลาดเกี่ยวกับจำนวนเต็ม (integer errors) และข้อบกพร่องเชิงตรรกะ (logic flaws) รวมถึงเทคนิคในการใช้ประโยชน์จากช่องโหว่เหล่านี้ ซึ่งรวมถึงการจี้การควบคุมการทำงาน (control-flow hijacking) และการเขียนโปรแกรมแบบ return-oriented programming นอกจากนี้ยังครอบคลุมถึงมาตรการบรรเทาผลกระทบที่เพิ่มต้นทุนในการใช้ประโยชน์จากช่องโหว่ (ASLR, DEP/NX, stack canaries, control-flow integrity) โดยไม่รวมถึงแนวปฏิบัติในการพัฒนาที่ปลอดภัยและช่องโหว่เฉพาะของเว็บ ซึ่งจะกล่าวถึงในหัวข้อที่เกี่ยวข้อง
Core questions
- ข้อบกพร่องของซอฟต์แวร์ประเภทใดที่ก่อให้เกิดช่องโหว่ที่สามารถใช้ประโยชน์ได้?
- ข้อบกพร่องที่เกิดจากการเสียหายของหน่วยความจำถูกเปลี่ยนเป็นการควบคุมโปรแกรมได้อย่างไร?
- return-oriented programming คืออะไร และเหตุใดจึงสามารถเอาชนะการป้องกันแบบง่ายๆ ได้?
- มาตรการบรรเทาผลกระทบเช่น ASLR, DEP และ stack canaries ยกระดับอุปสรรคในการใช้ประโยชน์จากช่องโหว่อย่างไร?
- เหตุใด 'การแข่งขันด้านอาวุธ' ระหว่างการใช้ประโยชน์จากช่องโหว่และการบรรเทาผลกระทบจึงยังคงดำเนินต่อไป?
Key concepts
- buffer overflow
- use-after-free
- integer overflow
- injection
- control-flow hijacking
- return-oriented programming
- shellcode
- ASLR, DEP/NX, stack canaries
- control-flow integrity
Key theories
- การจี้การควบคุมการทำงาน (Control-flow hijacking)
- exploit จำนวนมากทำให้ตัวชี้โค้ดเสียหาย (เช่น ที่อยู่ส่งคืนหรือตัวชี้ฟังก์ชัน) เพื่อเปลี่ยนเส้นทางการทำงานไปยังโค้ดที่ผู้โจมตีเลือก ตัวอย่างที่เป็นที่รู้จักคือ stack buffer overflow ที่เขียนทับที่อยู่ส่งคืนที่บันทึกไว้
- มาตรการบรรเทาผลกระทบและการแข่งขันด้านอาวุธในการใช้ประโยชน์จากช่องโหว่
- การป้องกันเช่น หน่วยความจำที่ไม่สามารถประมวลผลได้, การสุ่มตำแหน่งหน่วยความจำ, stack canaries และความสมบูรณ์ของการควบคุมการทำงาน แต่ละอย่างจะบล็อกเทคนิคประเภทหนึ่ง ซึ่งกระตุ้นให้เกิดการโจมตีใหม่ๆ (return-oriented programming, การรั่วไหลของข้อมูล) ในการยกระดับที่ต่อเนื่อง
Mechanisms
stack overflow แบบคลาสสิกจะเขียนข้อมูลเกินขอบเขตของบัฟเฟอร์ ทำให้เขียนทับที่อยู่ส่งคืนที่บันทึกไว้ (saved return address) ดังนั้นเมื่อฟังก์ชันส่งคืน การทำงานจะกระโดดไปยัง shellcode ที่ผู้โจมตีจัดหาให้ มาตรการบรรเทาผลกระทบได้แก้ไขปัญหานี้: หน่วยความจำที่ไม่สามารถประมวลผลได้ (non-executable memory) (DEP/NX) หยุดการทำงานของโค้ดที่ถูกแทรก ทำให้เกิดการเขียนโปรแกรมแบบ return-oriented programming ที่เชื่อมโยงส่วนของโค้ดที่มีอยู่ การสุ่มตำแหน่งหน่วยความจำ (address-space layout randomization) ซ่อนที่อยู่เป้าหมาย ทำให้เกิดกลไกการรั่วไหลของข้อมูล (information-leak primitives) เพื่อเอาชนะมัน ความสมบูรณ์ของการควบคุมการทำงาน (control-flow integrity) และภาษาที่ปลอดภัยต่อหน่วยความจำ (memory-safe languages) มีเป้าหมายที่จะปิดช่องโหว่ประเภทเหล่านี้โดยสิ้นเชิง
Clinical relevance
ช่องโหว่ที่สามารถใช้ประโยชน์ได้เป็นวัตถุดิบของการโจมตีจริง: ข้อบกพร่องด้านความปลอดภัยของหน่วยความจำคิดเป็นส่วนใหญ่ของช่องโหว่ร้ายแรงในเบราว์เซอร์และระบบปฏิบัติการหลักๆ, exploit แบบ zero-day ถูกซื้อขายและใช้ในการจารกรรมและอาชญากรรม, และสาขาวิชานี้ขับเคลื่อนวิศวกรรมการป้องกัน, การเปิดเผยข้อมูลอย่างรับผิดชอบ, โปรแกรม bug bounties, และการผลักดันไปสู่ภาษาที่ปลอดภัยต่อหน่วยความจำเช่น Rust
Evidence & guidelines
ประเภทของช่องโหว่ถูกจัดทำรายการใน CWE ของ MITRE และติดตามเป็นรายบุคคลในฐานะ CVEs พร้อมคะแนนความรุนแรง CVSS การศึกษาจากผู้จำหน่ายรายใหญ่ (Microsoft, Google) รายงานว่าประมาณ 70% ของช่องโหว่ร้ายแรงเกิดจากความไม่ปลอดภัยของหน่วยความจำ ซึ่งกระตุ้นให้เกิดคำแนะนำในการใช้ภาษาที่ปลอดภัยต่อหน่วยความจำและการปรับใช้มาตรการบรรเทาผลกระทบ (ASLR, CFI) โดยค่าเริ่มต้นในแพลตฟอร์มสมัยใหม่
History
การใช้ประโยชน์จากช่องโหว่เป็นที่รู้จักในวงกว้างด้วย Morris worm ในปี 1988 ที่ใช้ buffer overflow และถูกจัดระบบโดย 'Smashing the Stack for Fun and Profit' ของ Aleph One ในปี 1996 การป้องกันแต่ละครั้งกระตุ้นให้เกิดการตอบสนอง: DEP นำไปสู่ return-into-libc และ return-oriented programming ของ Shacham (2007); ASLR นำไปสู่การหลีกเลี่ยงโดยอาศัยการรั่วไหลของข้อมูล การสำรวจ 'Eternal War in Memory' ในปี 2013 ได้กำหนดกรอบการแข่งขันด้านอาวุธที่กำลังดำเนินอยู่ ซึ่งยังคงขับเคลื่อนทั้งมาตรการบรรเทาผลกระทบใหม่ๆ และการนำภาษาที่ปลอดภัยต่อหน่วยความจำมาใช้
Key figures
- Elias Levy (Aleph One)
- Hovav Shacham
- Dawn Song
- Ross Anderson
- Halvar Flake
Related topics
Seminal works
- aleph1996
- szekeres2013
- anderson2020
Frequently asked questions
- ช่องโหว่ zero-day คืออะไร?
- zero-day คือช่องโหว่ที่ไม่เป็นที่รู้จักของผู้ป้องกันซอฟต์แวร์ (และยังไม่ได้รับการแก้ไข) ในขณะที่ถูกใช้ประโยชน์ ทำให้พวกเขามีเวลาเตรียมตัวเป็นศูนย์วัน ข้อบกพร่องดังกล่าวมีค่าอย่างยิ่งสำหรับผู้โจมตีเนื่องจากยังไม่มีการแก้ไขหรือลายเซ็นใดๆ
- เหตุใดภาษาที่ปลอดภัยต่อหน่วยความจำจึงได้รับการส่งเสริมให้เป็นทางออก?
- ภาษาที่ปลอดภัยต่อหน่วยความจำ (เช่น Rust) ป้องกันข้อบกพร่องได้ทั้งประเภท — buffer overflows, use-after-free — ในระหว่างการคอมไพล์หรือรันไทม์ ซึ่งช่วยขจัดแหล่งที่มาที่พบบ่อยที่สุดของช่องโหว่ร้ายแรง แทนที่จะเพียงแค่ทำให้แต่ละช่องโหว่ยากต่อการใช้ประโยชน์