2012-02-22 29 views
13

Bằng cơ hội thuần túy, tôi tình cờ gặp một bài viết đề cập đến bạn có thể "kích hoạt" ASLR với -pie -fPIE (hoặc đúng hơn là, làm cho ứng dụng của bạn nhận thức ASLR). -fstack-protector cũng thường được đề xuất (mặc dù tôi hiếm khi thấy giải thích cách thức và chống lại loại tấn công nào nó bảo vệ).Cờ GCC hữu ích để cải thiện tính bảo mật cho các chương trình của bạn?

Có danh sách các tùy chọn và giải thích hữu ích về cách chúng tăng tính bảo mật không?

...

Và làm thế nào hữu ích là các biện pháp đó dù sao, khi ứng dụng của bạn sử dụng khoảng 30 thư viện sử dụng không ai trong số những người? ;)

+0

ASLR là gì? chúng ta có thể tìm thấy giải thích chi tiết về những lá cờ này và tác động hiệu quả của chúng ở đâu? – sree

Trả lời

4

Đối với câu hỏi cuối cùng của bạn:

Và làm thế nào hữu ích là các biện pháp đó dù sao, khi ứng dụng của bạn sử dụng khoảng 30 thư viện sử dụng không ai trong số những người? ;)

PIE chỉ cần thiết cho chương trình chính để có thể tải tại địa chỉ ngẫu nhiên. ASLR luôn hoạt động cho các thư viện được chia sẻ, do đó, lợi ích của PIE là giống nhau cho dù bạn đang sử dụng một thư viện được chia sẻ hoặc 100.

Ngăn xếp ngăn xếp sẽ chỉ mang lại lợi ích cho mã được bảo vệ ngăn xếp. chương trình sẽ không giúp đỡ nếu các thư viện của bạn có đầy đủ các lỗ hổng.

Trong mọi trường hợp, tôi sẽ khuyến khích bạn không xem xét các tùy chọn này một phần của ứng dụng của bạn, nhưng thay vào đó là một phần của toàn bộ tích hợp hệ thống. Nếu bạn đang sử dụng 30+ thư viện (có thể phần lớn là thư rác khi nói đến chất lượng mã và bảo mật) trong chương trình sẽ giao tiếp với dữ liệu không đáng tin cậy, có khả năng gây hại, bạn nên xây dựng toàn bộ hệ thống của mình với ngăn xếp bảo vệ và các tùy chọn bảo mật khác. Tuy nhiên, hãy nhớ rằng mức cao nhất là _FORTIFY_SOURCE và có lẽ một số tùy chọn bảo mật mới khác phá vỡ những điều hợp lệ, chương trình chính xác có thể cần phải thực hiện, và do đó bạn có thể cần phân tích xem có an toàn không . Một điều nguy hiểm mà một trong các tùy chọn thực hiện (tôi quên cái nào) là làm cho nó trở thành thông số %n thành printf không hoạt động, ít nhất là trong một số trường hợp nhất định. Nếu một ứng dụng đang sử dụng %n để có được một bù đắp vào một chuỗi được tạo ra và cần phải sử dụng bù đắp để sau này viết trong nó, và giá trị không được điền vào, đó là một lỗ hổng tiềm năng trong chính nó ...

5

Hardening page on the Debian wiki giải thích ít nhất các thẻ phổ biến nhất có thể sử dụng được trên Linux. Thiếu từ danh sách của bạn ít nhất là -D_FORTIFY_SOURCE = 2, -Wformat, -Wformat-security và đối với trình tải động, các tính năng relro và now.

+0

Đảm bảo không bao giờ sử dụng -D_FORTIFY_SOURCE = 2 không có -O1 (hoặc -O2, -O3, v.v.). Debian đã sửa lỗi này, nhưng một số bản phân phối thì không, và ở đó nó sẽ phá vỡ bản build trên -O0. IOW, không thêm -D_FORTIFY_SOURCE vào CPPFLAGS nơi thuộc tính. Thêm nó vào CFLAGS/CXXFLAGS cùng với tùy chọn -O1/-O2/-O3/-O6. – anonymous

5

Hardened Gentoo sử dụng các cờ:

CFLAGS="-fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2" 
LDFLAGS="-Wl,-z,now -Wl,-z,relro" 

tôi thấy khoảng 5-10% giảm hiệu suất so với tối ưu hóa Gentoo linux (bao gồm Pax/SELinux và các biện pháp khác, không chỉ CFLAGS.) trong bộ Phoronix chuẩn mặc định.

+1

Chỉ cần phần nào cập nhật câu trả lời này, tốt hơn nên sử dụng "-fstack-protector-strong" chỉ chèn chồng canaries trong các phiên đấu giá nơi tràn có thể thực sự xảy ra như trái ngược với mọi nơi. Kết quả này gần như là giảm thiểu SO hiệu quả theo cách chi phí ít hơn về mặt chi phí. – AoeAoe

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