
CVE-2026-27621 - TypiCMS Core에 SVG 파일 업로드를 통한 저장형 교차 사이트 스크립팅(XSS) 취약점 존재
| 필드 | 세부 정보 |
|---|
| CVE ID | CVE-2026-27621 |
| 심각도 | 중간 |
| 권고문 | 권고문 보기 |
| 발견자 | Lukasz Rybak |
TypiCMS의 파일 업로드 모듈에 저장형 크로스 사이트 스크립팅(XSS) 취약점이 존재합니다. 이 애플리케이션은 파일 업로드 권한이 있는 사용자가 SVG 파일을 업로드할 수 있도록 허용합니다. MIME 유형 검증은 수행되지만 SVG 파일의 콘텐츠는 정화되지 않습니다. 공격자는 악성 JavaScript 코드가 포함된 특수하게 제작된 SVG 파일을 업로드할 수 있습니다. 다른 사용자(예: 관리자)가 애플리케이션을 통해 이 파일을 보거나 접근하면 스크립트가 해당 사용자의 브라우저에서 실행되어 세션이 손상됩니다.
이 문제는 SVG 파싱 로직의 버그로 인해 더욱 악화되는데, 업로드된 SVG에 viewBox 속성이 없으면 500 오류가 발생할 수 있습니다. 그러나 공격자는 악성 페이로드에 유효한 viewBox 속성을 쉽게 포함할 수 있으므로 이는 XSS 취약점을 완화하지 못합니다.
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php 및 TypiCMS\Modules\Core\Services\FileUploader.php이 취약점은 두 가지 주요 지점에서 비롯됩니다:
FileFormRequest는 업로드 허용 MIME 유형으로 svg를 명시적으로 허용 목록에 포함합니다.FileUploader 서비스는 <script> 태그나 on* 이벤트 핸들러와 같은 잠재적으로 악성인 요소를 제거하기 위해 콘텐츠를 파싱하고 정화하지 않은 채 SVG 파일을 서버에 저장합니다.기본 파일시스템 디스크가 public으로 설정된 경우, 업로드된 SVG 파일은 공개적으로 접근 가능한 디렉터리에 저장되므로 직접 URL로 파일에 접근하여 XSS 페이로드를 트리거하는 것이 매우 쉬워집니다.
악성 SVG 파일 생성:
malicious.svg라는 이름의 파일을 다음 내용으로 생성합니다. viewBox 속성은 애플리케이션의 파싱 버그를 우회하기 위해 포함되었습니다.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<script>
// A simple PoC to demonstrate the vulnerability
alert('XSS in TypiCMS! Your session cookie is: ' + document.cookie);
</script>
<text x="10" y="50">If you see this, the script has run.</text>
</svg>
악성 파일 업로드:
/admin/files)로 이동합니다.malicious.svg 파일을 업로드합니다. 애플리케이션은 파일을 수락하고 저장합니다.
http://<your-site>/storage/files/malicious.svg 형식입니다.이 취약점을 성공적으로 악용하면 공격자는 피해자 브라우저의 컨텍스트에서 임의의 JavaScript를 실행할 수 있습니다. 세션 쿠키에 HttpOnly 플래그를 사용하면 document.cookie를 통한 세션 ID 직접 도난은 방지할 수 있지만, 공격자는 피해자를 대신하여 작업을 수행함으로써 피해자 계정을 완전히 장악할 수 있습니다.
영향은 다음과 같습니다:
동작 위조를 통한 계정 탈취: 공격자의 스크립트는 피해자의 브라우저에서 애플리케이션의 API로 인증된 요청을 보낼 수 있습니다. 이를 통해 공격자는 피해자에게 허용된 모든 작업을 수행할 수 있습니다. 예를 들어:
민감한 정보 노출: 스크립트는 피해자가 관리자 패널 내에서 보는 모든 페이지의 콘텐츠를 읽을 수 있습니다. 여기에는 사용자 목록(이름 및 이메일 포함), 비공개 애플리케이션 설정 및 기타 민감한 데이터가 포함되며, 이후 공격자가 제어하는 서버로 유출될 수 있습니다.
피싱 및 사회공학: 스크립트는 관리자 패널의 UI를 조작하여 가짜 로그인 양식을 표시해 사용자가 자격 증명을 다시 입력하도록 속이거나, 사용자를 악성 웹사이트로 리디렉션할 수 있습니다.
키로깅: 스크립트는 피해자가 손상된 페이지의 양식에 입력하는 모든 정보를 캡처할 수 있습니다.
공격자는 인증된 관리자로서 모든 작업을 수행할 수 있으므로, 이 취약점은 세션 쿠키에 직접 접근하지 않더라도 사실상 전체 애플리케이션 장악으로 이어집니다. 위험도는 높음입니다.
이 취약점을 완화하기 위해 심층 방어(defense-in-depth) 방식을 적용할 것을 권장합니다.
1차 수정: SVG 콘텐츠 정화:
가장 강력한 해결책은 업로드 시 SVG 파일을 정화하는 것입니다. 파일을 저장하기 전에 <script>, <style>, <foreignObject> 태그 및 모든 on* 이벤트 속성을 포함한 모든 잠재적으로 위험한 요소를 제거하기 위해 파싱해야 합니다. 이는 전용 SVG 정화 라이브러리를 사용하여 수행할 수 있습니다.
2차 수정: SVG 업로드 비활성화:
SVG 업로드가 애플리케이션의 핵심 기능이 아닌 경우, 가장 간단하고 안전한 해결책은 SVG 업로드를 완전히 비활성화하는 것입니다. 이는 TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php의 허용 MIME 유형 목록에서 'svg'를 제거하여 수행할 수 있습니다.
// In FileFormRequest.php
// BEFORE:
$fileRule = 'mimes:jpeg,gif,png,...,svg,...|max:...';
// AFTER:
$fileRule = 'mimes:jpeg,gif,png,...,pdf,...|max:...'; // Removed 'svg'
강화 - 콘텐츠 보안 정책(CSP): 애플리케이션에 엄격한 콘텐츠 보안 정책(CSP) 헤더를 구현합니다. 제대로 구성된 CSP는 인라인 스크립트 실행을 차단하여 이 XSS 취약점의 영향을 완화할 수 있습니다.
강화 - 사용자 콘텐츠를 별도의 도메인에서 제공: 모든 사용자 업로드 파일을 쿠키가 없는 별도의 도메인에서 제공합니다. 이는 사용자 생성 콘텐츠를 기본 애플리케이션에서 격리하는 매우 효과적인 보안 조치로, 스크립트가 세션 쿠키에 접근하거나 애플리케이션의 DOM과 상호작용하는 것을 방지합니다.
이 CVE는 조정된 취약점 공개(coordinated vulnerability disclosure) 관행에 따라 책임 있게 공개되었습니다. 여기에 제공된 정보는 교육 및 방어 목적으로만 사용됩니다.