피드로 돌아가기
Dev.toSecurity
원문 읽기
GHSA-5VP3-3CG6-2RQ3: GHSA-5VP3-3CG6-2RQ3: Cross-Site Scripting via Markdown Serialization Breakout in justhtml
justhtml 라이브러리가 Markdown 직렬화 시 backtick fence 길이 동적 계산 미지원으로 XSS 취약점 발생
AI 요약
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 공격 벡터를 효과적으로 차단할 수 있다.