피드로 돌아가기
GHSA-5VP3-3CG6-2RQ3: GHSA-5VP3-3CG6-2RQ3: Cross-Site Scripting via Markdown Serialization Breakout in justhtml
Dev.toDev.to
Security

GHSA-5VP3-3CG6-2RQ3: GHSA-5VP3-3CG6-2RQ3: Cross-Site Scripting via Markdown Serialization Breakout in justhtml

justhtml 라이브러리가 Markdown 직렬화 시 backtick fence 길이 동적 계산 미지원으로 XSS 취약점 발생

CVE Reports2026년 3월 24일5intermediate

Context

justhtml 1.13.0 미만 버전에서 HTML의 <pre> 요소를 Markdown으로 직렬화할 때 backtick fence 길이를 고정 처리했다. 이로 인해 <pre> 내부의 backtick 문자가 Markdown 코드 블록의 종료 마커로 인식되어 코드 블록 탈출이 가능해졌다. 이 탈출을 통해 공격자는 GFM이나 CommonMark 같은 다운스트림 Markdown 렌더러에서 임의의 JavaScript 실행이 가능했다.

Technical Solution

  • backtick fence 길이를 동적으로 계산: <pre> 태그 내 backtick 개수를 감지하여 그보다 긴 fence(예: 5개 이상)를 자동 생성
  • Markdown 코드 블록 탈출 방지: 직렬화된 Markdown이 다운스트림 파서에서 올바른 코드 블록으로 해석되도록 보장
  • 버전 1.13.0 이상으로 업그레이드: 고정된 backtick fence 처리를 동적 계산 방식으로 교체

Impact

CVSS v3.1 스코어 7.5(High)의 XSS 취약점 제거

Key Takeaway

Markdown 직렬화 시 메타 문자(backtick 등)의 개수를 사전에 검사하고 동적으로 이스케이프 처리해야 하며, HTML-to-Markdown 변환 라이브러리는 다운스트림 파서의 문법 규칙까지 고려한 설계가 필수다.


HTML 콘텐츠를 Markdown으로 변환하는 Python 애플리케이션에서 justhtml을 사용 중이라면 즉시 버전 1.13.0 이상으로 업그레이드하고, 추가적으로 다운스트림 Markdown 파서에서 raw HTML 렌더링을 명시적으로 비활성화하며, 콘텐츠 보안 정책(CSP)으로 인라인 JavaScript 실행을 제한하면 XSS 공격 벡터를 효과적으로 차단할 수 있다.

원문 읽기
GHSA-5VP3-3CG6-2RQ3: GHSA-5VP3-3CG6-2RQ3: Cross-Site Scripting via Markdown Serialization Breakout in justhtml | Devpick