Дистрибутив операционной системы с открытым исходным кодом OpenBSD хорошо известен среди системных администраторов, особенно тех, кто управляет серверами, благодаря тому, что он делает упор на безопасность, а не на скорость, функции и модные интерфейсы.
Вполне уместно, возможно, его логотип — рыба фугу — надутая, с шипами, готовая отразить любых коварных хакеров, которые могут появиться.
Но команда OpenBSD, вероятно, наиболее известна не всем своим дистрибутивом, а набором инструментов для удаленного доступа. OpenSSH который был написан в конце 1990-х годов для включения в саму операционную систему.
SSH, сокращение от безопасная оболочка, был первоначально создан финским ученым-компьютерщиком Тату Юленен в середине 1990-х в надежде отучить системных администраторов от рискованной привычки использовать протокол Telnet.
Проблема с Telnet
Telnet был удивительно прост и эффективен: вместо подключения физических проводов (или использования модема по телефонной линии) для установления телетайпного соединения с удаленными серверами вместо этого использовалось TELetype NETwork соединение.
По сути, данные, которые обычно передаются взад и вперед по выделенному последовательному соединению или телефонной линии с коммутируемым доступом, отправляются и принимаются через Интернет с использованием сетевого TCP-соединения с коммутацией пакетов вместо двухточечного соединения с коммутацией каналов. .
Та же знакомая система входа в систему, более дешевые соединения, отсутствие необходимости в выделенных линиях передачи данных!
Огромным недостатком Telnet, конечно же, было полное отсутствие шифрования, так что вынюхивание вашей точной терминальной сессии было тривиальным, что позволяло взломщикам видеть каждую введенную вами команду (даже сделанные вами ошибки и все случаи, когда вы нажимали [Backspace]
), и каждый байт произведенного вывода…
…и, конечно же, ваш логин и пароль в начале сеанса.
Любой на вашем сетевом пути может не только легко реконструировать ваши сеансы системного администратора в режиме реального времени на своем собственном экране, но, вероятно, также вмешиваться в ваш сеанс, изменяя команды, которые вы отправляли на удаленный сервер, и подделывая возвращаемые ответы, чтобы вы не заметили уловка.
Они могут даже настроить самозваный сервер, заманить вас на него и затруднить обнаружение обмана.
Сильное шифрование FTW
Целью SSH Илонена было добавить уровень надежного шифрования и аутентификации на каждом конце сеанса, подобного Telnet, создавая безопасная оболочка (вот что означает это имя, если вы когда-нибудь задумывались, хотя почти все называют его просто эс-эс-аитч В эти дни).
Это мгновенно стало хитом, и системные администраторы повсеместно быстро приняли протокол.
OpenSSH вскоре последовал, как мы упоминали выше, впервые появившись в конце 1999 года как часть ОпенБСД 2.6 отпустить.
Команда OpenBSD хотела создать бесплатную, надежную реализацию протокола с открытым исходным кодом, которую они и кто-нибудь еще может использовать, без каких-либо лицензионных или коммерческих осложнений, которые обременяли первоначальную реализацию Ylonen сразу после ее выпуска.
Действительно, если вы запустите сервер Windows SSH и подключитесь к нему с компьютера Linux прямо сейчас, вы почти наверняка будете полагаться на реализацию OpenSSH на обоих концах.
Протокол SSH также используется в других популярных службах клиент-сервер, включая SCP и SFTP, сокращенно защищенная копия и безопасный FTP соответственно. SSH в общих чертах означает «безопасное подключение и запуск командной оболочки на другом конце», как правило, для интерактивного входа в систему, поскольку программа Unix для командной оболочки обычно /bin/sh
. SCP аналогичен, но для файлов CoPying, потому что команда копирования файлов Unix обычно называется /bin/cp
, и SFTP названы почти так же.
OpenSSH — не единственный набор инструментов SSH в городе.
Другие известные реализации включают: libssh2, для разработчиков, которые хотят встроить поддержку SSH прямо в свои приложения; Медвежонок, урезанный SSH-сервер от австралийского программиста Мэтт Джонстон это широко распространено на так называемых устройствах IoT (Интернет вещей), таких как домашние маршрутизаторы и принтеры; и PuTTY, популярный бесплатный набор инструментов, связанных с SSH, для Windows от независимого разработчика с открытым исходным кодом. Саймон Тэтхэм в Англии.
Но если вы являетесь постоянным пользователем SSH, вы почти наверняка сегодня подключались по крайней мере к одному серверу OpenSSH, не в последнюю очередь потому, что большинство современных дистрибутивов Linux включают его в качестве стандартного инструмента удаленного доступа, а Microsoft предлагает как клиент OpenSSH, так и OpenSSH. сервер в качестве официальных компонентов Windows в наши дни.
Двойное бесплатное исправление ошибок
OpenSSH версии 9.2 только что вышел, и выпуск сообщить следующее:
Этот выпуск содержит исправления для […] проблемы с безопасностью памяти. [Эта ошибка] не считается эксплуатируемой, но мы сообщаем о большинстве доступных по сети сбоев памяти как об ошибках безопасности.
Ошибка влияет sshd
, сервер OpenSSH ( -d
суффикс означает демон, имя Unix для фонового процесса, который Windows называет обслуживание):
СШД(8): исправить ошибку двойного освобождения памяти перед аутентификацией, появившуюся в OpenSSH 9.1. Считается, что это невозможно использовать, и это происходит в непривилегированном процессе предварительной аутентификации, который подвергается chroot (2) и дополнительно изолирован на большинстве основных платформ.
Ошибка с двойным освобождением означает, что блок памяти, который вы уже вернули в операционную систему, для повторного использования в других частях вашей программы…
…позже будет возвращено той частью программы, которая на самом деле больше не «владеет» этой памятью, но не знает, что это не так.
(Или намеренно возвращены по запросу кода, который намеренно пытается спровоцировать ошибку, чтобы превратить уязвимость в эксплуатировать.)
Это может привести к незаметным и трудноразрешимым ошибкам, особенно если система помечает освобожденный блок как доступный при первом запуске. free()
происходит, позже выделяет его другой части вашего кода, когда он запрашивает память через malloc(
), а затем снова помечает блок как свободный, когда лишний вызов free()
появляется.
Это оставляет вас в ситуации, похожей на то, что вы испытываете, когда регистрируетесь в отеле, который говорит: «О, хорошие новости! Мы думали, что наелись, но другой гость просто решил выехать пораньше, чтобы вы могли занять его номер».
Даже если комната аккуратно убрана и подготовлена для новых постояльцев, когда вы входите, и, таким образом, выглядит так, как будто она была правильно выделена для вашего исключительного использования, вы все равно должны верить, что ключ-карта предыдущего гостя действительно была правильно аннулирована, и что их « ранний выезд» не было хитрой уловкой, чтобы прокрасться позже в тот же день и украсть ваш ноутбук.
Исправление ошибки для исправления ошибки
По иронии судьбы, если вы посмотрите на недавнюю историю кода OpenSSH, вы увидите, что в OpenSSH была скромная ошибка в функции, называемой compat_kex_proposal()
, используемый для проверки того, какой алгоритм обмена ключами следует использовать при настройке соединения.
Но исправление этой скромной ошибки вместо этого привело к более серьезной уязвимости.
Кстати, наличие бага в той части ПО, которая используется при настройке соединения, делает это так называемым доступная по сети предварительная аутентификация уязвимость (или ошибка предварительной аутентификации коротко).
Ошибка двойного освобождения возникает в коде, который необходимо запустить. после клиент инициировал удаленный сеанс, но до любое соглашение о ключах или аутентификация имели место, поэтому теоретически уязвимость может быть активирована до того, как какие-либо пароли или криптографические ключи будут представлены для проверки.
В OpenSSH 9.0, compat_kex_proposal
выглядело примерно так (здесь сильно упрощено):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Идея состоит в том, что вызывающий абонент передает свой собственный блок памяти, содержащий текстовую строку, предлагающую настройку обмена ключами, и возвращает либо разрешение на использование самого предложения, которое он отправил, либо вновь выделенную текстовую строку с обновленным предложением. .
Ошибка в том, что если условие 1 ложно, но условия 2 и 3 истинны, код выделяет два новые текстовые строки, но возвращает только one.
Блок памяти, выделенный allocatenewstring1()
никогда не освобождается, а когда функция возвращается, ее адрес памяти теряется навсегда, поэтому никакой код не может free()
это в будущем.
Этот блок по существу заброшен, вызывая то, что известно как утечка памяти.
Со временем это может привести к проблемам, возможно, даже к отключению сервера для восстановления после перегрузки памяти.
В OpenSSH 9.1 код был обновлен, чтобы избежать выделения двух строк, но отказавшись от одной из них:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }
Это ошибка двойного освобождения, потому что если условие 1 и условие 2 оба ложны, но условие 3 истинно, тогда код выделяет новую строку для отправки обратно в качестве ответа…
… но неправильно освобождает строку, которую изначально передал вызывающий, потому что функция allocatenewstring1()
никогда не вызывается для обновления переменной suggestion
.
Передаваемая строка предложения это память, которая принадлежит вызывающему абоненту, и что вызывающий поэтому освободит себя позже, что приведет к опасности двойного освобождения.
В OpenSSH 9.2 код стал более осторожным, отслеживая все три возможных используемых блока памяти: исходный suggestion
(память принадлежит кому-то другому) и две возможные новые строки, которые могут быть выделены по пути:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }
Если условие 1 истинно, используется новая копия переданной строки, поэтому вызывающая сторона может позже free()
память их переданной строки, когда они захотят.
Если мы преодолели условие 1, и условие 2 истинно, но условие 3 ложно, то альтернативное внушение, созданное allocatenewstring1()
возвращается, а сданный suggestion
строка остается одна.
Если условие 2 ложно, а условие 3 истинно, то генерируется и возвращается новая строка, а переданная suggestion
строка остается одна.
Если и условие 2, и условие 3 истинны, то по пути выделяются две новые строки; первый освобождается, потому что он не нужен; возвращается второй; и сданный suggestion
строка остается одна.
Вы можете РТхМ чтобы подтвердить, что если вы позвоните free(newone)
когда newone
is NULL
, то «операция не выполняется», потому что всегда безопасно free(NULL)
. Тем не менее, многие программисты по-прежнему надежно защищаются от этого с помощью такого кода, как if (ptr != NULL) { free(ptr); }
.
Что делать?
Как предполагает команда OpenSSH, использовать эту ошибку будет сложно, не в последнюю очередь из-за ограниченных привилегий, которые sshd
программа имеет, пока она настраивает соединение для использования.
Тем не менее, они сообщили об этом как о дыре в безопасности, потому что это так, поэтому убедитесь, что вы обновились до OpenSSH 9.2.
И если вы пишете код на C, помните, что независимо от того, насколько вы опытны, в управлении памятью легко ошибиться…
… так что будьте осторожны там.
(Да, Rust и его современные друзья будут помогите написать правильный код, но иногда вам все равно придется использовать C, и даже Rust не может гарантировать прекратить писать неправильный код если вы программируете неразумно!)
- SEO-контент и PR-распределение. Получите усиление сегодня.
- Платоблокчейн. Интеллект метавселенной Web3. Расширение знаний. Доступ здесь.
- Источник: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- выше
- Absolute
- доступ
- на самом деле
- адрес
- принял
- После
- против
- алгоритм
- Все
- выделено
- выделяет
- Позволяющий
- в одиночестве
- уже
- альтернатива
- Несмотря на то, что
- всегда
- среди
- и
- Другой
- Приложения
- утверждение
- австралийский
- Аутентификация
- автор
- автоматический
- доступен
- назад
- фон
- Фоновое изображение
- , так как:
- становиться
- до
- распространенной
- ЛУЧШЕЕ
- Заблокировать
- Блоки
- граница
- Дно
- Ошибка
- ошибки
- строить
- призывают
- под названием
- гость
- Объявления
- заботится
- Вызывать
- Причинение
- осторожный
- Центр
- конечно
- более дешевый
- проверка
- клиент
- код
- кодер
- лыжных шлемов
- цвет
- COM
- как
- приход
- коммерческая
- компоненты
- компьютер
- состояние
- Условия
- подтвердить
- Свяжитесь
- подключенный
- Соединительный
- связи
- Коммутация
- содержит
- современный
- копирование
- может
- курс
- чехол для варгана
- Создайте
- создали
- Создающий
- криптографический
- ОПАСНО!
- данным
- день
- Дней
- решенный
- преданный
- Застройщик
- застройщиков
- Устройства
- DID
- Умереть
- трудный
- Дисплей
- распределение
- распределения
- не
- дважды бесплатно
- вниз
- в течение
- каждый
- Рано
- легко
- Эффективный
- или
- шифрование
- окончания поездки
- Англия
- Весь
- особенно
- по существу
- Даже
- НИКОГДА
- Каждая
- все члены
- Эксклюзивные
- опыт
- опытные
- знакомый
- Особенности
- Файлы
- First
- Рыба
- фиксированный
- недостаток
- поток
- Фокус
- следует
- следующим образом
- навсегда
- найденный
- Бесплатно
- друзья
- от
- полный
- функция
- далее
- будущее
- в общем
- генерируется
- получить
- гигант
- Go
- хорошо
- значительно
- гарантия
- Охрана
- GUEST
- Хакеры
- происходит
- Жесткий
- высота
- здесь
- история
- Удар
- Отверстие
- Главная
- надежды
- Гостиница
- зависать
- Как
- HTML
- HTTPS
- идея
- немедленно
- реализация
- in
- В других
- включают
- В том числе
- включение
- неверно
- Инди
- мгновение
- вместо
- интерактивный
- Интернет
- Интернет вещей
- выпустили
- КАТО
- Iot (интернет вещей)
- IT
- саму трезвость
- хранение
- ключи
- Знать
- известный
- Отсутствие
- портативный компьютер
- Поздно
- слой
- вести
- ведущий
- Лицензирование
- Ограниченный
- линия
- LINK
- Linux
- логотип
- дольше
- посмотреть
- смотрел
- ВЗГЛЯДЫ
- сделанный
- основной
- сделать
- ДЕЛАЕТ
- управлять
- управление
- Маржа
- Вопрос
- макс-ширина
- означает
- Память
- упомянутый
- Microsoft
- может быть
- ошибки
- Модерн
- БОЛЕЕ
- самых
- имя
- Названный
- Необходимость
- необходимый
- потребности
- сеть
- Тем не менее
- Новые
- "обычные"
- Предложения
- Официальный представитель в Грузии
- ONE
- открытый
- с открытым исходным кодом
- операционный
- операционная система
- операция
- заказ
- оригинал
- первоначально
- Другое
- собственный
- принадлежащих
- часть
- части
- Прошло
- проходит
- Пароль
- пароли
- мимо
- путь
- Пол
- возможно
- Телефон
- физический
- Часть
- Платформы
- Платон
- Платон Интеллектуальные данные
- ПлатонДанные
- Популярное
- должность
- возможное
- Блог
- подготовленный
- присутствие
- представлены
- предыдущий
- привилегии
- вероятно
- Проблема
- процесс
- FitPartner™
- Программисты
- должным образом
- протокол
- цель
- быстро
- готовый
- реальные
- реального времени
- получила
- последний
- Recover
- регулярный
- освободить
- складская
- помнить
- удаленные
- удаленный доступ
- отчету
- Сообщается
- соответственно
- возвращают
- Возвращает
- рискованный
- Комната
- Run
- Ржавчина
- безопасный
- Сохранность
- то же
- Ученый
- экран
- Во-вторых
- безопасно
- безопасность
- последовательный
- Услуги
- Сессия
- сессиях
- набор
- установка
- установка
- тяжелый
- Оболочка
- Короткое
- выключать
- аналогичный
- просто
- упрощенный
- ситуация
- стащить
- So
- Software
- твердый
- Кто-то
- удалось
- Скоро
- Источник
- скорость
- шипы
- Спотовая торговля
- стандарт
- стоит
- Начало
- По-прежнему
- сильный
- предмет
- такие
- Предлагает
- поддержка
- SVG
- система
- взять
- команда
- Терминал
- Ассоциация
- The Block
- их
- Там.
- следовательно
- вещи
- мысль
- три
- время
- раз
- Название
- в
- сегодня
- инструментом
- Инструментарий
- инструменты
- топ
- Всего
- трек
- переход
- прозрачный
- срабатывает
- беда
- правда
- Доверие
- ОЧЕРЕДЬ
- типично
- Юникс
- Обновление ПО
- обновление
- URL
- использование
- Информация о пользователе
- обычно
- Проверка
- версия
- с помощью
- уязвимость
- стремятся
- известный
- Что
- в то время как
- КТО
- широко
- будете
- окна
- без
- бы
- записывать
- письмо
- письменный
- лет
- ВАШЕ
- зефирнет