r18 vs r19
......
1313
1414
또한 문서나 토론에서 특정 동작을 실행 시 ACL 조건에 미달하면 거부 후 경고 메시지[* 오류: (동작) 권한이 부족합니다. '''특정 조건''' 이어야 합니다.]를 출력하는 과정에서 '''특정 조건'''에 대한 이스케이핑을 하지 않아 사용자가 지정한 내용이 그대로 출력되었다. 따라서 이는 ACL을 조정 가능한 사용자가 임의의 HTML 태그를 삽입하여 문서를 편집 및 편집 요청 시도하는 사용자를 대상으로 XSS 공격을 할 수 있는 취약점으로 이어졌다.
1515
16
이전부터 [[이 문서 ACL 탭에서 이상한 것 찾아보세요|이 문서]]에서 ACL perm 값을 입력(insert)했더니 ACL에 출력된 값이 perm이 아닌 function으로 다르게 나오는 현상처럼 코드가 실행될 잠재적 위험이 있었다.[* 이 문제는 프론트엔드에서 내부적으로 조건이 perm이라면 값에 있는 any를 '''아무나''', admin을 '''관리자''' 등으로 변환하기 위해 ACL 엔티티의 값을 {{{(Object)[key] ?? key}}} 등으로 접근하면서 생긴 것으로 추정되며 이곳에 악의적 페이로드를 주입할 수는 없으나, 어쨌든 의도되지 않은 동작인 것은 분명하기 때문에 v4.28.0.897 업데이트 이후 다시 한 번 버전명 변경 없이 프론트엔드 업데이트가 되며 해결되었다.]
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 실행}}}
26
2716
== 예시 ==
2817
[[사용자: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>}}}이 편집 조건으로 걸려있는 것을 볼 수 있다.
2918
......
4534
4635
=== 기타 the seed engine을 사용하는 위키에서 ===
4736
[[admin]] 권한은 관리자에게만 부여되는 것이 정책이고, 취약점 자체도 최초 발견자가 더시드위키[* 정확히는 [[namu]]에게]에만 자세한 내용을 공개하였기 때문에 [[https://theseed.io/thread/RipeLuckyBrashWood]] 토론을 열람할 수 있었던 (= [[틀:정식 관리자 목록]]) 사용자를 제외하고는 해결 전까지 해당 취약점의 존재 자체를 알지 못했을 것으로 추정된다.[* 취약점 검증을 위한 ACL 조정은 사용자 문서에서 이루어졌기 때문에 최근 변경에 표시되지 않았고, 검증을 한 정식 관리자의 문서 기여 목록을 방문한 후, 해당 문서의 편집 창을 수동으로 접속하지 않은 이상 (상술했다시피 편집 버튼을 누르는 것만으로는 편집 요청으로 이동되므로 XSS 대상이 되지 않는다.) 취약점을 발견할 수 없었을 것이다.]
37
38
== 여담 ==
39
이 취약점을 발견하고 고치는 과정에서 [[이 문서 ACL 탭에서 이상한 것 찾아보세요]] 문서의 ACL 탭을 확인해보면
40
41
> * 입력 (문서 역사 참고)
42
> 1. {{{insert,edit,gotons,perm:constructor}}}
43
> 1. {{{insert,edit,gotons,perm:__proto__}}}
44
> 1. {{{insert,edit,gotons,perm:valueOf}}}
45
> * 출력 (ACL)
46
> 1. [object Object] 이름공간ACL 실행
47
> 1. function Object() { [native code] } 이름공간ACL 실행
48
> 1. function valueOf() { [native code] } 이름공간ACL 실행
49
으로 입력값과 다른 값이 나오는 것이 뒤늦게 발견되었다. 이 문제는 프론트엔드에서 내부적으로 ACL 조건이 '''perm'''이라면 원래 값인 any, member 등을 보기 좋게 변환하기 위해 권한 이름이 매핑된 객체에 접근하면서 생긴 것[* Javascript에서 객체의 값에 접근하는 것은 {{{object.key}}}뿐 아니라 {{{object['key']}}}로도 가능한데, 기본 정의된 키뿐 아니라 constructor에 정의된 내장 메서드의 이름 (예: {{{object['toString']}}})을 집어넣으면 그곳에도 접근이 가능해진다.]으로 추정된다.
50
51
상술한 취약점과 다르게 이 문제를 악용하여 악의적 페이로드를 주입할 수는 없으나, 어쨌든 의도되지 않은 동작인 것은 분명하기 때문에 v4.28.0.897 업데이트 이후 다시 한 번 버전명 변경 없이 프론트엔드 업데이트가 되며 해결되었다. Map을 하나 생성하여 .get()으로 확실히 그 안에 있는 키만 가져오는 것으로 변경된 모양.