เป็นหน้าที่ของซอฟต์แวร์ (ระบบปฏิบัติการ) ในการตรวจสอบ stack overflows หรือตรวจพบ stack overflow ในฮาร์ดแวร์ทำให้เกิดข้อยกเว้นใน CPU หรือไม่
เป็นหน้าที่ของซอฟต์แวร์ (ระบบปฏิบัติการ) ในการตรวจสอบ stack overflows หรือตรวจพบ stack overflow ในฮาร์ดแวร์ทำให้เกิดข้อยกเว้นใน CPU หรือไม่
คำตอบ:
อาจเป็นซอฟต์แวร์หรือฮาร์ดแวร์หรือทั้งสองอย่างหรือไม่มีก็ได้
มีโอเวอร์โฟลสองชนิดคือ: โอเวอร์โฟลว์เมื่อเพิ่มสแต็ก (เมื่อเข้าสู่ฟังก์ชัน) และโอเวอร์โฟลว์เมื่อเข้าถึงอาร์เรย์บนสแต็ก สามารถตรวจพบโอเวอร์โฟลว์เมื่อทำการเพิ่มสแต็กโดยทำการตรวจสอบขอบเขตของรายการฟังก์ชันเพื่อตรวจสอบว่ามีพื้นที่เพียงพอ (และส่งสัญญาณข้อผิดพลาดหรือขยายสแต็กหากไม่มี) การโอเวอร์โฟลว์เมื่อเข้าถึงอาเรย์บนสแต็คเป็นปัญหาในภาษาระดับต่ำที่ไม่ตรวจสอบขอบเขตอาเรย์ การแก้ปัญหาคือการตรวจสอบขอบเขตของอาร์เรย์
แนวทางซอฟต์แวร์เหล่านี้มีข้อดีที่ทำงานได้อย่างน่าเชื่อถือ: คุณสามารถมั่นใจได้ว่าสแต็คล้นใด ๆ จะถูกตรวจพบ ข้อเสียของพวกเขาคือพวกเขาเพิ่มขนาดรหัสและเวลาดำเนินการ ฮาร์ดแวร์สามารถช่วยได้โดยจัดให้มีวิธีการตรวจจับการล้นมากที่สุดโดยไม่เสียค่าใช้จ่ายตราบใดที่ไม่มีการล้นเกิน บนสถาปัตยกรรมที่มีMMU ¹สภาพแวดล้อมรันไทม์สามารถจัดเรียงเพื่อแมปสแต็คในขอบเขตหน้าโดยที่เพจถัดไปที่เหลือจะไม่ได้รับการแมป
+---------------+---------------+---------------+---------------+
| stack | unmapped | other stuff |
| ----> direction of growth | | |
+---------------+---------------+---------------+---------------+
^ ^ ^ ^ ^ page boundaries
ด้วยวิธีนี้หากซอฟต์แวร์พยายามเข้าถึงข้อมูลที่เกินขอบเขตหน้า (ไม่ว่าจะเป็นเพราะตัวชี้สแต็คได้ย้ายเกินขอบเขตหรือเนื่องจากการเข้าถึงอาร์เรย์ไม่เกินขอบเขตและเกินขอบเขต) มันจะทำให้เกิดข้อผิดพลาดโดยการเข้าถึงพื้นที่ที่ไม่ได้ถูกแมป . สิ่งนี้จะเกิดขึ้นก็ต่อเมื่อโอเวอร์โฟลมีขนาดเล็กพอ: หากจำนวนโอเวอร์โฟลว์ใหญ่เกินไปโปรแกรมอาจสิ้นสุดการเข้าถึงข้อมูลอื่น ๆ ในอีกด้านหนึ่งของช่องว่างในพื้นที่ที่อยู่
ข้อเสียของวิธีการของฮาร์ดแวร์ก็คือว่ามันไม่น่าเชื่อถืออย่างเต็มที่เนื่องจากอาจมีการตรวจจับปริมาณมากเกินไปและไม่ตรวจจับอาร์เรย์ล้นที่ยังคงอยู่ภายในพื้นที่แอดเดรส
ในการตรวจจับอาร์เรย์ล้นเทคนิคซอฟต์แวร์อื่นคือนกขมิ้น : ใส่ค่าพิเศษที่ด้านบนของสแต็กหรือระหว่างเฟรมและตรวจสอบว่าค่านกขมิ้นไม่ได้เปลี่ยนเมื่อฟังก์ชั่นกลับมา นี่เป็นเทคนิคที่ไม่สมบูรณ์เนื่องจากการล้นอาจหลีกเลี่ยงนกขมิ้นทั้งหมดหรืออาจไม่ได้รับการตรวจพบเนื่องจากค่านกขมิ้นได้รับการกู้คืนตามเวลาที่ตรวจสอบ อย่างไรก็ตามมีประโยชน์ที่จะทำให้การใช้ประโยชน์จากช่องโหว่ด้านความปลอดภัยได้ยากขึ้น
วิธีที่ปลอดภัยและถูกที่สุดในการหลีกเลี่ยงการโอเวอร์โฟลว์แบบสแต็กคือการคำนวณจำนวนสแต็กที่โปรแกรมจะต้องใช้ก่อนเริ่มดำเนินการโดยการวิเคราะห์แบบสแตติก อย่างไรก็ตามวิธีนี้ไม่ได้ใช้งานได้จริง: จำนวนของสแต็กที่โปรแกรมต้องการนั้นไม่สามารถตัดสินใจได้โดยทั่วไปและขึ้นอยู่กับข้อมูลที่โปรแกรมจัดการ
¹ หลักการเดียวกันนอกจากนี้ยังสามารถนำมาใช้มีเพียง MPU หรือหน่วยความจำที่มีการป้องกันไม่ถ้ามีหัวข้อเดียวที่มีสแต็คที่ขอบของแมปทางกายภาพที่มีอยู่