ฮาร์ดแวร์หรือซอฟต์แวร์ตรวจพบมากเกินไป


26

เป็นหน้าที่ของซอฟต์แวร์ (ระบบปฏิบัติการ) ในการตรวจสอบ stack overflows หรือตรวจพบ stack overflow ในฮาร์ดแวร์ทำให้เกิดข้อยกเว้นใน CPU หรือไม่


ฉันจะบอกว่าฮาร์ดแวร์ผ่านข้อบกพร่อง MMU บนซีพียูส่วนใหญ่ x86 ในโหมด 32 บิตมีการแบ่งส่วนเพิ่มเติมนอกเหนือจากการเพจและส่วน "สแต็กกลุ่ม" เกี่ยวข้องเช่นรหัส, ข้อมูล, ส่วนขยาย ... ที่มีทั้งที่อยู่พื้นฐานและขนาด การเข้าถึงนอกช่วงนั้นจะทำให้เกิดข้อผิดพลาด
TEMLIB

คำตอบ:


25

อาจเป็นซอฟต์แวร์หรือฮาร์ดแวร์หรือทั้งสองอย่างหรือไม่มีก็ได้

มีโอเวอร์โฟลสองชนิดคือ: โอเวอร์โฟลว์เมื่อเพิ่มสแต็ก (เมื่อเข้าสู่ฟังก์ชัน) และโอเวอร์โฟลว์เมื่อเข้าถึงอาร์เรย์บนสแต็ก สามารถตรวจพบโอเวอร์โฟลว์เมื่อทำการเพิ่มสแต็กโดยทำการตรวจสอบขอบเขตของรายการฟังก์ชันเพื่อตรวจสอบว่ามีพื้นที่เพียงพอ (และส่งสัญญาณข้อผิดพลาดหรือขยายสแต็กหากไม่มี) การโอเวอร์โฟลว์เมื่อเข้าถึงอาเรย์บนสแต็คเป็นปัญหาในภาษาระดับต่ำที่ไม่ตรวจสอบขอบเขตอาเรย์ การแก้ปัญหาคือการตรวจสอบขอบเขตของอาร์เรย์

แนวทางซอฟต์แวร์เหล่านี้มีข้อดีที่ทำงานได้อย่างน่าเชื่อถือ: คุณสามารถมั่นใจได้ว่าสแต็คล้นใด ๆ จะถูกตรวจพบ ข้อเสียของพวกเขาคือพวกเขาเพิ่มขนาดรหัสและเวลาดำเนินการ ฮาร์ดแวร์สามารถช่วยได้โดยจัดให้มีวิธีการตรวจจับการล้นมากที่สุดโดยไม่เสียค่าใช้จ่ายตราบใดที่ไม่มีการล้นเกิน บนสถาปัตยกรรมที่มีMMU ¹สภาพแวดล้อมรันไทม์สามารถจัดเรียงเพื่อแมปสแต็คในขอบเขตหน้าโดยที่เพจถัดไปที่เหลือจะไม่ได้รับการแมป

+---------------+---------------+---------------+---------------+
| stack                         | unmapped      | other stuff   |
|    ----> direction of growth  |               |               |
+---------------+---------------+---------------+---------------+
^               ^               ^               ^               ^  page boundaries

ด้วยวิธีนี้หากซอฟต์แวร์พยายามเข้าถึงข้อมูลที่เกินขอบเขตหน้า (ไม่ว่าจะเป็นเพราะตัวชี้สแต็คได้ย้ายเกินขอบเขตหรือเนื่องจากการเข้าถึงอาร์เรย์ไม่เกินขอบเขตและเกินขอบเขต) มันจะทำให้เกิดข้อผิดพลาดโดยการเข้าถึงพื้นที่ที่ไม่ได้ถูกแมป . สิ่งนี้จะเกิดขึ้นก็ต่อเมื่อโอเวอร์โฟลมีขนาดเล็กพอ: หากจำนวนโอเวอร์โฟลว์ใหญ่เกินไปโปรแกรมอาจสิ้นสุดการเข้าถึงข้อมูลอื่น ๆ ในอีกด้านหนึ่งของช่องว่างในพื้นที่ที่อยู่

