item 85 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

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

  • ์ž๋ฐ”์˜ ์—ญ์ง๋ ฌํ™”๋Š” ๋ช…๋ฐฑํ•˜๊ณ  ํ˜„์กดํ•˜๋Š” ์œ„ํ—˜์ด๋‹ค. ์ด ๊ธฐ์ˆ ์€ ์ง€๊ธˆ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง ์ ‘ ํ˜น์€, ์ž๋ฐ” ํ•˜๋ถ€ ์‹œ์Šคํ…œ(RMI(Remote Method Invocation), JMX(Java Management Extension), JMS(Java Messaging System) ๊ฐ™์€)์„ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์“ฐ์ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ ์ด๋‹ค. ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ŠคํŠธ๋ฆผ์„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ฉด ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(remote code execution, RCE), ์„œ๋น„์Šค ๊ฑฐ๋ถ€(denial-of-service, DoS) ๋“ฑ์˜ ๊ณต๊ฒฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ž˜๋ชปํ•œ ๊ฒŒ ์•„ ๋ฌด๊ฒƒ๋„ ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋„ ์ด๋Ÿฐ ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค

์—ญ์ง๋ ฌํ™” ํญํƒ„

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); // ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฉ”์„œ๋“œ์˜ ์ฝ”๋“œ๋Š” ์ƒ๋žตํ•จ 
}

1 ์ด ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋Š” 201๊ฐœ์˜ HashSet ์ธ์Šคํ„ด์Šค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ทธ ๊ฐ๊ฐ์€ 3๊ฐœ ์ด ํ•˜์˜ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. 2 ๋ฌธ์ œ๋Š” HashSet ์ธ์Šคํ„ด์Šค ๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜๋ ค๋ฉด ๊ทธ ์›์†Œ๋“ค์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ์žˆ๋‹ค. 3 ๋ฃจํŠธ HashSet์— ๋‹ด๊ธด ๋‘ ์›์†Œ๋Š” ๊ฐ๊ฐ (๋ฃจํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) ๋‹ค๋ฅธ HashSet 2๊ฐœ์”ฉ์„ ์› ์†Œ๋กœ ๊ฐ–๋Š” HashSet์ด๋‹ค. 4 ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋ฌธ์— ์˜ํ•ด ์ด ๊ตฌ์กฐ๊ฐ€ ๊นŠ์ด 100๋‹จ๊ณ„๊นŒ์ง€ ๋งŒ ๋“ค์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ด HashSet์„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ ค๋ฉด hashCode ๋ฉ”์„œ๋“œ๋ฅผ 2^100๋ฒˆ ๋„˜๊ฒŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

  • ์—ญ์ง๋ ฌํ™”๊ฐ€ ์˜์›ํžˆ ๊ณ„์†๋œ๋‹ค๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ์ง€๋งŒ, ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜ ์—ˆ๋‹ค๋Š” ์‹ ํ˜ธ์กฐ์ฐจ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋„ ํฐ ๋ฌธ์ œ๋‹ค.
  • ์ด ์ฝ”๋“œ๋Š” ๋‹จ ๋ช‡ ๊ฐœ์˜ ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ•ด๋„ ์Šคํƒ ๊นŠ์ด ์ œํ•œ์— ๊ฑธ๋ ค๋ฒ„๋ฆฐ๋‹ค. ์ด ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋Š” 201๊ฐœ์˜ HashSet ์ธ์Šคํ„ด์Šค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ทธ ๊ฐ๊ฐ์€ 3๊ฐœ ์ด ํ•˜์˜ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

์ง๋ ฌํ™” ์œ„ํ—˜์„ ํšŒํ”ผํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋ฌด๊ฒƒ๋„ ์—ญ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

  • ๊ฐ์ฒด์™€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋งŽ์ด ์žˆ๋‹ค. ์ด ๋ฐฉ์‹๋“ค์€ ์ž๋ฐ” ์ง๋ ฌํ™”์˜ ์—ฌ๋Ÿฌ ์œ„ํ—˜์„ ํšŒํ”ผํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ์ง€์›, ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ, ํ’ ๋ถ€ํ•œ ์ง€์› ๋„๊ตฌ, ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ „๋ฌธ๊ฐ€ ์ง‘๋‹จ ๋“ฑ ์ˆ˜๋งŽ์€ ์ด์ ๊นŒ์ง€ ์ œ๊ณตํ•œ๋‹ค.
  • ์ด ์ฑ…์—์„œ๋Š” ์ž ๋ฐ” ์ง๋ ฌํ™”์™€ ๊ตฌ๋ถ„ํ•˜๊ณ ์ž ํฌ๋กœ์Šค-ํ”Œ๋žซํผ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ํ‘œํ˜„(cross-platform structured-data representation)์ด๋ผ ํ•œ๋‹ค.

ํ•ต์‹ฌ์ •๋ฆฌ

์ง๋ ฌํ™”๋Š” ์œ„ํ—˜ํ•˜๋‹ˆ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.
์‹œ์Šคํ…œ์„ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด JSON์ด๋‚˜ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๊ฐ™์€ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜์ž.
์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—ญ์ง๋ ฌํ™”ํ•˜์ง€ ๋ง์ž.
๊ผญ ํ•ด์•ผ ํ•œ๋‹ค ๋ฉด ๊ฐ์ฒด ์—ญ์ง๋ ฌํ™” ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๋˜, ์ด๋งˆ์ €๋„ ๋ชจ๋“  ๊ณต๊ฒฉ์„ ๋ง‰์•„์ค„ ์ˆ˜๋Š” ์—†์Œ์„ ๊ธฐ์–ตํ•˜์ž.
ํด๋ž˜์Šค๊ฐ€ ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜๋„๋ก ๋งŒ๋“ค์ง€ ๋ง๊ณ , ๊ผญ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋ฉด ์ •๋ง ์‹ ๊ฒฝ ์จ์„œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