Переповнення буфера в curl і libcurl, що виявляється при зверненні через SOCKS5-проксі

В утиліті для отримання і відправки даних по мережі curl і паралельно бібліотеці libcurl, що розвивається, виявлена ​​вразливість (CVE-2023-38545), яка може призвести до переповнення буфера і потенційно до виконання коду атакуючого на стороні клієнта при зверненні за допомогою утиліти curl або програми, libcurl, до HTTPS-сервера, підконтрольного зловмиснику. Проблема проявляється лише у разі включення до curl доступу через проксі SOCKS5. При прямому зверненні без проксі вразливість не виявляється. Уразливість усунена у випуску curl 8.4.0. Дослідник безпеки, який виявив помилку, отримав винагороду, розміром $4660 в рамках ініціативи Internet Bug Bounty на Hackerone.

Уразливість викликана помилкою в коді резолвінгу імені хоста перед зверненням до SOCKS5-проксі. При довжині імені хоста до 256 символів curl відразу передає ім'я в SOCKS5-проксі для резолвінгу на його боці, а якщо ім'я більше 255 символів перемикається на локальний резолвер і передає SOCKS5 вже певну адресу. Через помилку в коді прапор, що вказує на необхідність локального резолвінгу, в процесі повільного узгодження з'єднання через SOCKS5 міг бути виставлений не в те значення, що призводило до запису довгого імені хоста в буфер, виділений з розрахунком на збереження IP-адреси або імені , що не перевищує 255 символів.

Власник сайту, до якого curl звертається через SOCKS5-проксі, може ініціювати переповнення буфера на стороні клієнта, повернувши у відповідь код перенаправлення запиту (HTTP 30x) і виставивши в заголовку Location: URL з ім'ям хоста, розмір якого знаходиться в діапазоні від 16 до 64 КБ (значення 16 КБ обумовлено мінімальним розміром, необхідним для переповнення виділеного буфера, а значення 65 КБ пов'язане з максимально дозволеною довжиною імені хоста URL). Якщо в налаштуваннях libcurl дозволено перенаправлення запитів і використовуваний SOCKS5-проксі досить повільний, то довге ім'я хоста буде записано в невеликий буфер, явно меншого розміру.

Вразливість в основному зачіпає додатки на базі libcurl і проявляється в утиліті curl тільки при використанні опції «limit-rate» зі значенням, менше 65541 - в libcurl за замовчуванням виділяється буфер, розміром 16 КБ, а в утиліті curl - 100 КБ, але Розмір змінюється в залежності від значення параметра «-limit-rate».

Деніел Cтенберг (Daniel Stenberg), автор проекту, згадав, що вразливість залишалася непоміченою протягом 1315 днів. Також сказано, що 41% від раніше виявлених у curl уразливостей ймовірно вдалося б уникнути, якби curl був написаний мовою, що забезпечує безпечну роботу з пам'яттю, але переписувати curl іншою мовою в найближчому майбутньому не планується. В якості заходів для підвищення безпеки кодової бази пропонується розширити інструментарій для тестування коду та активніше використовувати залежності, написані мовами програмування, що забезпечують безпечну роботу з пам'яттю. Також розглядається можливість поетапної заміни частин curl на варіанти, написані безпечними мовами, такі як експериментальний HTTP-бэкенд Hyper, реалізований мовою Rust.

Джерело: opennet.ru

Додати коментар або відгук