Košík je prázdný

Kritická zranitelnost Helix Ultimate 2.2.6 a starších verzí: škodlivý JavaScript může převzít administraci Joomla

V populárním Joomla frameworku Helix Ultimate byla objevena závažná bezpečnostní chyba, která umožňuje neautentizovanému útočníkovi zapisovat data do parametrů položek menu a vložit do webu škodlivý JavaScript.

Zranitelnost se týká Helix Ultimate 2.2.6 a všech starších verzí. Bezpečnostní oprava byla vydána ve verzi 2.2.7. Doporučujeme však instalovat vždy nejnovější dostupnou verzi Helix Ultimate.

Společnost MyDreams innovations s.r.o. zkontrolovala a zabezpečila všechny Joomla weby s Helix Ultimate, které má ve své správě. Zranitelné instalace byly aktualizovány a databáze jednotlivých webů byly prověřeny na přítomnost vloženého malwaru, neoprávněných změn menu a neznámých administrátorských účtů.

Koho se zranitelnost týká

Ohrožené jsou weby používající:

Helix Ultimate 2.2.6 a starší

Bezpečnostní oprava byla vydána ve verzi:

Helix Ultimate 2.2.7

Doporučujeme však instalovat vždy nejnovější dostupnou verzi Helix Ultimate.

Zranitelnost se může týkat také velmi starých webů používajících Helix Ultimate 2.0.x nebo 2.1.x. U webů provozovaných na nepodporovaných verzích Joomla nemusí být možné provést běžnou automatickou aktualizaci a jejich zabezpečení je nutné řešit individuálně.

V čem bezpečnostní chyba spočívá

Helix Ultimate používal veřejně dostupné AJAX akce zpracovávané prostřednictvím Joomla komponenty:

index.php?option=com_ajax

Některé z těchto akcí neměly dostatečnou kontrolu:

  • přihlášení uživatele,
  • oprávnění ke změně nastavení,
  • platného bezpečnostního CSRF tokenu,
  • obsahu zapisovaných hodnot.

Útočník tak mohl bez přihlášení změnit vybrané parametry Joomla menu používané funkcí Mega Menu.

Do parametrů položky menu mohl následně uložit škodlivý JavaScript. Protože se obsah při vykreslování menu nedostatečně filtroval, skript se načetl přímo ve stránce webu.

Jedná se o takzvanou stored XSS zranitelnost, tedy trvale uložený škodlivý kód.

Jak může útočník získat administrátorský přístup

Samotný zápis JavaScriptu do menu ještě nemusí útočníkovi okamžitě poskytnout přístup do administrace. Velmi nebezpečný je však okamžik, kdy napadený web otevře správce, který je současně přihlášený do administrace Joomla.

Zaznamenaný malware fungoval následovně:

  1. Útočník vložil škodlivý JavaScript do parametrů Mega Menu.
  2. JavaScript se zobrazoval ve frontendové části webu.
  3. Skript pravidelně kontroloval, zda má návštěvník aktivní administrátorskou relaci.
  4. Pokud byl návštěvník přihlášený jako administrátor, malware načetl formulář pro vytvoření uživatele.
  5. Z formuláře získal platný Joomla CSRF token.
  6. Jménem přihlášeného administrátora vytvořil nový účet.
  7. Nový účet zařadil do skupiny Super Users.
  8. Adresu webu a přístupové údaje odeslal na server útočníka.

Útočník tak nemusel znát heslo původního správce. Zneužil oprávnění administrátora prostřednictvím škodlivého kódu spuštěného v jeho prohlížeči.

Jak se napadení projevuje

Nejčastějším projevem je dlouhý JavaScriptový kód zobrazený přímo na stránce nebo ve zdrojovém kódu webu.

Kód může začínat například takto:

