Уязвимость Ghost – перекомпиляция программ на C/C++?

Вопрос или проблема

У меня есть сервер CentOS 6.0 с glibc-2.12-1.7.el6.x86_64, на котором запущены многие сервисы с открытым исходным кодом и некоторые из моих собственных программ на C.

Чтобы устранить уязвимость ghost, мне нужно обновить его до glibc-2.12-1.149.el6_6.5.

Так как разница в версиях кажется значительной.

Я задавался вопросом, нужно ли мне перекомпилировать мои приложения на C/C++ или даже некоторые из сервисов с открытым исходным кодом?
Как даже протестировать их, потому что протестировать все практически невозможно?

Я читал, что некоторые люди были вынуждены откатить обновление, потому что столкнулись с сегментационными ошибками в своих приложениях.

Приложения Linux почти всегда используют динамическую линковку с библиотекой C, что означает, что она не скомпилирована в них – она подключается во время выполнения. Это означает, что если вы обновили библиотеку C, вам не нужно ничего больше делать.

Однако, хотя это было бы очень необычно, это не невозможно, чтобы вещи были собраны со статически связанной glibc. Лучше всего просто обратиться к документации для конкретного приложения. Если это так, это почти наверняка будет явно указано.

Вы можете проверить исполняемые файлы с помощью file. Он должен сказать “dynamically linked” в выводе. Я думаю, что все еще возможно, чтобы такой бинарный файл тогда включал статическую glibc – но это было бы невероятно запутанно. Способ двойной проверки будет следующим:

ldd whatever | grep libc.so

Где whatever – это бинарный файл, который вы хотите проверить. Вы должны получить какой-то вывод. Если нет, оставьте комментарий здесь, чтобы я мог съесть свою шляпу, потому что я не верю, что кто-то создаст такую вещь.

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

Я читал, что некоторые люди были вынуждены откатить обновление, потому что столкнулись с сегментационными ошибками в своих приложениях.

Я тоже видел это из вторых и третьих рук. Однако я не видел фактического описания такого случая. Честно говоря, я думаю, что это очень маловероятно.

Во-первых, Red Hat Enterprise Linux сохраняет базу своих пакетов так долго, как это возможно, и поддерживает строгую двоичную совместимость. Если вы проанализируете версии glibc, 2.12-1.7.el6.x86_64 против 2.12-1.149.el6_6.5 (предположительно здесь отсутствует .x86_64), у вас получится, что это версия 2.12 для обеих версий, локальная (RHEL) версия 1.7 против 1.149 (т.е., около 142 наборов исправлений). Одна из них для el6 (т.е., RHEL 6), другая для el6_6.5 (т.е., 5-й раунд обновлений, включенных в “новый выпуск” RHEL 6). Они должны быть очень близки, никаких заметных различий для пользователя, кроме исправлений ошибок, разумеется.

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

Программы со статической линковкой содержат код библиотеки (что становится все более редким!) могут быть уязвимы если они используют поврежденный код в библиотеке.

Ответ или решение

Для устранения уязвимости Ghost на вашем сервере CentOS 6.0 с установленной версией библиотеки glibc 2.12-1.7.el6.x86_64 необходимо обновить библиотеку до версии glibc 2.12-1.149.el6_6.5. Возникает вопрос: нужно ли перекомпилировать C/C++ программы и некоторые open source сервисы после такого обновления?

Теория

Большинство приложений Linux используют динамическую компоновку с C-библиотекой, что означает, что библиотека связывается на этапе выполнения, а не компилируется в бинарный файл. Это позволяет приложениям автоматически использовать исправления библиотек после их обновления, без необходимости перекомпиляции.

Однако в редких случаях программы могут быть статически скомпилированы с библиотекой glibc, то есть библиотека встраивается в исполняемый файл при компиляции. Если обновление библиотеки было значительным, возможно, статически скомпилированные приложения потребуют перекомпиляции, если они используют уязвимый код.

Пример

В вашем случае, различие между версиями больших изменений не предполагает. Оба пакета являются производными от версии 2.12 библиотеки glibc, но одна из них включает 142 набора патчей. Red Hat стремится сохранять бинарную совместимость, что сводит к минимуму вероятность возникновения новых проблем после обновления.

Применение

Для проверки, используют ли ваши приложения динамическую или статическую линковку, можно воспользоваться командой file, чтобы определить характер линковки:

file <имя_файла>

Эта команда покажет, является ли файл динамически или статически связанным. Если вы хотите удостовериться, что приложение использует динамическую версию glibc, выполните команду:

ldd <имя_файла> | grep libc.so

Если эта команда возвращает путь к glibc, значит, ваше приложение динамически связано.

Если обнаружите статически скомпилированные программы или библиотеки, возможно, потребуется их перекомпиляция, чтобы учесть обновления безопасности из новой версии glibc.

Несмотря на то, что были сообщения о возникновении сбоев после обновлений, таких как сегментационные ошибки, они редки и часто касаются специфических случаев. При наличии сомнений в стабильности рекомендую провести тестирование критически важных приложений в защищённой среде перед внедрением в производственной системе.

Так вы сможете минимизировать риски и обеспечить стабильность серверной инфраструктуры после обновления.

Оцените материал
Добавить комментарий

Капча загружается...