Root-вразливість у sudo, що стосується Linux Mint і Elementary OS

В утиліті Суду, що використовується для організації виконання команд від імені інших користувачів, виявлено вразливість (CVE-2019-18634), що дозволяє підвищити свої привілеї у системі до користувача root. Проблема проявляється починаючи з випуску sudo 1.7.1 тільки при використанні у файлі /etc/sudoers опції pwfeedback, яка відключена за замовчуванням, але активована в деяких дистрибутивах, таких як Linux Mint і Elementary OS. Проблема усунена у випуску sudo 1.8.31, опублікованому кілька годин тому. У дистрибутивах вразливість поки що залишається невиправленою.

Опція pwfeedback включає відображення символу * після кожного введеного символу під час введення пароля. Через помилки в реалізації функції getln(), визначеної у файлі tgetpass.c, передана через стандартний вхідний потік (stdin) занадто великий рядок з паролем за певних умов може не вмістити виділений буфер і переписати інші дані в стеку. Переповнення виникає під час виконання коду sudo із правами root.

Суть проблеми в тому, що при використанні в процесі введення спецсимволу ^U (очищення рядка) і при збої операції запису код, що відповідає за очищення виведених символів «*», скидає дані про доступний розмір буфера, але не повертає у вихідне значення покажчик на поточну позицію у буфері. Іншим фактором, що сприяє експлуатації, є відсутність автоматичного відключення режиму pwfeedback при надходженні даних не з терміналу, а через вхідний потік (дана недоробка дозволяє створити умови для виникнення помилки запису, наприклад, на системах з односпрямованими неіменованими каналами помилка виникає при спробі запису за кінець каналу для читання).

Так як атакуючий може повністю контролювати перезапис даних у стеку, не становить труднощі створення експлоїту, що дозволяє підвищити свої привілеї користувача root. Проблема може бути експлуатована будь-яким користувачем, незалежно від прав на використання sudo та наявності специфічних для користувача налаштувань у sudoers. Для блокування проблеми слід переконатися у відсутності /etc/sudoers налаштування «pwfeedback» і при необхідності відключити її («Defaults !pwfeedback»). Для перевірки наявності проблеми можна виконати код:

$ perl -e 'print(("A" x 100 . "\x{00}") x 50)' | sudo -S id
Password: Segmentation fault

Джерело: opennet.ru

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