| r8 | ||
|---|---|---|
| r1 (새 문서) | 1 | [[분류:the seed]] |
| 2 | ||
| 3 | [목차] | |
| 4 | [clearfix] | |
| 5 | ||
| 6 | == 개요 == | |
| r5 | 7 | 2025년 9월 19일에 [[사용자:hyonsu]]에 의해 최초 발견되어 2025년 9월 23일 01시 (GMT +9)에 v4.28.0.897에서 해결된 the seed engine의 XSS 취약점. |
| r1 (새 문서) | 8 | |
| 9 | == 배경 설명 및 원인 == | |
| 10 | the seed engine에서는 문서 및 이름공간마다 사용자의 접근을 제한할 수 있는 [[ACL]] 시스템을 제공하고 있다. 일례로 [[더시드위키:대문]] 문서의 [[https://theseed.io/acl/더시드위키:대문|ACL]] 설정은 문서의 경우 편집, 토론 생성, ACL이, 더시드위키: 이름공간의 경우 편집, 이동, 삭제, ACL 권한이 '''aclgroup:관리자'''로 설정되어 있어, 해당 ACLGroup에 속한 사용자가 아니면 문서 읽기를 제외한 대부분의 동작이 불가하다. | |
| 11 | ||
| 12 | 이 ACL을 적용할 대상은 보유하고 있는 권한, 사용자, 아이피, GeoIP, 그리고 ACLGroup의 이름을 적음으로서 설정할 수 있는데, 사용자, 아이피, GeoIP와 다르게 권한[* 시기 불명의 업데이트 이후로 F12를 통한 단순 이름 수정은 저장 시점에 원래 이름으로 롤백되나, 요소를 복제하거나 내부 API 요청을 하는 방식으로 우회가 가능함.]과 ACLGroup 엔티티는 이름의 제약이 사실상 없이 자유롭게 생성할 수 있다. | |
| 13 | ||
| r8 | 14 | 문제는 문서 편집 및 편집 요청 시 ACL 조건에 미달하면 경고 메시지를 띄워주는 부분에서 HTML 이스케이핑을 하지 않아 모든 HTML 태그가 그대로 노출되었었다는 것이다. 따라서 이는 ACL을 조정 가능한 사용자가 임의의 HTML 태그를 삽입하여 문서를 편집 및 편집 요청 시도하는 사용자를 대상으로 XSS 공격을 할 수 있는 취약점으로 이어졌다. |
| r1 (새 문서) | 15 | |
| r6 | 16 | 이전부터 [[이 문서 ACL 탭에서 이상한 것 찾아보세요|이 문서]]에서 ACL perm 값을 입력(insert)했더니 ACL에 출력된 값이 perm이 아닌 function으로 다르게 나오는 현상처럼 코드가 실행될 잠재적 위험이 있었다. |
| 17 | {{{#!folding 입출력 비교 보기 [ 펼치기 · 접기 ] | |
| 18 | * 입력 (문서 역사 참고) | |
| 19 | 1. insert,edit,gotons,perm:constructor | |
| 20 | 1. insert,edit,gotons,perm:_\_proto__ | |
| 21 | 1. insert,edit,gotons,perm:valueOf | |
| 22 | 1. delete,edit,gotons,perm:_\_proto__ | |
| 23 | * 출력 (ACL) | |
| 24 | 1. function Object() { [native code] } 이름공간 ACL 실행 | |
| 25 | 1. function valueOf() { [native code] } 이름공간 ACL 실행}}} | |
| r1 (새 문서) | 26 | == 예시 == |
| 27 | [[사용자:39.7.59.164]] 문서의 [[https://theseed.io/acl/사용자:39.7.59.164|ACL]] 탭을 보면, {{{perm:<script>alert('xss');</script>}}}과 {{{perm:<script>window.location.assign('https://theseed.io/thread/RipeLuckyBrashWood')</script>}}}이 편집 조건으로 걸려있는 것을 볼 수 있다. | |
| 28 | ||
| 29 | 이는 엔진에 존재하지 않는 권한이기 때문에 문서 편집을 시도 시 편집이 거부되며 편집 요청으로 넘어가는데, 패치 전에는 '''편집 권한이 부족합니다. perm: OR perm: 이어야 합니다.''' 라는 메시지가 뜨며 ACL에 삽입한 script 태그가 필터링 없이 그대로 실행되는 현상이 발생했었다. | |
| 30 | ||
| 31 | 다행히 [[https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0|W3C HTML5]] 스펙 상 애초부터 페이지에 포함된 것이 아닌, 차후에 {{{.innerHTML}}} 등으로 포함된 {{{<script>}}} 태그의 경우 실행이 기술적으로 차단되어 있어 위키 내부에서 이동한 경우 문제가 발생하지는 않았으나, 그 상태에서 페이지를 새로고침하거나 애초에 외부 링크를 타고 들어온 경우 {{{alert('xss')}}}가 실행되며 경고 창이 뜨고, 이후 [[https://theseed.io/thread/RipeLuckyBrashWood]] 페이지로 강제 납치되었다. | |
| 32 | ||
| r7 | 33 | [[https://revi.wiki/wiki/%ED%8C%8C%EC%9D%BC:%EB%8D%94%EC%8B%9C%EB%93%9C_XSS_20250919.mp4|(외부 링크) 해당 취약점 시연 영상]][* [[사용자:revi]]에 의해 제공됨.] |
| r1 (새 문서) | 34 | == 위험성 == |
| 35 | HTML5 스펙 상 위키 내부 링크로 접근한 경우 문제가 없었으나, 그 상태에서 페이지를 새로고침하거나 외부 링크로 접속한 경우 임의의 코드를 실행시킬 수 있기 때문에 RCE 취약점으로 분류할 수 있다. 이는 CVE에서 어지간하면 Severity를 High 또는 Critical로 분류하는 취약점이다. | |
| 36 | ||
| 37 | 다행히 the seed engine을 사용하는 위키에서는 [[2017년 나무위키 XSS 공격 보고서]]에서도 언급한 바 있듯이 Content Security Policy가 적용되어 있고, 쿠키에는 모두 Secure 및 HttpOnly 플래그가 붙어있어 공격자가 쿠키를 외부 전송한다든가 할 수는 없다. 또한 ACL 엔티티는 그 길이가 255자로 제한되어 있어 공격자가 일정 길이 이상의 공격 코드를 짤 수 없었다. | |
| 38 | ||
| 39 | == 사례 == | |
| 40 | === 더시드위키에서 === | |
| 41 | ACL 조정은 [[admin]] 권한이 있어야 가능하나, 이 권한은 대부분의 사용자들이 아무 제약 없이 받을 수 있는 권한이기에 발견 즉시 모든 사용자의 ACL 조정 권한이 [[https://theseed.io/thread/AwfulAdDeliciousTurn|회수]]되었었고, v4.28.0.897에서 해결된 것을 확인 후 복구되었다. | |
| 42 | ||
| 43 | === 기타 the seed engine을 사용하는 위키에서 === | |
| 44 | [[admin]] 권한은 관리자에게만 부여되는 것이 정책이고, 취약점 자체도 최초 발견자가 더시드위키[* 정확히는 [[namu]]]에만 자세한 내용을 공개하였기 때문에 [[https://theseed.io/thread/RipeLuckyBrashWood]] 토론을 열람할 수 있었던 (= [[틀:정식 관리자 목록]]) 사용자를 제외하고는 해결 전까지 해당 취약점의 존재 자체를 알지 못했을 것으로 추정된다. |