(function () {
    'use strict';

    if (window.joomlacreater_inline_run) return;

Další možné projevy napadení:

  • dlouhý JavaScript viditelný na stránce,
  • neznámý kód ve zdrojovém HTML,
  • poškozené nebo nesprávně vykreslené hlavní menu,
  • neobvykle dlouhé parametry některé položky menu,
  • přesměrování na cizí domény,
  • neznámý účet ve skupině Super Users,
  • změny administrace provedené bez vědomí správce,
  • opakované obnovení kódu po vymazání cache,
  • podezřelé požadavky na com_ajax v přístupových logách.

V jedné analyzované variantě byly použity například tyto údaje:

Uživatelské jméno: admin_mori
E-mail: Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript.

Malware však dokázal načíst jiné přihlašovací údaje ze vzdáleného řídicího serveru. Nestačí proto hledat pouze účet admin_mori. Je nutné zkontrolovat všechny administrátorské účty vytvořené v době napadení.

Kde je malware uložen

Při zneužití Helix Ultimate bývá škodlivý kód uložený přímo v databázi Joomla.

Nejčastější místo:

#__menu

Konkrétně sloupec:

params

Hodnota #__ představuje prefix databázových tabulek. Ve skutečné databázi může mít tabulka například tento název:

abc_menu

Útočník vloží JavaScript do některého z parametrů Mega Menu. Může se jednat například o:

  • vlastní CSS třídu,
  • ikonu položky menu,
  • odznak,
  • vlastní text,
  • doplňkový atribut,
  • obsah nebo nastavení Mega Menu.

Nejdříve vytvořte zálohu

Před jakýmkoliv zásahem do databáze vytvořte kompletní zálohu:

mysqldump -u DB_UZIVATEL -p NAZEV_DATABAZE > zaloha-pred-odvirovanim.sql

Uložte také kopii přístupových logů. Mohou obsahovat IP adresu, čas a přesný požadavek použitý při napadení.

Jak najít známou variantu malwaru v databázi

Následující SQL dotaz vyhledá známé indikátory napadení:

SELECT
    id,
    menutype,
    title,
    alias,
    link,
    parent_id,
    published,
    params
FROM `#__menu`
WHERE params LIKE '%olybrdbtrknks%'
   OR params LIKE '%joomlacreater%'
   OR params LIKE '%admin_mori%'
   OR params LIKE '%mori_pro3344%'
   OR params LIKE '%memetkaan43%'
   OR params LIKE '%sendBeacon%'
   OR params LIKE '%public_config%'
   OR params LIKE '%jc_router_iframe%';

Prefix #__ nahraďte skutečným prefixem tabulek.

Například:

SELECT id, title, params
FROM `abc_menu`
WHERE params LIKE '%joomlacreater%';

Obecná kontrola škodlivého JavaScriptu

Doména útočníka, přihlašovací údaje i podoba malwaru se mohou změnit. Doporučujeme proto provést také obecnější kontrolu:

SELECT
    id,
    menutype,
    title,
    alias,
    link,
    params
FROM `#__menu`
WHERE params REGEXP
'<script|</script|javascript:|onerror[[:space:]]*=|onload[[:space:]]*=|onclick[[:space:]]*=|fetch\\(|sendBeacon|XMLHttpRequest|document\\.cookie|navigator\\.|credentials.{0,30}include';

Tento dotaz může najít také legitimní hodnoty, proto je nutné výsledky ručně prověřit.

Vyhledání neobvykle dlouhých parametrů menu

Škodlivý JavaScript může mít několik tisíc znaků. Podezřelé položky lze najít podle délky sloupce params:

SELECT
    id,
    menutype,
    title,
    alias,
    CHAR_LENGTH(params) AS params_length
FROM `#__menu`
ORDER BY CHAR_LENGTH(params) DESC
LIMIT 50;

Pokud má běžná položka menu několik set znaků a jedna z položek obsahuje desítky tisíc znaků, je velmi pravděpodobné, že byla změněna.

Jak odstranit škodlivý kód z databáze

Nejprve zjistěte ID napadené položky:

SELECT
    id,
    title,
    params
FROM `#__menu`
WHERE params LIKE '%joomlacreater%'
   OR params LIKE '%olybrdbtrknks%';

Napadený řádek si před úpravou samostatně exportujte:

mysqldump -u DB_UZIVATEL -p NAZEV_DATABAZE PREFIX_menu \
  --where="id=ID_POLOZKY" \
  > napadena-polozka-menu.sql

Následně je potřeba upravit JSON uložený ve sloupci params.

Bezpečný postup:

  1. Zkopírujte celý obsah sloupce params.
  2. Naformátujte jej jako JSON.
  3. Najděte hodnotu obsahující JavaScript.
  4. Odstraňte pouze napadenou hodnotu.
  5. Zachovejte ostatní legitimní nastavení Mega Menu.
  6. Opravený JSON uložte zpět do databáze.
  7. Vymažte cache Joomla a případnou serverovou cache.
  8. Ověřte zdrojový kód stránky.

Pokud databáze podporuje funkci JSON_PRETTY, lze obsah zobrazit čitelněji:

SELECT
    id,
    title,
    JSON_PRETTY(params)
FROM `#__menu`
WHERE id = ID_POLOZKY;

Proč nenastavovat automaticky prázdné parametry

Následující příkaz sice malware odstraní:

UPDATE `#__menu`
SET params = '{}'
WHERE id = ID_POLOZKY;

Současně ale odstraní všechna legitimní nastavení dané položky menu.

Mohou zmizet například:

  • nastavení Mega Menu,
  • počet sloupců,
  • ikona,
  • CSS třída,
  • šířka rozbalovací nabídky,
  • viditelnost titulku,
  • další parametry zobrazení.

Použití prázdného JSON je vhodné pouze tehdy, pokud jste připraveni nastavení celé položky menu vytvořit znovu.

Pokud nelze bezpečně určit, která část parametrů je napadená, může být jednodušší položku menu odstranit a znovu vytvořit.

Kontrola nastavení šablony

SELECT
    id,
    template,
    title,
    home,
    params
FROM `#__template_styles`
WHERE params LIKE '%olybrdbtrknks%'
   OR params LIKE '%joomlacreater%'
   OR params LIKE '%admin_mori%'
   OR params LIKE '%sendBeacon%'
   OR params REGEXP
      '<script|javascript:|onerror[[:space:]]*=|onload[[:space:]]*=';

Zkontrolujte především pole:

  • Custom JavaScript,
  • Before Head,
  • Before Body,
  • After Body,
  • vlastní kód šablony.

Kontrola vlastních HTML modulů

SELECT
    id,
    title,
    module,
    position,
    published,
    content,
    params
FROM `#__modules`
WHERE content LIKE '%olybrdbtrknks%'
   OR content LIKE '%joomlacreater%'
   OR content LIKE '%admin_mori%'
   OR params LIKE '%olybrdbtrknks%'
   OR params LIKE '%joomlacreater%';

Kontrola článků

SELECT
    id,
    title,
    state
FROM `#__content`
WHERE introtext LIKE '%olybrdbtrknks%'
   OR fulltext LIKE '%olybrdbtrknks%'
   OR introtext LIKE '%joomlacreater%'
   OR fulltext LIKE '%joomlacreater%'
   OR introtext LIKE '%admin_mori%'
   OR fulltext LIKE '%admin_mori%';

Kontrola administrátorských účtů

Skupina Super Users má ve standardní instalaci Joomla obvykle ID 8.

Všechny uživatele v této skupině lze vypsat následujícím dotazem:

SELECT
    u.id,
    u.name,
    u.username,
    u.email,
    u.registerDate,
    u.lastvisitDate,
    u.block,
    m.group_id
FROM `#__users` AS u
INNER JOIN `#__user_usergroup_map` AS m
    ON m.user_id = u.id
WHERE m.group_id = 8
ORDER BY u.registerDate DESC;

Zkontrolujte zejména:

  • neznámá uživatelská jména,
  • neznámé e-mailové adresy,
  • účty vytvořené krátce po útoku,
  • účty bez běžné historie přihlášení,
  • účty s názvem připomínajícím původního správce.

Známou variantu lze najít takto:

SELECT
    id,
    name,
    username,
    email,
    registerDate,
    lastvisitDate,
    block
FROM `#__users`
WHERE username = 'admin_mori'
   OR email = Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript.';

Zablokování škodlivého uživatele

UPDATE `#__users`
SET block = 1
WHERE username = 'admin_mori'
   OR email = Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript.';

Před odstraněním si poznamenejte jeho ID, datum registrace a poslední přihlášení.

Odstranění účtu útočníka

Nejprve odstraňte přiřazení do uživatelských skupin:

DELETE m
FROM `#__user_usergroup_map` AS m
INNER JOIN `#__users` AS u
    ON u.id = m.user_id
WHERE u.username = 'admin_mori'
   OR u.email = Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript.';

Poté odstraňte uživatele:

DELETE FROM `#__users`
WHERE username = 'admin_mori'
   OR email = Tato e-mailová adresa je chráněna před spamboty. Pro její zobrazení musíte mít povolen Javascript.';

Pokud má účet jiné jméno, pracujte raději s konkrétním ID uživatele:

DELETE FROM `#__user_usergroup_map`
WHERE user_id = ID_UZIVATELE;

DELETE FROM `#__users`
WHERE id = ID_UZIVATELE;

Zneplatnění všech aktivních relací

Pokud byl malware na webu aktivní, je nutné předpokládat, že mohl zneužít aktivní relaci administrátora.

Všechny relace uložené v databázi lze zneplatnit příkazem:

TRUNCATE TABLE `#__session`;

Tím budou odhlášeni všichni přihlášení uživatelé.

Po odvirování změňte hesla:

  • všech Super Users,
  • databázového uživatele,
  • FTP a SFTP účtů,
  • SSH účtů,
  • hostingu nebo ISPConfigu,
  • SMTP účtů,
  • API klíčů uložených v Joomla.

Kontrola souborů webu

Přestože byl původní JavaScript uložen v databázi, útočník mohl po získání administrátorského přístupu nahrát také PHP backdoor.

Známé indikátory lze v souborech vyhledat příkazem:

grep -RIn \
  --exclude-dir=cache \
  --exclude-dir=tmp \
  --exclude-dir=logs \
  -E 'olybrdbtrknks|joomlacreater|admin_mori|mori_pro3344|memetkaan43|jc_router_iframe' .

Prověřte PHP soubory v adresářích, kde by se běžně nacházet neměly:

find images media tmp cache \
  -type f \
  \( -iname '*.php' -o -iname '*.phtml' -o -iname '*.phar' -o -iname '*.php5' \) \
  -ls 2>/dev/null

Zkontrolujte také nedávno změněné soubory:

find . -type f \
  \( -name '*.php' -o -name '*.js' -o -name '*.html' \) \
  -mtime -30 \
  -printf '%TY-%Tm-%Td %TH:%TM %p\n' |
sort

Aktualizace sama malware neodstraní

Aktualizace Helix Ultimate uzavře původní bezpečnostní chybu, ale automaticky neodstraní:

  • JavaScript uložený v databázi,
  • neoprávněně vytvořené uživatele,
  • změněné položky menu,
  • nahrané PHP backdoory,
  • změny v šabloně,
  • odcizená hesla,
  • aktivní administrátorské relace.

Každý web, který používal Helix Ultimate 2.2.6 nebo starší, proto musí být nejen aktualizován, ale také důkladně zkontrolován.

Doporučený postup zabezpečení

  1. Dočasně omezit veřejný přístup k napadenému webu.
  2. Vytvořit zálohu souborů, databáze a logů.
  3. Aktualizovat Helix Ultimate na bezpečnou verzi.
  4. Zkontrolovat #__menu.params.
  5. Odstranit škodlivý JavaScript.
  6. Zkontrolovat nastavení šablony, moduly a články.
  7. Prověřit všechny Super Users.
  8. Odstranit neoprávněné administrátorské účty.
  9. Zneplatnit všechny aktivní relace.
  10. Změnit všechna důležitá hesla.
  11. Zkontrolovat soubory na přítomnost PHP backdoorů.
  12. Vymazat Joomla, serverovou i CDN cache.
  13. Prověřit přístupové logy a zablokovat útočící IP adresy.

Jak postupovala společnost MyDreams

Po zveřejnění informací o zranitelnosti zahájil tým MyDreams kontrolu Joomla webů využívajících Helix Ultimate.

U všech webů v naší správě jsme provedli zejména:

  • kontrolu nainstalované verze Helix Ultimate,
  • aktualizaci zranitelných instalací,
  • kontrolu parametrů Mega Menu,
  • vyhledání škodlivého JavaScriptu v databázi,
  • kontrolu administrátorských účtů,
  • kontrolu nedávno změněných souborů,
  • odstranění nalezeného malwaru,
  • zneplatnění podezřelých relací,
  • dodatečné zabezpečení administrace.

Všechny weby ve správě MyDreams byly prověřeny a zabezpečeny.

U starších webů, na kterých nelze aktuální verzi Helix Ultimate nebo Joomla standardně nainstalovat, jsme použili individuální bezpečnostní opatření podle konkrétního technického stavu webu.

 

 

Zranitelnost Helix Ultimate 2.2.6 a starších verzí je mimořádně nebezpečná především proto, že ji může zneužít útočník bez přihlášení.

Typický řetězec útoku vypadá následovně:

Helix Ultimate 2.2.6 nebo starší
        ↓
veřejně dostupná AJAX akce
        ↓
neautorizovaný zápis do parametrů Mega Menu
        ↓
uložený škodlivý JavaScript
        ↓
spuštění v prohlížeči přihlášeného administrátora
        ↓
vytvoření nového účtu Super User
        ↓
úplné převzetí Joomla webu

Správcům Joomla webů doporučujeme Helix Ultimate okamžitě aktualizovat a současně zkontrolovat databázi, uživatelské účty a soubory webu.

Pouhá aktualizace frameworku nestačí. Pokud byl škodlivý JavaScript již uložen do databáze, zůstane v ní i po instalaci bezpečné verze.