ข้อเสียของวิธีการของฮาร์ดแวร์ก็คือว่ามันไม่น่าเชื่อถืออย่างเต็มที่เนื่องจากอาจมีการตรวจจับปริมาณมากเกินไปและไม่ตรวจจับอาร์เรย์ล้นที่ยังคงอยู่ภายในพื้นที่แอดเดรส

ในการตรวจจับอาร์เรย์ล้นเทคนิคซอฟต์แวร์อื่นคือนกขมิ้น : ใส่ค่าพิเศษที่ด้านบนของสแต็กหรือระหว่างเฟรมและตรวจสอบว่าค่านกขมิ้นไม่ได้เปลี่ยนเมื่อฟังก์ชั่นกลับมา นี่เป็นเทคนิคที่ไม่สมบูรณ์เนื่องจากการล้นอาจหลีกเลี่ยงนกขมิ้นทั้งหมดหรืออาจไม่ได้รับการตรวจพบเนื่องจากค่านกขมิ้นได้รับการกู้คืนตามเวลาที่ตรวจสอบ อย่างไรก็ตามมีประโยชน์ที่จะทำให้การใช้ประโยชน์จากช่องโหว่ด้านความปลอดภัยได้ยากขึ้น

วิธีที่ปลอดภัยและถูกที่สุดในการหลีกเลี่ยงการโอเวอร์โฟลว์แบบสแต็กคือการคำนวณจำนวนสแต็กที่โปรแกรมจะต้องใช้ก่อนเริ่มดำเนินการโดยการวิเคราะห์แบบสแตติก อย่างไรก็ตามวิธีนี้ไม่ได้ใช้งานได้จริง: จำนวนของสแต็กที่โปรแกรมต้องการนั้นไม่สามารถตัดสินใจได้โดยทั่วไปและขึ้นอยู่กับข้อมูลที่โปรแกรมจัดการ

¹ หลักการเดียวกันนอกจากนี้ยังสามารถนำมาใช้มีเพียง MPU หรือหน่วยความจำที่มีการป้องกันไม่ถ้ามีหัวข้อเดียวที่มีสแต็คที่ขอบของแมปทางกายภาพที่มีอยู่


4
ฉันจะไม่เรียกอาร์เรย์ที่ไม่อยู่ในขอบเขตเข้าถึงสแต็กโอเวอร์โฟลว์แม้ว่าอาเรย์จะอยู่ในสแต็ก มันเป็นเพียงกรณีพิเศษของบัฟเฟอร์ล้น
CodesInChaos

การไม่จัดสรรให้กับรายการสแต็กหลักที่อ้างอิงสัมพันธ์กับตัวชี้ที่ไม่ใช่สแต็ค / เฟรมหรือออฟเซ็ตที่ไม่คงที่จะหลีกเลี่ยงการล้นสแต็กแบบดั้งเดิม การใช้สแต็กที่อยู่ผู้ส่งคืนแยกต่างหาก (หรือ RA / รีจิสเตอร์สแต็กเช่น Itanium) อย่างน้อยก็จะช่วยลดโอกาสในการเขียนโปรแกรมที่มุ่งเน้นผลตอบแทนเป็นอย่างมาก
Paul A. Clayton

การเข้าถึงที่ไม่อยู่ในขอบเขตจะเรียกว่าการบุกรุกอย่างเหมาะสมไม่ใช่การโอเวอร์โฟลว์
Ben Voigt

3
@ awesomebing1 ไม่ใช่ทุกแพลตฟอร์มที่ตรวจพบสแต็คโอเวอร์โฟลว์ คุณอาจจบลงด้วยการเขียนทับอะไรก็ตามที่อยู่หลังสแต็ก (คล้ายกับโอเวอร์โฟลว์บัฟเฟอร์อื่น)
user253751

1
@CodesInChaos บางครั้งบัฟเฟอร์โอเวอร์โฟลว์ในบัฟเฟอร์ที่จัดสรรสแต็กเรียกว่า "stack overflows" (สั้น) จริงอยู่ที่คำศัพท์นั้นอาจสับสนเล็กน้อยโดยไม่มีบริบท
DW
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.