GnuTLS исправляет ошибку неправильного управления памятью — обновите сейчас!

Исходный узел: 1603833

Самая известная криптографическая библиотека в мире с открытым исходным кодом почти наверняка OpenSSL.

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

Во-вторых, это, вероятно, наиболее широко разрекламированный, к сожалению, из-за довольно неприятной ошибки, известной как heartbleed который был обнаружен более восьми лет назад.

Несмотря на быстрое исправление (и несмотря на наличие надежных обходных путей для разработчиков, которые не могли или не хотели быстро обновлять свои уязвимые версии OpenSSL), Heartbleed остается своего рода «витринной» ошибкой, не в последнюю очередь потому, что это была одна из первых ошибок, которые были устранены. превратился его первооткрывателями в агрессивный пиар-аппарат.

Благодаря впечатляющему названию, собственному логотипу и специальному веб-сайту Heartbleed быстро стала глобальной кибербезопасностью. суперистория, и, к лучшему или к худшему, стал неразрывно связан с упоминанием имени OpenSSL, как если бы опасность ошибки оставалась даже после того, как она была удалена из кода.

Жизнь после OpenSSL

Но есть несколько других криптографических библиотек с открытым исходным кодом, которые широко используются наряду с OpenSSL или вместо него, в частности, Mozilla. NSS (Короче для Услуги сетевой безопасности) и проекта GNU GnuTLS библиотека.

Как оказалось, GnuTLS только что исправил ошибку, известную как CVE-2022-2509, сообщается в проекте обеспечение безопасности ГНУТЛС-СА-2022-07-07.

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

Двойное бесплатное объяснение

Проще говоря, уязвимость с двойным освобождением создается, когда программист просит операционную систему выделить блок памяти для временного использования…

…и возвращает его, чтобы его можно было удалить из списка заимствованных блоков, чтобы освободить его для использования другими частями программы…

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

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

Аккуратное обращение с упреждающе обнаруженным двойным освобождением — непростая задача. Функция C, возвращающая память, имеет прототип void free(void *ptr); чтобы вы передавали адрес блока, который хотите освободить, но не возвращали код возврата. (функция переменного тока с void возвращаемое значение — это то, что другие языки программирования называют procedure: он что-то делает для вас, но не может сообщить о результате.) Таким образом, даже тщательно написанный код на C не имеет стандартного способа обнаружить, что что-то пошло не так в free(), и, следовательно, нет способа обработать ошибку, пытаясь корректно завершить работу. Одностороннее завершение программы-нарушителя является единственным безопасным решением для системы.

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

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

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

Одна часть программы предполагает, что она может неявно доверять содержимому памяти, поскольку считает себя законным «владельцем» блока.

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

Делать неправильные вещи делает правильные вещи

По иронии судьбы, ошибка CVE-2022-2509 существует в коде проверки сертификата в GnuTLS.

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

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

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

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

Чтобы упростить и ускорить процесс проверки цепочки сертификатов, многие серверы не просто отправляют свои собственные сертификаты, а предоставляют браузеру возможность «догнать цепочку» до доверенного корня.

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

В этом случае GnuTLS правильно и безопасно проверит предоставленный сертификат, прежде чем освободить блок памяти, который только что использовался для его хранения.

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

…а затем снова освобождает его после завершения проверки.

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

Устранение сбоя для внедрения вредоносного ПО

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

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

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

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

Что делать?

Обновление до Последняя версия GnuTLS, который 3.7.7 на момент написания.

(Эта ошибка, по-видимому, появилась в GnuTLS 3.6.0 и существует с тех пор во всех версиях, вплоть до 3.7.6 включительно.)

Обратите внимание, что многие популярные приложения и наборы инструментов для программирования либо включают, либо могут быть созданы для использования GnuTLS, даже если вы можете не знать об этом, включая, но не ограничиваясь: FFmpeg, GnuPG, Mplayer, QEMU, Rdesktop, Samba, Wget, Wireshark и Zlib.

Многие пакеты Linux или *BSD, использующие GnuTLS, будут полагаться на центральную версию, управляемую самим вашим дистрибутивом, поэтому обязательно обновите ее, как только в вашем дистрибутиве появится эта версия.

Удачного исправления!


Отметка времени:

Больше от Голая Безопасность