Дистрибутив операційної системи з відкритим вихідним кодом OpenBSD добре відомий серед системних адміністраторів, особливо тих, хто керує серверами, завдяки зосередженості на безпеці, а не на швидкості, функціях і модних інтерфейсах.
Можливо, цілком доречно, що його логотип — це надута риба-фугу з шипами, готовими дати відсіч будь-яким хитрим хакерам, які можуть зустрітися.
Але команда OpenBSD, ймовірно, найбільш відома не своїм дистрибутивом, а набором інструментів віддаленого доступу OpenSSH який був написаний наприкінці 1990-х років для включення в саму операційну систему.
SSH, скорочення від безпечна оболонка, спочатку був створений фінським комп’ютерним вченим Тату Юленен в середині 1990-х в надії відучити системних адміністраторів від ризикованої звички використовувати протокол Telnet.
Проблема з Telnet
Telnet був надзвичайно простим і ефективним: замість з’єднання фізичних проводів (або використання модему через телефонну лінію) для встановлення телетайпного з’єднання з віддаленими серверами ви використовували з’єднання TELetype NETwork.
По суті, дані, які зазвичай передавали туди-сюди через виділене послідовне з’єднання або комутовану телефонну лінію, надсилалися та отримувалися через Інтернет за допомогою мережевого з’єднання TCP із комутацією пакетів замість зв’язку «точка-точка» з комутацією каналів. .
Та сама знайома система входу, дешевше підключення, немає потреби у виділених лініях передачі даних!
Величезною вадою Telnet, звісно, була повна відсутність шифрування, тому виявити точний сеанс терміналу було тривіально, дозволяючи зломщикам бачити кожну команду, яку ви вводите (навіть помилки, які ви зробили, і всі натискання [Backspace]
), і кожен байт виведеного результату...
…і, звичайно, ваше ім’я користувача та пароль на початку сеансу.
Будь-хто на вашому мережевому шляху міг би не лише легко реконструювати ваші сеанси системного адміністратора в режимі реального часу на власному екрані, але, ймовірно, також втрутитися у ваш сеанс, змінюючи команди, які ви надсилаєте на віддалений сервер, і фальсифікуючи відповіді, які повертаються, щоб ви не помітили виверт.
Вони навіть можуть створити сервер-самозванець, заманити вас на нього та напрочуд ускладнити вам виявлення обману.
Надійне шифрування FTW
SSH Ylönen мав на меті додати рівень надійного шифрування та автентифікації на кожному кінці Telnet-подібного сеансу, створюючи безпечна оболонка (саме це означає назва, якщо ви коли-небудь замислювалися, хоча майже всі просто називають це ес-ес-айч ці дні).
Це миттєво стало хітом, і протокол швидко прийняли сисадміни всюди.
Невдовзі з’явився OpenSSH, як ми згадували вище, вперше з’явившись наприкінці 1999 року як частина OpenBSD 2.6 звільнення.
Команда OpenBSD хотіла створити безкоштовну, надійну реалізацію протоколу з відкритим кодом будь-хто інший може використати, без будь-яких ліцензійних чи комерційних ускладнень, які обтяжували початкову реалізацію Ylönen у роки одразу після її випуску.
Дійсно, якщо ви зараз запустите сервер Windows SSH і підключитеся до нього з комп’ютера Linux, ви майже напевно будете покладатися на реалізацію OpenSSH на обох кінцях.
Протокол SSH також використовується в інших популярних клієнт-серверних службах, включаючи SCP і SFTP, скорочення від захищена копія та безпечний FTP відповідно. SSH у загальній формі означає «безпечне підключення та виконання команди SShell на іншому кінці», як правило, для інтерактивного входу, оскільки програма Unix для командної оболонки зазвичай /bin/sh
. SCP подібний, але для копіювання файлів, оскільки команда Unix file-copy зазвичай викликається /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 викликає a обслуговування):
sshd(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 істинні, код розподіляє два нові текстові рядки, але лише повертає один.
Блок пам'яті, виділений allocatenewstring1()
ніколи не звільняється, а коли функція повертається, її адреса пам’яті втрачається назавжди, тому будь-який код не може free()
це в майбутньому.
Цей блок фактично покинутий, що спричинило те, що відомо як a витік пам'яті.
З часом це може спричинити проблеми, можливо, навіть змусити сервер вимкнутися, щоб відновити перевантаження пам’яті.
У 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
рядок залишається окремо.
Ти можеш RTxM щоб підтвердити це, якщо ви зателефонуєте free(newone)
коли newone
is NULL
, то «операція не виконується», оскільки це завжди безпечно free(NULL)
. Тим не менш, багато програмістів все ще надійно захищаються від цього за допомогою такого коду, як if (ptr != NULL) { free(ptr); }
.
Що ж робити?
Як припускає команда OpenSSH, використати цю помилку буде важко, не в останню чергу через обмежені привілеї, які sshd
програма має під час налаштування підключення для використання.
Тим не менш, вони повідомили про це як про дірку в безпеці, тому що це так, тож переконайтеся, що ви оновили до OpenSSH 9.2.
І якщо ви пишете код на C, пам’ятайте, що незалежно від того, наскільки ви досвідчені, керування пам’яттю легко помилитися…
…так що будьте обережні.
(Так, Rust і його сучасні друзі будуть допомогти вам написати правильний код, але інколи вам все одно доведеться використовувати C, і навіть Rust не може гарантувати не писати неправильний код якщо ви програмуєте нерозумно!)
- Розповсюдження контенту та PR на основі SEO. Отримайте посилення сьогодні.
- Платоблокчейн. Web3 Metaverse Intelligence. Розширені знання. Доступ тут.
- джерело: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/
- 1
- 1999
- 9
- a
- вище
- абсолют
- доступ
- насправді
- адреса
- прийнята
- після
- проти
- алгоритм
- ВСІ
- виділено
- виділяє
- Дозволити
- тільки
- вже
- альтернатива
- хоча
- завжди
- серед
- та
- Інший
- застосування
- твердження
- Австралійський
- Authentication
- автор
- автоматичний
- доступний
- назад
- фон
- фонове зображення
- оскільки
- ставати
- перед тим
- вважається,
- КРАЩЕ
- Блокувати
- блоки
- border
- дно
- Помилка
- помилки
- будувати
- call
- званий
- гість
- Виклики
- який
- Викликати
- викликаючи
- обережний
- Центр
- звичайно
- більш дешевий
- перевірка
- клієнт
- код
- coder
- збір
- color
- COM
- Приходити
- майбутній
- комерційний
- Компоненти
- комп'ютер
- стан
- Умови
- підтвердити
- З'єднуватися
- підключений
- З'єднувальний
- зв'язку
- Зв'язки
- містить
- сучасний
- копіювання
- може
- курс
- обкладинка
- створювати
- створений
- створення
- криптографічні
- НЕБЕЗПЕЧНО
- дані
- день
- Днів
- вирішене
- присвячених
- Розробник
- розробників
- прилади
- DID
- Померти
- важкий
- дисплей
- розподіл
- Розподілу
- Ні
- подвійний вільний
- вниз
- під час
- кожен
- Рано
- легко
- Ефективний
- або
- шифрування
- закінчується
- England
- Весь
- особливо
- по суті
- Навіть
- НІКОЛИ
- Кожен
- все
- Ексклюзивний курс
- досвід
- досвідчений
- знайомий
- риси
- Файли
- Перший
- риба
- виправляти
- недолік
- потік
- Сфокусувати
- потім
- слідує
- назавжди
- знайдений
- Безкоштовна
- друзі
- від
- Повний
- функція
- далі
- майбутнє
- в цілому
- генерується
- отримати
- гігант
- Go
- добре
- значно
- гарантувати
- Охорона
- гість
- хакери
- відбувається
- Жорсткий
- висота
- тут
- історія
- хіт
- Hole
- Головна
- надія
- готель
- hover
- Як
- HTML
- HTTPS
- ідея
- негайно
- реалізація
- in
- В інших
- включати
- У тому числі
- включення
- невірно
- Індія
- мить
- замість
- інтерактивний
- інтернет
- Інтернет речей
- введені
- КАТО
- Iot (Інтернет речей)
- IT
- сам
- зберігання
- ключі
- Знати
- відомий
- відсутність
- портативний комп'ютер
- Пізно
- шар
- вести
- провідний
- ліцензування
- обмеженою
- Лінія
- LINK
- Linux
- логотип
- довше
- подивитися
- подивився
- ВИГЛЯДИ
- made
- основний
- зробити
- РОБОТИ
- управляти
- управління
- Маржа
- Матерія
- макс-ширина
- засоби
- пам'ять
- згаданий
- Microsoft
- може бути
- помилки
- сучасний
- більше
- найбільш
- ім'я
- Названий
- Необхідність
- необхідний
- потреби
- мережу
- проте
- Нові
- нормальний
- Пропозиції
- офіційний
- ONE
- відкрити
- з відкритим вихідним кодом
- операційний
- операційна система
- операція
- порядок
- оригінал
- спочатку
- Інше
- власний
- яка перебуває у власності
- частина
- частини
- Пройшов
- проходить
- Пароль
- Паролі
- Минуле
- шлях
- Пол
- може бути
- телефон
- фізичний
- місце
- Платформи
- plato
- Інформація про дані Платона
- PlatoData
- популярний
- положення
- це можливо
- Пости
- підготовлений
- наявність
- представлений
- попередній
- привілеї
- ймовірно
- Проблема
- процес
- програма
- Програмісти
- правильно
- протокол
- мета
- швидко
- готовий
- реальний
- реального часу
- отримано
- останній
- Відновлювати
- регулярний
- звільнити
- надійний
- запам'ятати
- віддалений
- Віддалений доступ
- звітом
- Повідомляється
- відповідно
- повертати
- Умови повернення
- Ризикований
- Кімната
- прогін
- Іржа
- сейф
- Безпека
- то ж
- вчений
- Екран
- другий
- безпечно
- безпеку
- послідовний
- Послуги
- Сесія
- сесіях
- комплект
- установка
- установка
- важкий
- Склад
- Короткий
- Вимикати
- аналогічний
- простий
- спрощений
- ситуація
- стягнути
- So
- Софтвер
- solid
- Хтось
- що в сім'ї щось
- Скоро
- Source
- швидкість
- шипи
- Spot
- standard
- стенди
- старт
- Як і раніше
- сильний
- тема
- такі
- Запропонує
- підтримка
- SVG
- система
- Приймати
- команда
- термінал
- Команда
- Блок
- їх
- Там.
- отже
- речі
- думка
- три
- час
- times
- назва
- до
- сьогодні
- інструмент
- Інструментарій
- інструменти
- топ
- Усього:
- трек
- перехід
- прозорий
- спрацьовує
- біда
- правда
- Довіряйте
- ПЕРЕГЛЯД
- типово
- UNIX
- Оновити
- оновлений
- URL
- використання
- користувач
- зазвичай
- перевірка достовірності
- версія
- через
- вразливість
- хотів
- добре відомі
- Що
- в той час як
- ВООЗ
- широко
- волі
- windows
- без
- б
- запис
- лист
- письмовий
- років
- вашу
- зефірнет