Là một ngăn xếp tràn được phát hiện bởi phần cứng hoặc phần mềm?


26

Đây có phải là nhiệm vụ của phần mềm (hệ điều hành) để phát hiện tràn ngăn xếp hay là tràn ngăn xếp được phát hiện trong phần cứng, gây ra ngoại lệ trong CPU?


Tôi có thể nói phần cứng, thông qua lỗi MMU trên hầu hết các CPU. x86 ở chế độ 32 bit có phân đoạn ngoài phân trang và "Phân đoạn ngăn xếp" được liên kết, như các phân đoạn Code, Data, Ext ... với cả địa chỉ cơ sở và kích thước. Bất kỳ truy cập ngoài phạm vi đó sẽ gây ra lỗi.
TEMLIB

Câu trả lời:


25

Nó có thể là phần mềm, hoặc phần cứng, hoặc cả hai, hoặc không.

Có hai loại tràn: tràn khi phát triển ngăn xếp (khi nhập hàm) và tràn khi truy cập vào một mảng trên ngăn xếp. Tràn đầy khi phát triển ngăn xếp có thể được phát hiện bằng cách kiểm tra giới hạn khi nhập chức năng, để xác minh rằng có đủ chỗ (và có thể báo hiệu lỗi hoặc tăng ngăn xếp nếu không có). Tràn đầy khi truy cập một mảng trên ngăn xếp chỉ là một vấn đề trong các ngôn ngữ cấp thấp không xác minh giới hạn mảng; giải pháp đó là để xác minh giới hạn mảng.

Các phương pháp tiếp cận phần mềm này có lợi thế là chúng hoạt động hoàn toàn đáng tin cậy: bạn có thể chắc chắn rằng bất kỳ tràn ngăn xếp nào sẽ được phát hiện. Nhược điểm của chúng là tăng kích thước mã và thời gian thực hiện. Phần cứng có thể giúp đỡ bằng cách cung cấp một phương pháp để phát hiện hầu hết các lỗi tràn mà không mất phí miễn là không xảy ra tràn. Trên một kiến ​​trúc có MMU , môi trường thời gian chạy có thể sắp xếp để ánh xạ ngăn xếp trên một ranh giới trang, với trang tiếp theo vẫn chưa được ánh xạ.

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

Theo cách đó, nếu phần mềm cố gắng truy cập dữ liệu ngoài ranh giới trang (cho dù vì con trỏ ngăn xếp đã vượt ra ngoài ranh giới hoặc do truy cập mảng nằm ngoài giới hạn và vượt ra ngoài ranh giới), nó sẽ gây ra lỗi khi truy cập vào vùng không được ánh xạ . Điều này chỉ xảy ra nếu tràn quá nhỏ: nếu lượng tràn quá lớn, chương trình có thể sẽ truy cập vào các nội dung khác ở phía bên kia của khoảng trống trong không gian địa chỉ.

Nhược điểm của phương pháp phần cứng là nó không hoàn toàn đáng tin cậy do tràn một lượng lớn có thể không được phát hiện và nó không phát hiện ra các mảng tràn trong không gian địa chỉ.

Để phát hiện tràn mảng, một kỹ thuật phần mềm khác là canary : đặt một giá trị đặc biệt ở đầu ngăn xếp hoặc giữa các khung và kiểm tra xem giá trị canary không thay đổi khi trả về hàm. Đây cũng là một kỹ thuật không hoàn hảo vì tràn có thể tránh hoàn toàn chim hoàng yến hoặc có thể không được phát hiện vì giá trị chim hoàng yến đã được khôi phục vào thời điểm nó được kiểm tra. Tuy nhiên, nó rất hữu ích để làm cho việc khai thác một số lỗ hổng bảo mật trở nên khó khăn hơn.

Cách an toàn nhất và rẻ nhất để tránh tràn ngăn xếp là tính toán số lượng ngăn xếp mà chương trình sẽ cần trước khi bắt đầu thực hiện nó, bằng phân tích tĩnh. Tuy nhiên, điều này không phải lúc nào cũng thực tế: số lượng ngăn xếp cần thiết cho một chương trình nói chung là không thể giải quyết được và phụ thuộc vào dữ liệu mà chương trình thao túng.

¹ Nguyên tắc tương tự cũng có thể được áp dụng chỉ với một MPU, hoặc không có bảo vệ bộ nhớ nếu có một chủ đề duy nhất mà chồng là ở rìa của các ánh xạ vật lý hiện có.


4
Tôi sẽ không gọi mảng ngoài giới hạn truy cập tràn ngăn xếp, ngay cả khi mảng nằm trên ngăn xếp. Nó chỉ là một trường hợp đặc biệt của tràn bộ đệm.
CodeInChaos

Không phân bổ cho các mục ngăn xếp chính được tham chiếu liên quan đến con trỏ không chồng / khung hoặc bù không liên tục sẽ tránh tràn ngăn xếp truyền thống. Sử dụng ngăn xếp địa chỉ trả lại riêng (hoặc ngăn xếp tràn RA / đăng ký như Itanium) ít nhất sẽ làm giảm đáng kể các cơ hội lập trình hướng trở lại.
Paul A. Clayton

Truy cập ngoài giới hạn được gọi đúng hơn là vượt mức , không phải là tràn.
Ben Voigt

3
@ awesomebing1 không phải mọi nền tảng đều phát hiện tràn ngăn xếp. Bạn có thể kết thúc việc ghi đè bất cứ thứ gì sau ngăn xếp (tương tự như bất kỳ lỗi tràn bộ đệm nào khác).
dùng253751

1
@CodesInChaos, đôi khi tràn bộ đệm trong bộ đệm được cấp phát ngăn xếp được gọi là "tràn ngăn xếp" (gọi tắt là). Cấp, thuật ngữ đó có thể là một chút bối rối mà không có bối cảnh.
DW
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.