์ง๋ ฌํ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ๊ณต๊ฒฉ ๋ฒ์๊ฐ ๋๋ฌด ๋๊ณ ์ง์์ ์ผ๋ก ๋ ๋์ด์ ธ ๋ฐฉ์ดํ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ด๋ค. ObjectInputStream ์ readObject ๋ฉ์๋๋ฅผ ํธ์ถํ์ ๊ฐ์ฒด ๊ทธ๋ํ๊ฐ ์ญ์ง๋ ฌํ๋๊ธฐ ๋๋ฌธ์ด๋ค. readObject ๋ฉ์๋๋ (Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ ์) ํด๋์คํจ์ค ์์ ๊ฑฐ์ ๋ชจ๋ ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ญ์ง๋ ฌํํ๋ ๊ณผ์ ์์ ์ด ๋ฉ์๋๋ ๊ทธ ํ์ ๋ค ์์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ํํ ์ ์๋ค.
โ ๊ทธ ํ์ ๋ค์ ์ฝ๋ ์ ์ฒด๊ฐ ๊ณต๊ฒฉ ๋ฒ์์ ๋ค์ด๊ฐ๋ค๋ ๋ป์ด๋ค.
์๋ฐ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ํ์น ์ปค๋จผ์ฆ ์ปฌ๋ ์ ๊ฐ์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํด๋์ค๋ค๋ ๊ณต๊ฒฉ ๋ฒ์์ ํฌํจ๋๋ค.
๊ด๋ จํ ๋ชจ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ๋ชจ๋ ์ง๋ ฌํ ๊ฐ๋ฅ ํด๋์ค๋ค์ ๊ณต๊ฒฉ์ ๋๋นํ๋๋ก ์์ฑํ๋ค ํด๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ ํ ์ทจ์ฝํ ์ ์๋ค.
์ ๋ขฐํ ์ ์๋ ์คํธ๋ฆผ์ ์ญ์ง๋ ฌํํ๋ฉด ์๊ฒฉ ์ฝ๋ ์คํ(remote code execution, RCE), ์๋น์ค ๊ฑฐ๋ถ(Dos)๋ฑ์ ๊ณต๊ฒฉ์ผ๋ก ์ด์ด์ง ์ ์๋ค.
์ง๋ ฌํ ๊ฐ๋ฅ ํ์ ๋ค์ ์ฐ๊ตฌํ์ฌ ์ญ์ง๋ ฌํ ๊ณผ์ ์์ ํธ์ถ๋์ด ์ ์ฌ์ ์ผ๋ก ์ํํ ๋์์ ์ํํ๋ ๋ฉ์๋๋ค์ ์ฐพ์ ์ ์๋ค. ์ด๋ฐ ๋ฉ์๋๋ฅผ ๊ฐ์ ฏ(gadget)์ด๋ผ ๋ถ๋ฅธ๋ค.
์ฌ๋ฌ ๊ฐ์ ฏ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ฐ์ ฏ ์ฒด์ธ์ ๊ตฌ์ฑํ ์๋ ์๋ค. ๊ฐ๋์ฉ ๊ณต๊ฒฉ์๊ฐ ๊ธฐ๋ฐ ํ๋์จ์ด์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋ง์๋๋ก ์คํํ ์ ์๋ ์์ฃผ ๊ฐ๋ ฅํ ๊ฐ์ ฏ ์ฒด์ธ๋ ๋ฐ๊ฒฌ๋๊ณค ํ๋ค.
๊ทธ๋์ ์์ฃผ ์ ์คํ๊ฒ ์ ์ํ ๋ฐ์ดํธ ์คํธ๋ฆผ๋ง ์ญ์ง๋ ฌํ ํด์ผ ํ๋ค.
์ญ์ง๋ ฌํ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์งง์ ์คํธ๋ฆผ์ ์ญ์ง๋ ฌํํ๋ ๊ฒ๋ง์ผ๋ก๋ ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ ์ฝ๊ฒ ๋ ธ์ถ๋ ์ ์๋ค. ์ด๋ฐ ์คํธ๋ฆผ์ ์ญ์ง๋ ฌํ ํญํ(deserialization bomb)์ด๋ผ๊ณ ํ๋ค.
// ์ญ์ง๋ ฌํ ํญํ
static byte[] bomb() {
Set<Object> root = new HashSet<>();
Set<Object> s1 = root;
Set<Object> s2 = new HashSet<>();
for (int i = 0; i < 100; i++) {
Set<Object> t1 = new HashSet<>();
Set<Object> t2 = new HashSet<>();
t1.add("foo"); // t1์ t2์ ๋ค๋ฅด๊ฒ ๋ง๋ ๋ค.
s1.add(t1);
s1.add(t2);
s2.add(t1);
s2.add(t2);
s1 = t1;
s2 = t2;
}
return serialize(root);
}์ด ๊ฐ์ฒด ๊ทธ๋ํ๋ 201๊ฐ์ HashSet ์ธ์คํด์ค๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ทธ ๊ฐ๊ฐ์ 3๊ฐ ์ดํ์ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๊ฐ๋๋ค. ์คํธ๋ฆผ์ ์ ์ฒด ํฌ๊ธฐ๋ 5,744๋ฐ์ดํธ์ง๋ง, ์ญ์ง๋ ฌํ๋ ํ์์ด ๋ถํ ์์ ๋๊น์ง๋ ๋๋์ง ์์ ๊ฒ์ด๋ค.
๋ฌธ์ ๋ HashSet ์ธ์คํด์ค๋ฅผ ์ญ์ง๋ ฌํํ๋ ค๋ฉด ๊ทธ ์์๋ค์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํด์ผ ํ๋ค. ๋ฃจํธ HashSet์ ๋ด๊ธด ๋ ์์๋ ๊ฐ๊ฐ (๋ฃจํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก) ๋ค๋ฅธ HashSet 2๊ฐ์ฉ์ ์์๋ก ๊ฐ๋ HashSet์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ๋ณต๋ฌธ์ ์ํด ์ด ๊ตฌ์กฐ๊ฐ ๊น์ด 100๋จ๊ณ๊น์ง ๋ง๋ ๋ค. ๋ฐ๋ผ์ ์ด HashSet์ ์ญ์ง๋ ฌํํ๋ ค๋ฉด hashCode ๋ฉ์๋๋ฅผ 2์ 100๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ๋๊ฒ ํธ์ถํด์ผ ํ๋ค.
์ญ์ง๋ ฌํ๊ฐ ์์ํ ๊ณ์๋๋ค๋ ๊ฒ๋ ๋ฌธ์ ์ง๋ง, ์ ํธ์กฐ์ฐจ ์ฃผ์ง ์๋๋ค๋ ๊ฒ๋ ํฐ ๋ฌธ์ ๋ค.
โ ์ด ์ฝ๋๋ ๋จ ๋ช ๊ฐ์ ๊ฐ์ฒด๋ง ์์ฑํด๋ ์คํ ๊น์ด ์ ํ์ ๊ฑธ๋ ค๋ฒ๋ฆฐ๋ค.
์๋ก์ด ์์คํ ์์ ์๋ฐ ์ง๋ ฌํ๋ฅผ ์จ์ผ ํ ์ด์ ๋ ์ ํ ์๋ค. ๊ฐ์ฒด์ ๋ฐ์ดํธ ์ํ์ค๋ฅผ ๋ณํํด์ฃผ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ด ๋ง์ด ์๋ค. ์ง๋ ฌํ ์์คํ ์ด๋ผ ๋ถ๋ฆฌ๊ธฐ๋ ํ์ง๋ง, ํฌ๋ก์ค-ํ๋ซํผ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ํํ์ด๋ผ ํ๋ค.
์ด ํํ๋ค์ ๊ณตํต์ ์ ์๋ฐ ์ง๋ ฌํ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๋ค๋ ๊ฒ์ด๋ค. ์์ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํ/์ญ์ง๋ ฌํํ์ง ์๋๋ค. ๋์ ์์ฑ-๊ฐ ์์ ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ๋จํ๊ณ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ํ์ ๋ช ๊ฐ์ ๋ฐฐ์ด ํ์ ๋ง ์ง์ํ ๋ฟ์ด๋ค. ์ด๋ฐ ๊ฐ๋จํ ์ถ์ํ๋ง์ผ๋ก๋ ์์ฃผ ๊ฐ๋ ฅํ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ์ ์ถฉ๋ถํ๊ณ , ์๋ฐ ์ง๋ ฌํ๊ฐ ๊ฐ์ ธ์จ ์ฌ๊ฐํ ๋ฌธ์ ๋ค์ ํํผํ ์ ์๋ค.
JSON์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ์ ํต์ ์ฉ์ผ๋ก ์ค๊ณ๋์๋ค.
ํ๋กํ ์ฝ ๋ฒํผ๋ ๊ตฌ๊ธ์ด ์๋ฒ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ณ ์ ์ฅํ๊ธฐ ์ํด ์ค๊ณํ๋ค.
๋ณดํต์ ์ด๋ค์ ์ธ์ด ์ค๋ฆฝ์ ์ด๋ผ๊ณ ํ์ง๋ง, ์ฌ์ค JSON์ ์๋ฐ์คํฌ๋ฆฝํธ์ฉ์ผ๋ก, ํ๋กํ ์ฝ ๋ฒํผ๋ C++์ฉ์ผ๋ก ๋ง๋ค์ด์ก๋ค.
๋์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ JSON์ ํ ์คํธ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋์ด ์ฝ์ ์ ์๊ณ , ํ๋กํ ์ฝ ๋ฒํผ๋ ์ด์ง ํํ์ด๋ผ ํจ์จ์ด ํจ์ฌ ๋๋ค๋ ์ ์ด๋ค. ๋ํ JSON์ ์ค์ง ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐ๋ง ์ฐ์ด์ง๋ง, ํ๋กํ ์ฝ ๋ฒํผ๋ ๋ฌธ์๋ฅผ ์ํ ์คํค๋ง(ํ์ )๋ฅผ ์ ๊ณตํ๊ณ ์ฌ๋ฐ๋ก ์ฐ๋๋ก ๊ฐ์ํ๋ค.
ํจ์จ์ ํ๋กํ ์ฝ ๋ฒํผ๊ฐ ํจ์ฌ ์ข์ง๋ง ํ ์คํธ ๊ธฐ๋ฐ ํํ์๋ JSON์ด ์์ฃผ ํจ๊ณผ์ ์ด๋ค. ๋ํ, ํ๋กํ ์ฝ ๋ฒํผ๋ ์ด์ง ํํ๋ฟ ์๋๋ผ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ ์คํธ ํํ(pbtxt)๋ ์ง์ํ๋ค.
๋ ๊ฑฐ์ ์์คํ ๋๋ฌธ์ ์๋ฐ ์ง๋ ฌํ๋ฅผ ์์ ํ ๋ฐฐ์ ํ ์ ์์ ๋์ ์ฐจ์ ์ฑ ์
์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๋ ์ ๋ ์ญ์ง๋ ฌํํ์ง ์๋ ๊ฒ์ด๋ค.
ํนํ, ์ ๋ขฐํ ์ ์๋ ๋ฐ์ ์์ผ๋ก๋ถํฐ์ RMI๋ ์ ๋ ์์ฉํด์๋ ์๋๋ค. ์๋ฐ์ ๊ณต์ ๋ณด์ ์ฝ๋ฉ ์ง์นจ์์๋ "์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ์ ์ญ์ง๋ ฌํ๋ ๋ณธ์ง์ ์ผ๋ก ์ํํ๋ฏ๋ก ์ ๋๋ก ํผํด์ผ ํ๋ค" ๋ผ๊ณ ์กฐ์ธํ๋ค.
๊ฐ์ฒด ์ญ์ง๋ ฌํ ํํฐ๋ง์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ด ์ญ์ง๋ ฌํ๋๊ธฐ ์ ์ ํํฐ๋ฅผ ์ค์นํ๋ ๊ธฐ๋ฅ์ด๋ค.
ํด๋์ค ๋จ์๋ก, ํน์ ํด๋์ค๋ฅผ ๋ฐ์๋ค์ด๊ฑฐ๋ ๊ฑฐ๋ถํ ์ ์๋ค. '๊ธฐ๋ณธ ์์ฉ' ๋ชจ๋์์๋ ๋ธ๋๋ฆฌ์คํธ์ ๊ธฐ๋ก๋ ์ ์ฌ์ ์ผ๋ก ์ํํ ํด๋์ค๋ค์ ๊ฑฐ๋ถํ๋ค. ๋ฐ๋๋ก '๊ธฐ๋ณธ ๊ฑฐ๋ถ' ๋ชจ๋์์๋ ํ์ดํธ๋ฆฌ์คํธ์ ๊ธฐ๋ก๋ ์์ ํ๋ค๊ณ ์๋ ค์ง ํด๋์ค๋ค๋ง ์์ฉํ๋ค.
โ ๋ธ๋๋ฆฌ์คํธ ๋ฐฉ์๋ณด๋ค๋ ํ์ดํธ๋ฆฌ์คํธ ๋ฐฉ์์ ์ถ์ฒํ๋ค.
ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ์ค์(SWAT, Serial Whitelist Application Trainer)๋ผ๋ ๋๊ตฌ๊ฐ ์์ผ๋ ์ฐธ๊ณ ํ ๊ฒ.
ํํฐ๋ง ๊ธฐ๋ฅ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผํ๊ฒ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ์ฒด ๊ทธ๋ํ๊ฐ ๋๋ฌด ๊น์ด์ง๋ ์ฌํ๋ก๋ถํฐ๋ ๋ณดํธํด์ค๋ค.
โ ์ง๋ ฌํ ํญํ์ ๊ฑธ๋ฌ๋ด์ง ๋ชปํ๋ค.