Подтвердить что ты не робот

Полезные флаги GCC для повышения безопасности ваших программ?

По чистой случайности я наткнулся на статью, в которой упоминается, что вы можете "включить" ASLR с помощью -pie -fPIE (или, скорее, сделать ваше приложение ASLR-осведомленным). -fstack-protector также рекомендуется (хотя я редко вижу объяснения, как и против каких видов атак он защищает).

Есть ли список полезных опций и объяснений, как они повышают безопасность?

...

И насколько полезны такие меры в любом случае, когда ваше приложение использует около 30 библиотек, которые не используют ни один из них?;)

4b9b3361

Ответ 1

Что касается вашего последнего вопроса:

И насколько полезны такие меры в любом случае, когда ваше приложение использует около 30 библиотек, которые не используют ни один из них?;)

PIE необходим только для того, чтобы основная программа могла быть загружена на случайный адрес. ASLR всегда работает для разделяемых библиотек, поэтому преимущество PIE одинаково, независимо от того, используете ли вы одну общую библиотеку или 100.

Защитник стека будет полезен только для кода, скомпилированного с помощью стекового защитника, поэтому его использование только в вашей основной программе не поможет, если ваши библиотеки полны уязвимостей.

В любом случае, я бы посоветовал вам не рассматривать эти варианты части вашего приложения, а вместо этого часть всей системной интеграции. Если вы используете 30 + библиотеки (возможно, большинство из них являются нежелательными, когда речь заходит о качестве и безопасности кода) в программе, которая будет взаимодействовать с ненадежными потенциально вредоносными данными, было бы неплохо построить всю вашу систему с защитой стека и другими вариантами упрочнения.

Однако имейте в виду, что наивысшие уровни _FORTIFY_SOURCE и, возможно, некоторые другие новые параметры безопасности ломают действительные действия, которые могут быть законными, исправлять программы, возможно, вам придется проанализировать, может ли это быть безопасным для использования их. Одна известная-опасная вещь, которую делает один из вариантов (я забываю, что) делает так, чтобы спецификатор %n на printf не работал, по крайней мере, в некоторых случаях. Если приложение использует %n для получения смещения в сгенерированную строку и должно использовать это смещение для последующей записи в нем, а значение не заполняется, что потенциальная уязвимость сама по себе...

Ответ 2

Страница Hardening на вики-странице Debian объясняет, по крайней мере, большинство общедоступных, которые можно использовать в Linux. Отсутствует из вашего списка как минимум -D_FORTIFY_SOURCE = 2, -Wformat, -Wformat-security, а для динамического загрузчика - функции relro и now.

Ответ 3

Затвердевший Gentoo использует эти флаги:

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

Я видел падение производительности на 5-10% по сравнению с оптимизированным Gentoo linux (включая PaX/SElinux и другие меры, а не только CFLAGS) в стандартном наборе тестов phoronix.