Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Libsafe.

Рубрика: Безопасность -> Укрепляем Linux
Метки:
Среда, 3 июня 2009 г.
Просмотров: 4691

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, а потом запустить процесс:

# export LD_PRELOAD="$LD_PRELOAD:libsafe.so:libverify.so"

# httpd

     А как же производительность? А производительность, согласно тестам Avaya Labs, страдает всего на 10%, поэтому libsafe нужно считать оптималь­ным решением, не требующим перекомпиляции программ и не снижающим производительность приложений.