r19
r16
1[Include(틀:보고서)]
r1

(새 문서)
2[목차]
3== 개요 ==
4간밤에 삽질하게 만든 사건.
5== 원인 ==
r18
6기능 링크[* 파서 내부적으로 \[\[파일:\~\~\~\~.png\]\] 나 \[\[분류:\~\~\~\~\]\] 를 이렇게 부른다.] 를 렌더링하는 과정에서 어떤 사유로 인해 렌더링 되지 못하면서[* 이경우에는 해당 이름을 가진 파일 문서가 존재하지 않아서] fallback 처리 로직이 실행되었는데 해당 로직에 escape를 실수로 빼먹어 버린 것.
r1

(새 문서)
7== 피해의 완화 ==
r10

(r8으로 되돌림)
8기본적으로 보안에 많은 염두를 두고 개발되었기 때문에 여러 가지 보안 대비책이 마련돼 있었다.
r1

(새 문서)
9=== Content Security Policy ===
10나무위키는 CSP가 활성화된 상태였기 때문에 공격자 입장에서는 XHR이나 img tag를 통해 외부 서버로 쿠키 전송 같은 짓거리를 할 수가 없어서, 처음에 취약점 소식을 들었을 땐 별 피해가 없겠거니 싶었다. 그런데 생각보다 좀 창의적인 공격을 했더라.
11기술 부채로 인해 script-src에 unsafe-inline 이 들어가서 이번 공격을 원천적으로 막을 수 없었던 것은 아쉬웠던 점.
12=== HttpOnly ===
r4

(r2으로 되돌림)
13기본적으로 세션 쿠키는 HttpOnly 속성이 켜져 있기 때문에 이번 공격에서 로그인한 상태여도 기본적으로 피해가 없었다.
14하지만 자동 로그인 쿠키[* honoka]에 해당 속성을 켜놓는 걸 깜박하는 바람에 자동 로그인한 사용자에게는 이번 공격의 영향을 받게 되버린 것이다!
15사실 자동 로그인 쿠키에 HttpOnly 속성만 들어가 있었어도 공격자가 특정 사이트--히토미--를 띄울 수 있었다는 것 외에 전혀 피해가 없을 수 있다는 점 또한 아쉬웠다.
r1

(새 문서)
16== 공격 코드 ==
r19
17{{{[[파일:<script>$('textarea').val(document.cookie);$('form.new-thread-form').submit();</script>]]}}}[* jQuery를 잘 모르는 분들을 위하여 설명하자면.. textarea 에 해당 페이지의 쿠키를 작성하라 라는 코드이다. 그 뒤 코드는 new-thread-form 이라는 클래스를 가진 폼을 제출 하라는 의미.JS로는 document.getElementsByTagName("textarea").value 가 되겠다.]
r14
18{{{[[파일:<script>location.assign('https://hitomi.la');</script>]]}}}[* 히토미로 날려버리라는 코드이다. 자바 스크립트으로 표현하자면 location.href 를 사용하면 된다.]
r1

(새 문서)
19
20구현의 귀찮음으로 인해 쓰레드에 레스를 작성하는 부분이 CSRF 토큰이 없었는데 사실 있어도 이 케이스에서는 별 쓸모가 없었다.
21다행인 점은 CSP로 인해 공격자가 외부 서버 등으로 쿠키를 전송할 수 없어서 토론 레스로 남기게 끔[* 좀 창의적이었다.] 했는데 이 때문에 정확한 피해자 특정이 가능했다.
22== 피해 ==
r8
23자동 로그인을 사용 중이고 해당 시간대에 해당 쓰레드에 접속했던 8명의 자동 로그인 토큰 유출[* 이 8명에는 당시 현직 관리자도 포함되어 있었다.]
r1

