T2Editor 9.1.1 대비 9.1.2-alpha1.0.1 비교감사 보고서
- T2Editor 9.1.1 대비 9.1.2-alpha1.0.1 비교감사 보고서
- 1. 감사 개요
- 2. 감사 방법
- 2.1 조사 절차
- 2.2 조사 기준
- 3. 비교 총괄
- 3.1 버전 간 구조 변화
- 3.2 변경 파일 목록
- 4. 보안성 비교 평가
- 4.1 업로드 보안
- 4.2 출력 경계 및 XSS 방어
- 4.3 클라이언트 sanitizer 및 붙여넣기 경계
- 4.4 비디오 재생 경계
- 4.5 Host/Origin 정책
- 5. 코드 완성도 및 아키텍처 평가
- 5.1 코드 완성도
- 5.2 잔존 과제
- 6. 사용자 경험(UX) 비교 평가
- 6.1 체감 개선 항목
- 6.2 UX 평가
- 7. 문법 검사 및 테스트 결과
- 7.1 문법 검사
- 7.2 스팟 테스트 결과
- 8. 잔존 위험 및 권고
- 9. 최종 판정
- 9.1 배포 의견
본 보고서는 T2Editor 9.1.1을 기준선으로 하여 9.1.2-alpha1.0.1 패키지 전체를 비교감사한 결과를 정리한 것이다. 전체 파일 수는 양 버전 모두 69개이며, 신규 추가·삭제 파일 없이 18개 파일에서 총 3,907라인 규모의 실질 변경이 확인되었다. 감사 결과, 9.1.2-alpha1.0.1은 업로드 보안, 비디오 처리, 편집기 출력 경계, 파일 블럭 복원성, 코드블럭 입력 안정성, 설정 공통화 측면에서 9.1.1 대비 현저한 개선이 이루어진 것으로 판단된다. 다만 일부 협업 엔드포인트의 CORS 정책, IPv6 literal 호스트 처리, 특정 비기본 포트 환경에서의 Origin 엄격성 등 후속 보완이 필요한 항목이 남아 있으므로 최종 판정은 '''조건부 적정'''으로 한다.
1. 감사 개요
| 항목 | 내용 |
|---|---|
| 기준 버전 | 9.1.1 |
| 비교 대상 버전 | 9.1.2-alpha1.0.1 |
| 조사 범위 | 패키지 전체 69개 파일 |
| 추가/삭제 파일 | 없음 |
| 변경 파일 | 18개 |
| 변경 규모 | 총 3,907라인(추가+삭제 기준) |
| 감사 관점 | 코드 취약점, 코드 완성도, 사용자 경험, 운영 안정성 |
| 최종 판정 | '''조건부 적정''' |
2. 감사 방법
2.1 조사 절차
- 양 버전 패키지 전체 파일 목록 대조
- 변경 파일 18개 식별
- 전체 파일 인벤토리 및 기능군별 전수 검토
- 변경 파일 전수 diff 분석
- 변경 PHP 파일 문법 검사
- 변경 JavaScript 파일 문법 검사
- 허용 도메인, Origin, MIME/매직바이트 검증, URL 허용 로직에 대한 스팟 테스트
2.2 조사 기준
- 서버측 입력 검증이 확장자·크기 수준을 넘는지 여부
- HTML/JS 문맥에 대한 출력 이스케이프와 컨텍스트 분리가 이루어졌는지 여부
- 외부 URL 허용 정책이 중앙화되어 있는지 여부
- 업로드 후 블럭 생성, 저장, 재로딩, 뷰어 표시까지의 생명주기가 일관적인지 여부
- 편집기 입력 동작이 브라우저/기기별로 안정화되었는지 여부
3. 비교 총괄
3.1 버전 간 구조 변화
| 구분 | 9.1.1 | 9.1.2-alpha1.0.1 | 평가 |
|---|---|---|---|
| 업로드 검증 | 확장자·크기 중심 | MIME·매직바이트·파일명 정제·Origin 검증 공통화 | 대폭 개선 |
| Host/URL 정책 | HTTP_HOST 무검증, 허용 도메인 체계 없음 | Host 형식 검증 + 허용 도메인 정책 중앙화 | 개선 |
| 비디오 뷰어 | 외부 URL 오판정 및 상대경로 검증 미흡 | same-origin/허용 도메인 기반 허용 + 경로 포함 검증 | 개선 |
| 파일 플러그인 | 업로드/복원/오디오 표시 재연결 취약 | 업로드 위임, 블럭 마킹, 복원성 강화 | 개선 |
| 코드블럭 편집 | 일부 환경 Enter 두 번 입력 이슈 | beforeinput/keydown 보강 | 개선 |
| paste/sanitize | 수제 sanitizer와 평문 재삽입 혼재 | 이벤트 제거, URL 프로토콜 차단, 평문 이스케이프 강화 | 개선 |
| 설정 조회 | 중복 함수/전역 CORS | 공통 함수 재사용, Origin 검증 | 개선 |
| 협업 보조 엔드포인트 | 전역 CORS 및 정리 로직 불일치 | 일부는 그대로 유지 | 잔존 과제 |
3.2 변경 파일 목록
| 번호 | 파일 | 변화 성격 |
|---|---|---|
| 1 | config/get_upload_config.php | 중복 선언 제거, Origin 검증 통합 |
| 2 | config/nsfw_api_browser.js | NSFW 브라우저 런타임 보강 |
| 3 | config/t2_config.php | Host 검증, 허용 도메인 공통화, 경로 계산 보강 |
| 4 | config/upload_config.php | 업로드 공통 보안 경계 대폭 강화 |
| 5 | editor.lib.php | 출력 경계/XSS 방어, 컨텍스트 분리, textarea 이스케이프 |
| 6 | js/core.js | paste 경계, autosave 복원, URL 프로토콜 차단, 예외 방지 |
| 7 | js/utils.js | 모달 className 입력 정제 |
| 8 | plugin/code/code.js | 코드블럭 복원 및 Enter 입력 안정화 |
| 9 | plugin/file/file.js | 파일 블럭 위임·복원·표시 안전화 |
| 10 | plugin/file/file_upload.php | uid 정제 완화, 공통 검증 연계, JSON 응답 안정화 |
| 11 | plugin/file/pdf_view.php | 출력 이스케이프·경로 처리 보강 |
| 12 | plugin/image/image.css | NSFW/SafeAI UI 보강 |
| 13 | plugin/image/image.js | NSFW 진행 UI, 업로드 래퍼, 모달 안정화 |
| 14 | plugin/image/image_upload.php | Origin·자원 제한·검증 강화 |
| 15 | plugin/table/table.js | 붙여넣기 이벤트 속성 제거 |
| 16 | plugin/video/video.js | 업로드 위임·응답 파싱·표시 안전화 |
| 17 | plugin/video/video_view.php | 허용 도메인 기반 비디오 재생 경로 재설계 |
| 18 | readme.txt | 버전 정보 갱신 |
4. 보안성 비교 평가
4.1 업로드 보안
9.1.1의 업로드 경계는 사실상 확장자와 파일 크기 중심이었다. 이에 비해 9.1.2-alpha1.0.1에서는 config/upload_config.php를 공통 보안 계층으로 재정의하여 다음 요소가 실제 반영되었다.
check_request_origin()도입 및 POST/PUT/DELETE의 빈 Origin 차단sanitize_original_name()도입verify_file_magic_bytes()도입validate_upload_file()의$tmp_path확장- 이미지 최대 픽셀 수, 엄격 WebP 정책 도입
- 비디오 MIME/매직바이트 허용 범위의 현실화
'''감사의견'''
9.1.1 대비 가장 개선 폭이 큰 영역이다. 위장 확장자, 내용 불일치 파일, 환경별 MIME false negative 문제를 동시에 다루었다는 점에서 보안성과 실사용성을 함께 개선하였다.
4.2 출력 경계 및 XSS 방어
9.1.1에서 가장 치명적인 결함이었던 editor.lib.php의 raw textarea 출력과 JS bootstrap 문자열 구성은 9.1.2-alpha1.0.1에서 구조적으로 보강되었다.
주요 개선점:
json_encode(JSON_HEX_TAG | JSON_HEX_AMP)적용$safe_idHTML 속성 이스케이프- JS 컨텍스트에서 raw
$id를 별도json_encode()로 사용 - hidden textarea의
$content에htmlspecialchars()적용 - 로드 헬퍼(CSS/JS link/script)의 URL 구성 요소 이스케이프
'''감사의견'''
9.1.1 기준 critical로 판단되었던 영역이 9.1.2-alpha1.0.1에서는 실질적으로 해소되었다. 특히 hidden textarea와 </script> 탈출 문제를 동시에 잡았다는 점은 중요하다.
4.3 클라이언트 sanitizer 및 붙여넣기 경계
9.1.1의 js/core.js는 innerHTML 재삽입과 얕은 sanitizer에 의존했다. 9.1.2-alpha1.0.1에서는 다음 보강이 추가되었다.
- 붙여넣기 시 before/after 평문 HTML 이스케이프
- autosave 복원 시
script제거 및on*속성 제거 - foreign HTML 정리 단계에서
script,style,on*속성 제거 - 이미지/iframe clone 시 위험 프로토콜 및 이벤트 속성 제거
sanitizeHTML()에서style허용 제거,href/src프로토콜 검증 추가
'''감사의견'''
9.1.1 대비 공격면이 현저히 축소되었다. 다만 완전한 검증된 sanitizer 라이브러리 수준에는 아직 미치지 못하므로, 향후 DOMPurify급 대체는 여전히 권고할 수 있다.
4.4 비디오 재생 경계
9.1.1의 plugin/video/video_view.php는 http로 시작하는 절대 URL을 그대로 허용하거나, 반대로 내부 절대 URL을 외부 URL로 오판정하는 구조였다. 9.1.2-alpha1.0.1에서는 다음과 같이 재설계되었다.
t2_config.php기반 허용 도메인 공통화t2editor_is_allowed_url()도입- same-origin 및 명시적 allowlist 도메인만 허용
- 상대경로는
realpath()기반 포함 검증 유지 - MIME 타입 확장 및 출력 이스케이프 보강
'''감사의견'''
보안성과 기능성을 함께 개선한 대표 사례다. 9.1.1에서 발생했던 비디오 업로드 후 재생 불가, 외부 URL 오판정, 경로 검증 부재 문제가 동시에 해소되었다.
4.5 Host/Origin 정책
9.1.1은 HTTP_HOST를 검증 없이 URL 상수 계산에 사용했고, 설정 조회 경로에는 전역 CORS가 존재했다. 9.1.2-alpha1.0.1에서는 다음 개선이 확인되었다.
HTTP_HOST형식 검증T2EDITOR_ALLOWED_URL_DOMAINS및 공통 함수 도입get_upload_config.php에서 전역 CORS 제거, 공통 Origin 검증 사용
'''감사의견'''
운영 환경 신뢰 경계가 9.1.1 대비 한 단계 성숙했다. 다만 IPv6 literal 파싱과 비기본 포트 환경에서의 Origin 엄격성은 후속 보완 대상이다.
5. 코드 완성도 및 아키텍처 평가
5.1 코드 완성도
9.1.2-alpha1.0.1은 9.1.1 대비 “기능을 추가한 버전”이라기보다 “기능이 살아 있는 상태에서 안전하고 유지보수 가능한 방향으로 정리한 버전”에 가깝다.
관찰된 개선점:
- 업로드 공통 경계를 설정 레이어로 승격
- 허용 도메인 정책을
t2_config.php에 중앙화 - 파일/이미지/비디오 업로드를 각 플러그인 공개 API로 위임
- 예외 발생 가능 지점(rangeCount, selection null 등)에 가드 추가
DOMNodeInserted의존을MutationObserver로 대체generateUid()의 충돌 가능성을crypto.randomUUID()폴백 구조로 완화
'''감사의견'''
아키텍처 관점에서 9.1.1보다 분명히 성숙한 형태다. 특히 공통 정책을 설정 계층으로 올리고, 플러그인별 업로드를 해당 플러그인으로 되돌린 설계는 유지보수성과 일관성 측면에서 높은 평가가 가능하다.
5.2 잔존 과제
plugin/collab/collab_number_delete.php의Access-Control-Allow-Origin: *유지- IPv6 literal 호스트 파싱 미흡
- 동일 출처라도 포트가 명시된 환경에서는 Origin 비교가 엄격하게 동작함
js/core.js는 여전히 자체 sanitizer 유지 구조이므로 장기적으로는 대체 권고 가능
6. 사용자 경험(UX) 비교 평가
6.1 체감 개선 항목
9.1.2-alpha1.0.1은 보안 패치 성격이 강하지만, 사용자 체감 개선도 적지 않다.
- 파일 블럭 생성·재로딩·삭제/이동/오디오 표시 복원 개선
- 비디오 업로드 실패 및 비디오 블럭 재생 실패 문제 해소
- 코드블럭 Enter 입력 안정화
- NSFW/SafeAI 진행률 표시와 모달 정리 개선
- 필수 플러그인 로드 타이밍 보정으로 초기 로딩 안정성 향상
6.2 UX 평가
| 항목 | 9.1.1 | 9.1.2-alpha1.0.1 | 평가 |
|---|---|---|---|
| 비디오 업로드 | 환경 의존적 실패 가능 | 안정화 | 개선 |
| 파일 블럭 복원 | 일부 누락 가능 | 구조적 복원 로직 강화 | 개선 |
| 코드블럭 입력 | 일부 기기 불안정 | 개행 안정화 | 개선 |
| NSFW 모델 로딩 | 상태 피드백 제한적 | 진행률/상태 UI 보강 | 개선 |
| 모달/Selection 안정성 | 예외 노출 가능 | rangeCount 가드 등 보강 | 개선 |
7. 문법 검사 및 테스트 결과
7.1 문법 검사
변경 PHP 파일 및 변경 JavaScript 파일에 대해 문법 검사 결과 오류가 확인되지 않았다.
7.2 스팟 테스트 결과
| 테스트 | 결과 | 판정 |
|---|---|---|
t2editor_get_allowed_domains() same-origin/allowlist | 정상 동작 | 양호 |
| 비허용 외부 도메인 차단 | 정상 차단 | 양호 |
| POST + 빈 Origin | 차단 | 양호 |
| 비정상 Origin | 차단 | 양호 |
| 허용 포트 일치 Origin | 허용 | 양호 |
위장 .mp4 업로드 | 매직바이트 불일치로 차단 | 양호 |
| PHP 문법 검사 | 전부 통과 | 양호 |
| JavaScript 문법 검사 | 전부 통과 | 양호 |
8. 잔존 위험 및 권고
| 등급 | 항목 | 설명 | 권고 |
|---|---|---|---|
| 중간 | 협업 삭제 엔드포인트 CORS | plugin/collab/collab_number_delete.php에 전역 CORS 유지 | same-origin 또는 allowlist로 축소 |
| 낮음 | IPv6 literal 호스트 처리 | 허용 도메인 함수가 IPv6 표현을 완전 처리하지 못함 | IPv6-aware 정규화 추가 |
| 낮음 | 포트 민감 Origin 비교 | https://example.com 과 https://example.com:8443를 엄격 구분 | 운영 가이드 또는 정규화 보완 |
| 낮음 | 수제 sanitizer 유지 | 개선되었으나 장기적으로 검증된 라이브러리 대체 여지 존재 | 중장기 로드맵 반영 |
9. 최종 판정
9.1.2-alpha1.0.1은 9.1.1 대비 보안성, 코드 완성도, 사용자 경험이 모두 의미 있게 향상된 버전이다. 특히 9.1.1의 핵심 결함으로 지적될 수 있었던 업로드 검증, 비디오 뷰어, 출력 경계, 파일 블럭 복원, 코드블럭 입력 안정성은 상당 부분 개선되었다. 다만 협업 보조 엔드포인트 CORS, IPv6 literal 처리, 일부 운영 설정 민감도는 잔존하므로 최종 판정은 '''조건부 적정'''으로 한다.
9.1 배포 의견
- 내부 시험 운영: 적정
- 알파 단계 외부 시험 배포: 적정
- 공개 서비스 확장 배포: 협업/CORS 및 운영 설정 보완 후 권고