X Tutup
Skip to content

Latest commit

ย 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 

README.md

์•„์ดํ…œ85. ์ž๋ฐ” ์ง๋ ฌํ™”์˜ ๋Œ€์•ˆ์„ ์ฐพ์œผ๋ผ

์ฑ…์ •๋ฆฌ

์ง๋ ฌํ™”์˜ ๋ฌธ์ œ์ 

์ง๋ ฌํ™”์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ๊ณต๊ฒฉ ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ๋„“๊ณ  ์ง€์†์ ์œผ๋กœ ๋” ๋„“์–ด์ ธ ๋ฐฉ์–ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์ด๋‹ค. 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์€ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„์˜ ํ†ต์‹ ์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋Š” ๊ตฌ๊ธ€์ด ์„œ๋ฒ„ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ํ–ˆ๋‹ค.

๋ณดํ†ต์€ ์ด๋“ค์„ ์–ธ์–ด ์ค‘๋ฆฝ์ ์ด๋ผ๊ณ  ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค JSON์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์šฉ์œผ๋กœ, ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋Š” C++์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

๋‘˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” JSON์€ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋Š” ์ด์ง„ ํ‘œํ˜„์ด๋ผ ํšจ์œจ์ด ํ›จ์”ฌ ๋†’๋‹ค๋Š” ์ ์ด๋‹ค. ๋˜ํ•œ JSON์€ ์˜ค์ง ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ๋งŒ ์“ฐ์ด์ง€๋งŒ, ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋Š” ๋ฌธ์„œ๋ฅผ ์œ„ํ•œ ์Šคํ‚ค๋งˆ(ํƒ€์ž…)๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์˜ฌ๋ฐ”๋กœ ์“ฐ๋„๋ก ๊ฐ•์š”ํ•œ๋‹ค.

ํšจ์œจ์€ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๊ฐ€ ํ›จ์”ฌ ์ข‹์ง€๋งŒ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ‘œํ˜„์—๋Š” JSON์ด ์•„์ฃผ ํšจ๊ณผ์ ์ด๋‹ค. ๋˜ํ•œ, ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋Š” ์ด์ง„ ํ‘œํ˜„๋ฟ ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ํ‘œํ˜„(pbtxt)๋„ ์ง€์›ํ•œ๋‹ค.

์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์จ์•ผ๋งŒ ํ•  ๋•Œ

๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ๋•Œ๋ฌธ์— ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์™„์ „ํžˆ ๋ฐฐ์ œํ•  ์ˆ˜ ์—†์„ ๋•Œ์˜ ์ฐจ์„ ์ฑ…์€

์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ ˆ๋Œ€ ์—ญ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

ํŠนํžˆ, ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐœ์‹ ์›์œผ๋กœ๋ถ€ํ„ฐ์˜ RMI๋Š” ์ ˆ๋Œ€ ์ˆ˜์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ž๋ฐ”์˜ ๊ณต์‹ ๋ณด์•ˆ ์ฝ”๋”ฉ ์ง€์นจ์—์„œ๋Š” "์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ์˜ ์—ญ์ง๋ ฌํ™”๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ์ ˆ๋Œ€๋กœ ํ”ผํ•ด์•ผ ํ•œ๋‹ค" ๋ผ๊ณ  ์กฐ์–ธํ•œ๋‹ค.

๊ฐ์ฒด ์—ญ์ง๋ ฌํ™” ํ•„ํ„ฐ๋ง(java.io.ObjectInputFilter)

๊ฐ์ฒด ์—ญ์ง๋ ฌํ™” ํ•„ํ„ฐ๋ง์€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ์—ญ์ง๋ ฌํ™”๋˜๊ธฐ ์ „์— ํ•„ํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

ํด๋ž˜์Šค ๋‹จ์œ„๋กœ, ํŠน์ • ํด๋ž˜์Šค๋ฅผ ๋ฐ›์•„๋“ค์ด๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค. '๊ธฐ๋ณธ ์ˆ˜์šฉ' ๋ชจ๋“œ์—์„œ๋Š” ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ๊ธฐ๋ก๋œ ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•œ ํด๋ž˜์Šค๋“ค์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ '๊ธฐ๋ณธ ๊ฑฐ๋ถ€' ๋ชจ๋“œ์—์„œ๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ๊ธฐ๋ก๋œ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ง„ ํด๋ž˜์Šค๋“ค๋งŒ ์ˆ˜์šฉํ•œ๋‹ค.

โ†’ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์„ ์ถ”์ฒœํ•œ๋‹ค.

ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์Šค์™“(SWAT, Serial Whitelist Application Trainer)๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•  ๊ฒƒ.

ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๋Š” ์‚ฌํƒœ๋กœ๋ถ€ํ„ฐ๋„ ๋ณดํ˜ธํ•ด์ค€๋‹ค.

โ†’ ์ง๋ ฌํ™” ํญํƒ„์€ ๊ฑธ๋Ÿฌ๋‚ด์ง€ ๋ชปํ•œ๋‹ค.

X Tutup