(새 문서)
24== 해결 ==
25 1. 파서의 해당 루틴 버그 수정됨.
26 1. 자동 로그인 쿠키에 HttpOnly 속성 적용
27 1. 장기적으로 inline script tag 제거 예정 --과연 언제가 될지?--
28== 결론 ==
r2
29뭐 패스워드나 이런게 유출된게 아니니...
r16
30규모에 비해 생각보다 피해는 적었다.
r17
31[[분류:보고서]][[분류:나무위키]]
r2
32
]]}}}[* jQuery를 잘 모르는 분들을 위하여 설명하자면.. textarea 에 해당 페이지의 쿠키를 작성하라 라는 코드이다. 그 뒤 코드는 new-thread-form 이라는 클래스를 가진 폼을 제출 하라는 의미.JS로는 document.getElementsByTagName(\"textarea\").value 가 되겠다.]","_ffe7c0c8":[]},{"_b29ab1e5":{"_eacbd280":"modify","_b02545fe":null,"_c4081b16":{"_87b3d66d":0,"_9834ea2c":"222.114.151.73","_615c3c93":"981f88c5-9875-4cba-bdb4-178bedcd256c","_9ced04ea":""},"_ec067d3d":null,"_615c3c93":"b9dce167-39ee-406c-a3f2-377a604a67de"},"_9f11dfdd":"#efbaea","_b4b5b75e":14,"_ab44097b":18,"_fbc3e8c9":"{{{[[파일:]]}}}[* 히토미로 날려버리라는 코드이다. 자바 스크립트으로 표현하자면 location.href 를 사용하면 된다.]","_ffe7c0c8":[]},{"_b29ab1e5":{"_eacbd280":"create","_b02545fe":null,"_c4081b16":{"_87b3d66d":1,"_9834ea2c":"namu","_615c3c93":"924b3ab7-968e-495e-ab23-30307b20bedc","_9ced04ea":null},"_ec067d3d":null,"_615c3c93":"9db259e6-9287-44d9-9241-6b3d4d5cd1df"},"_9f11dfdd":"#c9b9d9","_b4b5b75e":1,"_ab44097b":19,"_fbc3e8c9":"","_ffe7c0c8":["구현의 귀찮음으로 인해 쓰레드에 레스를 작성하는 부분이 CSRF 토큰이 없었는데 사실 있어도 이 케이스에서는 별 쓸모가 없었다.","다행인 점은 CSP로 인해 공격자가 외부 서버 등으로 쿠키를 전송할 수 없어서 토론 레스로 남기게 끔[* 좀 창의적이었다.] 했는데 이 때문에 정확한 피해자 특정이 가능했다.","== 피해 =="]},{"_b29ab1e5":{"_eacbd280":"modify","_b02545fe":null,"_c4081b16":{"_87b3d66d":0,"_9834ea2c":"211.109.238.136","_615c3c93":"c28b217b-c7a1-4ff7-9161-2c0093cdf764","_9ced04ea":""},"_ec067d3d":null,"_615c3c93":"d11a43ad-636c-43b2-92a7-a69a0bf1c36e"},"_9f11dfdd":"#fecbf7","_b4b5b75e":8,"_ab44097b":23,"_fbc3e8c9":"자동 로그인을 사용 중이고 해당 시간대에 해당 쓰레드에 접속했던 8명의 자동 로그인 토큰 유출[* 이 8명에는 당시 현직 관리자도 포함되어 있었다.]","_ffe7c0c8":[]},{"_b29ab1e5":{"_eacbd280":"create","_b02545fe":null,"_c4081b16":{"_87b3d66d":1,"_9834ea2c":"namu","_615c3c93":"924b3ab7-968e-495e-ab23-30307b20bedc","_9ced04ea":null},"_ec067d3d":null,"_615c3c93":"9db259e6-9287-44d9-9241-6b3d4d5cd1df"},"_9f11dfdd":"#c9b9d9","_b4b5b75e":1,"_ab44097b":24,"_fbc3e8c9":"== 해결 ==","_ffe7c0c8":[" 1. 파서의 해당 루틴 버그 수정됨."," 1. 자동 로그인 쿠키에 HttpOnly 속성 적용"," 1. 장기적으로 inline script tag 제거 예정 --과연 언제가 될지?--","== 결론 =="]},{"_b29ab1e5":{"_eacbd280":"modify","_b02545fe":null,"_c4081b16":{"_87b3d66d":1,"_9834ea2c":"LiteHell","_615c3c93":"2c2c6f75-0354-4216-bf3f-e85c4486c9ef","_9ced04ea":null},"_ec067d3d":null,"_615c3c93":"c5e3ed2e-b168-4875-8cc1-2bea56f735f1"},"_9f11dfdd":"#f9edc1","_b4b5b75e":2,"_ab44097b":29,"_fbc3e8c9":"뭐 패스워드나 이런게 유출된게 아니니...","_ffe7c0c8":[]},{"_b29ab1e5":{"_eacbd280":"modify","_b02545fe":null,"_c4081b16":{"_87b3d66d":1,"_9834ea2c":"nkb1018","_615c3c93":"613aa54e-ccd9-480b-b015-5b0183d49039","_9ced04ea":null},"_ec067d3d":null,"_615c3c93":"ac2f18f7-529d-4ff1-be57-5bf9c0297d92"},"_9f11dfdd":"#dbe9d2","_b4b5b75e":16,"_ab44097b":30,"_fbc3e8c9":"규모에 비해 생각보다 피해는 적었다.","_ffe7c0c8":[]},{"_b29ab1e5":{"_eacbd280":"modify","_b02545fe":null,"_c4081b16":{"_87b3d66d":1,"_9834ea2c":"kiwitree","_615c3c93":"c1349b0e-d246-426a-b973-0ef7dc2518da","_9ced04ea":null},"_ec067d3d":null,"_615c3c93":"3f021999-5ca7-4ea0-87be-37a6200a1f13"},"_9f11dfdd":"#fdcaf8","_b4b5b75e":17,"_ab44097b":31,"_fbc3e8c9":"[[분류:보고서]][[분류:나무위키]]","_ffe7c0c8":[]},{"_b29ab1e5":{"_eacbd280":"modify","_b02545fe":null,"_c4081b16":{"_87b3d66d":1,"_9834ea2c":"LiteHell","_615c3c93":"2c2c6f75-0354-4216-bf3f-e85c4486c9ef","_9ced04ea":null},"_ec067d3d":null,"_615c3c93":"c5e3ed2e-b168-4875-8cc1-2bea56f735f1"},"_9f11dfdd":"#f9edc1","_b4b5b75e":2,"_ab44097b":32,"_fbc3e8c9":"","_ffe7c0c8":[]}],"_b4b5b75e":19,"_615c3c93":"503093cb-76e7-4230-aac5-a8477d097754","_53ded5ff":{}},"_cbdeece3":{},"_7e739553":false,"_5b13eb80":[],"_c2ccb9f5":true},"_95a8879c":{"_c4081b16":{"_87b3d66d":0,"_9834ea2c":"18.189.143.1","_615c3c93":null,"_9ced04ea":null},"_904bc709":false,"_30fda20f":null,"_f586506a":null,"_73d9fe2d":[],"_babf43c9":"i:18.189.143.1","_5b13eb80":[]},"_36ce4247":{},"_1d4dfb8c":"862bfaba36fe1292f342420a39ecb9a0","_0b931813":"fadbe6690a1b8894ff63815f6cb9339f","page":{"viewName":"blame","data":{"document":{"_3cb72bb0":"문서","_a31ecb54":"2017년 나무위키 XSS 공격 보고서","_5c14b043":false,"namespace":"문서","title":"2017년 나무위키 XSS 공격 보고서","forceShowNamespace":false},"rev":19,"uuid":"503093cb-76e7-4230-aac5-a8477d097754"},"title":"2017년 나무위키 XSS 공격 보고서 (Blame)","menus":[]},"session":{"menus":[],"account":{"_87b3d66d":0,"_9834ea2c":"18.189.143.1","_615c3c93":null,"_9ced04ea":null,"name":"18.189.143.1","type":0,"uuid":null},"gravatar_url":null,"user_document_discuss":null,"quick_block":false},"currentTheme":"light"}