r16 vs r17
1
[[분류:the seed]][[분류:보고서]]
1
[[분류:the seed]] [[분류:보고서]]
22
33
[목차]
44
[clearfix]
......
77
2025년 9월 19일에 [[사용자:hyonsu]]에 의해 최초 발견되어 2025년 9월 23일 01시 (GMT +9)에 v4.28.0.897에서 해결된 the seed engine의 XSS 취약점.
88
99
== 배경 설명 및 원인 ==
10
the seed engine에서는 문서 및 이름공간마다 사용자의 접근을 제한할 수 있는 [[ACL]] 시스템을 제공하고 있다. 일례로 [[더시드위키:대문]] 문서의 [[https://theseed.io/acl/더시드위키:대문|ACL]] 설정은 문서의 경우 편집, 토론 생성, ACL이, 더시드위키: 이름공간의 경우 편집, 이동, 삭제, ACL 권한이 '''aclgroup:관리자'''로 설정되어 있어, 해당 ACLGroup에 속한 사용자가 아니면 문서 읽기를 제외한 대부분의 동작이 불가하다.
10
the seed engine에서는 문서 및 이름공간마다 사용자의 접근을 제한할 수 있는 [[ACL]] 시스템을 제공하고 있다. 일례로 [[더시드위키:대문]] 문서의 [[https://theseed.io/acl/더시드위키:대문|ACL]] 설정은 문서의 경우 편집, 토론 생성, ACL이, 더시드위키: 이름공간의 경우 편집, 이동, 삭제, ACL 권한이 '''aclgroup:관리자'''로 설정되어 있어, 해당 ACLGroup에 속한 사용자가 아니면 상술된 동작이 차단된다.
1111
12
이 ACL을 적용할 대상은 보유하고 있는 권한, 사용자, 아이피, GeoIP, 그리고 ACLGroup의 이름을 적음으로서 설정할 수 있는데, 사용자, 아이피, GeoIP와 다르게 권한[* 시기 불명의 업데이트 이후로 F12를 통한 단순 이름 수정은 저장 시점에 원래 이름으로 롤백되나, 요소를 복제하거나 내부 API 요청을 하는 방식으로 우회가 가능함.]과 ACLGroup 엔티티는 이름의 제약이 사실상 없이 자유롭게 생성할 수 있다.
12
이 ACL을 적용할 대상은 권한, 사용자, 아이피, GeoIP, 그리고 ACLGroup의 이름을 적음으로서 설정할 수 있는데, 사용자, 아이피, GeoIP와 다르게 권한[* 시기 불명의 업데이트 이후로 F12를 통한 단순 이름 수정은 저장 시점에 원래 이름으로 롤백되나, 요소를 복제 후 수정하거나 내부 API 요청을 하는 방식으로 우회가 가능함.]과 ACLGroup 엔티티[* 존재하ACLGroup만 적을 수 있으나 그 이름으로 된 ACLGroup을 만들면 그만이므로]는 이름의 제약이 사실상 없다.
1313
14
문제는 문서 편집 편집 요청 시 ACL 조건에 미달하면 경고 메시지를 띄워주부분에서 HTML 이스케이핑을 하지 않아 모든 HTML 태그가 그대로 출되었는 것이다. 따라서 이는 ACL을 조정 가능한 사용자가 임의의 HTML 태그를 삽입하여 문서를 편집 및 편집 요청 시도하는 사용자를 대상으로 XSS 공격을 할 수 있는 취약점으로 이어졌다.
14
또한 문서 토론에서 특정 동작을 실행 시 ACL 조건에 미달하면 거부 후 경고 메시지[* 오류: (동작) 권한이 부족합니다. '''특정 조건''' 이어야 합니다.]출력하과정에서 '''특정 조건'''에 대한 이스케이핑을 하지 않아 사용자가 지정한 내용이 그대로 출되었다. 따라서 이는 ACL을 조정 가능한 사용자가 임의의 HTML 태그를 삽입하여 문서를 편집 및 편집 요청 시도하는 사용자를 대상으로 XSS 공격을 할 수 있는 취약점으로 이어졌다.
1515
16
이전부터 [[이 문서 ACL 탭에서 이상한 것 찾아보세요|이 문서]]에서 ACL perm 값을 입력(insert)했더니 ACL에 출력된 값이 perm이 아닌 function으로 다르게 나오는 현상처럼 코드가 실행될 잠재적 위험이 있었다.[* 이 문제는 v4.28.0.897 업데이트 이후 다시 한 번 버전명 변경 없이 업데이트가 되며 해결되었다.]
16
이전부터 [[이 문서 ACL 탭에서 이상한 것 찾아보세요|이 문서]]에서 ACL perm 값을 입력(insert)했더니 ACL에 출력된 값이 perm이 아닌 function으로 다르게 나오는 현상처럼 코드가 실행될 잠재적 위험이 있었다.[* 이 문제는 프론트엔드에서 내부적으로 조건이 perm이라면 값에 있는 any를 '''아무나''', admin을 '''관리자''' 등으로 변환하기 위해 ACL 엔티티의 값을 {{{(Object)[key] ?? key}}} 등으로 접근하면서 생긴 것으로 추정되며 이곳에 악의적 페이로드를 주입할 수는 없으나, 어쨌든 의도되지 않은 동작인 것은 분명하기 때문에 v4.28.0.897 업데이트 이후 다시 한 번 버전명 변경 없이 프론트엔드 업데이트가 되며 해결되었다.]
1717
{{{#!folding 당시 입출력 비교 보기 [ 펼치기 · 접기 ]
1818
* 입력 (문서 역사 참고)
1919
1. insert,edit,gotons,perm:constructor
......
2727
== 예시 ==
2828
[[사용자: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>}}}이 편집 조건으로 걸려있는 것을 볼 수 있다.
2929
30
이는 엔진에 존재하지 않는 권한이기 때문에 문서 편집을 시도 시 편집이 거부되며 편집 요청으로 넘어가는데, 패치 전에는 '''편집 권한이 부족합니다. perm: OR perm: 이어야 합니다.''' 라는 메시지가 뜨며 ACL에 삽입한 script 태그필터링 없이 그대실행되는 현상이 발생했었다.
30
이는 엔진에 존재하지 않는 권한이기 때문에 문서 편집을 시도 시 편집이 거부되며 편집 요청으로 넘어가는데, 패치 전에는 '''편집 권한이 부족합니다. perm: OR perm: 이어야 합니다.''' 라는 메시지가 뜨며 ACL에 삽입한 내용이 textContent아니라 innerHTML출력되는 현상이 발생했었다.
3131
3232
다행히 [[https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml0|W3C HTML5]] 스펙 상 애초부터 페이지에 포함된 것이 아닌, 차후에 {{{.innerHTML}}} 등으로 포함된 {{{<script>}}} 태그의 경우 실행이 기술적으로 차단되어 있어 위키 내부에서 이동한 경우 문제가 발생하지는 않았으나, 그 상태에서 페이지를 새로고침하거나 애초에 외부 링크를 타고 들어온 경우 {{{alert('xss')}}}가 실행되며 경고 창이 뜨고, 이후 [[https://theseed.io/thread/RipeLuckyBrashWood]] 페이지로 강제 납치되었다.
3333
3434
[[https://revi.wiki/wiki/파일:더시드_XSS_20250919.mp4|(외부 링크) 해당 취약점 시연 영상]][* [[사용자:revi]]에 의해 [[https://theseed.io/thread/AboundingGlibLittleBait#318|제공]]됨.]
3535
== 위험성 ==
36
HTML5 스펙 위키 내부 링크로 접근한 경우 문제가 없었으나, 상태에서 페이지를 새로고침하거나 외부 링크로 접속경우 임의의 코드를 실행시킬 있기 때문에 RCE 취약점으로 분류할 다. 이는 CVE에어지간하면 Severity를 High 또는 Critical로 분류 취약점이다.
36
하나의 ACL 엔티티는 길이를 최대 255자까지밖에 지정할 없기는 나, 추가할 있는 ACL 엔티티의 개수에는 없기에 사실상 무용지물로, 내부에 값을 잔뜩 추가한 다음 eval()을 해버리면 간단히 우회가 가능했었다. 따라공격자가 공격 코드의 길이 제한을 간단 없애버릴 수 있었다.
3737
38
다행히 the seed engine을 사용하는 위키에서는 [[2017년 나무위키 XSS 공격 보고서]]에서도 언급 있듯이 Content Security Policy적용되어 있고, 쿠키 모두 Secure HttpOnly 플래그가 붙어있어 공격자가 쿠키외부 전송한다든가 할 없다. 또한 ACL 엔티티는 그 길이가 255자제한되어 공격자가 일정 길이상의 공격 코드 없었다.
38
또한 HTML5 스펙 위키 내부 링크로 접근경우 문제없었으나, 그 상태 페이지를 새로고침하거나 외부 링크로 접속한 경우 임의의 코드실행시킬있기 때문에 RCE 취약점으분류할 다. CVE에서 어지간하면 SeverityHigh 또는 Critical로 분류하는 취약점이다.
3939
40
다행히 the seed engine을 사용하는 위키에서는 [[2017년 나무위키 XSS 공격 보고서]]에서도 언급한 바 있듯이 Content Security Policy가 적용되어 있고, 쿠키에는 모두 Secure 및 HttpOnly 플래그가 붙어있어 공격자가 쿠키를 외부 전송한다든가 할 수는 없었다.
41
4042
== 진행상황 ==
4143
=== 더시드위키에서 ===
4244
ACL 조정은 [[admin]] 권한이 있어야 가능하나, 이 권한은 대부분의 사용자들이 아무 제약 없이 받을 수 있는 권한이기에 발견 즉시 모든 사용자의 ACL 조정이 [[https://theseed.io/thread/AwfulAdDeliciousTurn|제한]]되었고, v4.28.0.897에서 해결된 것을 확인 후 ACL 조정이 제한 해제되었다.
......