Libsafe.
Libsafe от Avaya Labs решает проблему переполнения буфера совершенно другим способом. Libsafe предоставляет абсолютно прозрачный метод, не требующий пересборки существующих программ, что представляется огромным преимуществом этого метода.
Кроме удобства (ведь можно не пересобирать всю систему), дополнительным преимуществом представляется то, что не обязательны исходные коды программы - ведь исходные коды некоторых программ просто невозможно достать, следовательно, их нельзя защитить предыдущим методом.
Libsafe - это, как понятно из названия, специальная динамически загружаемая библиотека, состоящая из двух частей: libsafe и libverify. Обе части могут употребляться независимо друг от друга или же одновременно друг с другом.
- Libsafe - перехватывает вызовы к функциям, способным вызвать переполнение буфера (например, strcpy), и вместо них вызывает свои собственные, безопасные, версии. Для реализации данного метода надо оценить верхние и нижние границы размера объекта. Потому что это невозможно вычислить во время компиляции программы (размер буфера еще неизвестен), вычисление производится сразу после вызова функции. Вычислив границы буфера, безопасная версия функции теперь может сгенерировать ошибку в случае переполнения буфера.
- Libverify - эта библиотека защищает адрес возврата, используя технику проверочных значений, подобную той, которая использовалась в StackGuard. Но само применение этой техники несколько отличается. В StackGuard во время компиляции вставляется структура проверочного значения (а не само значение!), a libverify записывает проверочное значение непосредственно в память процесса во время выполнения. В качестве проверочного значения используется значение защищаемого адреса возврата. Потому что хакер в состоянии предположить адрес возврата, libverify тоже проверяет, изменилось ли значение RET или нет.
Реализация.
Библиотека libsafe доступна по адресу http://www.research.avayalabs.com/protect/libsafe/. Как уже было отмечено, libsafe и libverify - динамически загружаемые библиотеки (DLL) и могут быть загружены с помощью функции предварительной загрузки ELF-файлов.
Для данного обе библиотеки или одну из них (если нужна только одна) можно прописать в файле /etc/ld.so.preload. Любые библиотеки, указанные в этом файле, будут загружены при выполнении любого приложения, использующего динамические библиотеки. Надо тоже загружать библиотеку для определенного процесса, установив переменную окружения LDPRELOAD, а потом запустить процесс:
# httpd
А как же производительность? А производительность, согласно тестам Avaya Labs, страдает всего на 10%, поэтому libsafe нужно считать оптимальным решением, не требующим перекомпиляции программ и не снижающим производительность приложений.