Что касается вашего последнего вопроса:
И насколько полезны такие меры в любом случае, когда ваше приложение использует около 30 библиотек, которые не используют ни одну из них? ;)
PIE необходим только для загрузки основной программы по произвольному адресу. ASLR всегда работает для разделяемых библиотек, поэтому преимущество PIE одинаково, независимо от того, используете ли вы одну разделяемую библиотеку или 100.
Защитник стека будет полезен только к коду, скомпилированному с защитником стека, поэтому его использование только в основной программе не поможет, если в ваших библиотеках полно уязвимостей.
В любом случае, я бы посоветовал вам не рассматривать эти опции как часть вашего приложения, а вместо этого - интеграцию всей системы. Если вы используете более 30 библиотек (вероятно, большинство из которых являются ненужными, когда речь идет о качестве и безопасности кода) в программе, которая взаимодействует с ненадежными, потенциально вредоносными данными, было бы хорошей идеей построить всю вашу систему с защитой стека и другими вариантами усиления безопасности.
Имейте в виду, однако, что самые высокие уровни _FORTIFY_SOURCE
и, возможно, некоторые другие новые параметры безопасности нарушают действительные вещи, которые могут потребоваться легитимным, корректным программам, и, таким образом, вам может потребоваться проанализировать, безопасно ли использовать их. Одна известная и опасная вещь, которую делает один из параметров (я забыл, какой), - это то, что спецификатор %n
для printf
не работает, по крайней мере, в некоторых случаях. Если приложение использует %n
для получения смещения в сгенерированной строке и должно использовать это смещение для последующей записи в него, а значение не заполнено, это потенциальная уязвимость сама по себе ...