2009-09-21 25 views
16

Tôi đang làm việc trên một hệ thống thời gian chạy cho các chương trình song song có thể tận dụng bố cục không gian địa chỉ chung trên nhiều quy trình, có khả năng lây lan qua một vài (nghìn) nút. Nhiều lần, phần mềm được xây dựng cho môi trường này được chạy trên các hệ thống Linux có tính năng ngẫu nhiên địa chỉ được kích hoạt theo mặc định và người dùng có thể không muốn hoặc có thể vô hiệu hóa toàn bộ hệ thống (thông qua sysctl -w kernel.randomize_va_space=0 và tương tự). Điều này áp đặt một số hạn chế đối với các chương trình song song và có thể làm tổn thương hiệu suất. Vì vậy, chúng tôi muốn tìm ra cách vô hiệu hóa nó cho các tệp nhị phân mà chúng tôi xây dựng. Bảo mật không phải là vấn đề vì phần mềm này luôn chạy trong môi trường được kiểm soát.Làm thế nào để vô hiệu hoá ngẫu nhiên không gian địa chỉ cho một nhị phân trên Linux?

tôi đã tìm thấy tài liệu tham khảo để lá cờ khác nhau và các biến, giống như ET_EXEC, EF_AS_NO_RANDOM (dường như không bao giờ sáp nhập?) Và PF_RANDOMIZE, nhưng tôi không thể tìm thấy bất kỳ tài liệu mô tả những gì tôi có thể làm để thiết lập các cờ. Một câu trả lời lý tưởng sẽ cho tôi biết những gì biên dịch/assembler/linker cờ sẽ vô hiệu hóa ngẫu nhiên cho nhị phân kết quả, và những phiên bản của chuỗi công cụ/hạt nhân này hoạt động trên. Tiếp theo tốt nhất sẽ là một công cụ mà làm như vậy sau khi một nhị phân được xây dựng.

Vì tôi chắc chắn ai đó sẽ đề xuất, tôi đã biết rằng chúng tôi có thể thực hiện thay đổi này khi chạy với setarch -R, nhưng tốt hơn là ghi lại điều này trong tệp thực thi.

Có vẻ như paxctl -rx phải thực hiện thủ thuật, nhưng dường như không áp dụng cho phương pháp hiện tại được sử dụng trong hạt nhân không bao gồm các bản vá lỗi PaX.

Trả lời

14

Có lẽ bạn có một số loại daemon gọi các chương trình song song của bạn trên các nút. Nếu có, bạn có thể làm cho cha mẹ phổ biến này vô hiệu hóa ASLR cho bất kỳ tiến trình con nào mà nó tạo ra.

Tìm kiếm các nguồn GDB (7.0 hoặc CVS ​​Head) để biết cách thực hiện điều đó. Ý chính của nó là gọi personality(orig_personality|ADDR_NO_RANDOMIZE) sau fork và trước exec.

+0

Tôi sẽ điều tra và thử ngay bây giờ. – Novelocrat

+0

Dường như đã làm việc. Cảm ơn! – Novelocrat

1

Có một số lý do bạn không thể ánh xạ không gian shared memory hoặc sử dụng tên FIFO?

+1

Có. Chúng tôi đang chạy trên nhiều nút. – Novelocrat

0

Ít nhất một số phiên bản trước của ASLR trong hạt nhân Linux preserved offsets when forking. Thay vì vô hiệu hóa ngẫu nhiên cho các quy trình của bạn, bạn có thể sắp xếp chúng theo một hệ thống phân cấp quy trình cha/con để giữ các khoảng trống giống nhau giữa các phiên bản của nhị phân được phân chia bởi cùng một bậc cha mẹ không?

+1

Không, chúng tôi không thể, bởi vì các quá trình này đang chạy trên nhiều nút. Di chuyển chủ đề dễ dàng hơn nhiều khi chúng ta không phải nhảy qua các vòng để đồng bộ hóa không gian địa chỉ theo cách thủ công. – Novelocrat

Các vấn đề liên quan