1 Kẻ xâm nhập
3.11 Bảo vệ tràn bộ nhớ
Tràn bộ đệm được khai thác rộng rãi, có nhiều code có lỗ hổng đang dùng. Mặc dù nguyên nhân và các biện pháp chống đã biết. Có hai cách chống rộng rãi: chương trình mới được gia cố trong thời gian dịch và kiểm sốt tấn cơng chương trình đang có trong thời gian chạy.
Nếu sử dụng ngơn ngữ bậc cao với kiểu mạnh , thì sẽ khơng có lỗ hổng tràn bộ đệm. Chương trình dịch buộc kiểm tra cỡ và các thao tác cho phép trên các biến. Khi đó phải trả giá khi sử dụng nguồn và hạn chế truy cập đến phần cứng. Tuy nhiên vẫn cần một số code của các ngôn ngữ giống C.
Bảo vệ trong thời gian dịch
Thiết lập các kỹ thuật lập trình an tồn. Nếu sử dụng ngơn ngữ tiềm ẩn khơng an toàn như C, lập trình viên cần viết code an tồn một cách tường minh. Bằng thiết kế với code mới, sau khi xem xét code cũ. Xem an toàn tràn bộ đệm như tập con các kỹ thuật lập trình an tồn nói chung. Chú ý đến các lỗi nhỏ, kiểm tra đủ khơng gian trong bộ đệm bất kỳ.
Có đề nghị mở rộng an toàn cho C như tạo điểm phạt thực thi, cần dịch chương trình với chương trình dịch đặc biệt. Có một số phương án thư viện chuẩn an toàn, các hàm mới, như strlcpy(). Cài đặt lại an toàn hơn một số hàm chuẩn như thư viện động, chẳng hạn Libsafe.
Bổ sung code của chức năng nhập và thoát để kiểm tra ngăn xếp ghi nhận việc ghi đè, sử dụng yếu tố ngẫu nhiên như bảo vệ ngăn xếp, kiểm tra viết đè giữa biến cục bộ và con trỏ khung lưu trữ và địa chỉ trả về. Chương trình dừng nếu phát hiện thay
đổi. Phát hành: bản dịch lại, hỗ trợ phát hiện lỗi hoặc copy an toàn lưu trữ/kiểm tra địa chỉ trả về.
Bảo vệ trong thời gian chạy
Sử dụng hỗ trợ bộ nhớ ảo để tạo một số vùng bộ nhớ không thực thi được như stack, heap, global data. Cần hỗ trợ từ các phần cứng bộ nhớ như trong SPARC / Solaris systems, x86 Linux/Unix/Windows systems. Phát hành hỗ trợ cho code ngăn xếp thực thi, cần một số dự phòng đặc biệt.
Thao tác trên vị trí của các cấu trúc dữ liệu chính, sử dụng tịnh tiến ngẫu nhiên cho mỗi tiến trình, có vùng địa chỉ lớn trên các phương tiện của các hệ thống hiện đại chống các va chạm và đoán địa chỉ bộ đệm đích là khơng thể. Vị trí ngẫu nhiên cho bộ đệm heap và vị trí các hàm thư viện chuẩn. Đặt các trang bảo vệ giữa các vùng quan trọng của bộ nhớ, đặt cờ trong bộ nhớ như địa chỉ khơng hợp lệ. Có thể ngay cả đặt giữa các khung ngăn xếp và các bộ đệm heap trong thời gian thực thi và phải trả giá về khơng gian.
Có nhiều các phương án tấn công khác: phương án tràn ngăn xếp, tràn heap, tràn dữ liệu tổng thể, tràn xâu định dạng, tràn số nguyên. Có thể có nhiều hơn nữa được phát hiện trong tương lai. Một số khơng thể ngăn chặn trừ khi code an tồn lúc ban đầu.
Phương án tràn ngăn xếp chỉ viết đè bộ đệm và con trỏ khung lưu trữ trả về xảy ra nhưng đến khung giả trả về lời gọi hàm điều khiển bởi kẻ tấn cơng được dùng khi có tràn bộ đệm giới hạn. Ví dụ tách ra bởi một khung. Tuy có các hạn chế: cần biết địa chỉ chính xác của bộ đệm, hàm gọi thực hiện với khung giả, phương án tràn ngăn xếp thay địa chỉ trả về bằng hàm thư viện chuẩn để đáp lại sự bảo vệ ngăn xếp không thực thi. Kẻ tấn công xây dựng các tham số phù hợp trên ngăn xếp phía trên địa chi trả về. Kẻ tấn cơng có thể cần địa chỉ chính xác của bộ đệm, có thể ngay cả kết nối hai lời gọi thư viện.
Cũng có tấn cơng bộ đệm đặt trong heap. Thông thường đặt trên code của chương trình, bộ nhớ được yêu cầu bởi chương trình để sử dụng cho các cấu trúc dữ liệu động, ví dụ như danh sách móc nối. Khơng có địa chỉ trả về, nên khơng có chuyển giao quyền điều khiển dễ dàng. Có thể có con trỏ hàm để khai thác hoặc thao tác cấu trúc dữ liệu quản trị. Cách bảo vệ là dùng heap ngẫu nhiên và khơng thực thi.
Có thể tấn cơng bộ đệm đặt trong dữ liệu tổng thể. Có thể đặt phía trên code của chương trình. Nếu có con trỏ hàm và bộ đệm có lỗ hổng hoặc bảng quản trị các quá trình liền kề. Nhắm tới viết đè con trỏ hàm được gọi sau đó. Cách bảo vệ là dùng vùng dữ liệu tổng thể ngẫu nhiên và không thực thi, dịch chuyển con trỏ hàm, các trang bảo vệ.