
CVE-2026-33693: activitypub-federation-rust의 v4_is_invalid()에서 0.0.0.0 우회를 통한 SSRF (CVSS 6.5 중간)
v4_is_invalid()의 0.0.0.0 우회를 통한 SSRF (CVSS 6.5 Moderate)
키워드: SSRF, 0.0.0.0, IP 검증 우회, activitypub-federation, Lemmy, Rust, ActivityPub
activitypub-federation-rust 라이브러리(Lemmy 및 6개 이상의 하위 프로젝트에서 사용)에 v4_is_invalid() 함수의 불완전한 IP 주소 검증으로 인한 SSRF(Server-Side Request Forgery) 취약점이 존재합니다. 이 함수는 is_unspecified()를 호출하지 않으므로, 공격자가 대부분의 시스템에서 localhost로 매핑되는 0.0.0.0을 대상으로 하여 SSRF 보호 조치를 우회할 수 있습니다.
activitypub_federation (Rust/cargo)src/utils.rs의 v4_is_invalid() 함수는 내부 네트워크 접근을 차단하기 위해 IPv4 주소를 검증합니다. 루프백(127.0.0.0/8), 사설 대역(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), 링크-로컬(169.254.0.0/16), 브로드캐스트(255.255.255.255)를 검사하지만 미지정 주소 0.0.0.0은 검사하지 않습니다.
대부분의 시스템에서 0.0.0.0은 루프백 인터페이스로 확인되므로 127.0.0.1과 동일한 접근 권한을 부여합니다.
추가 발견 사항: DNS 리바인딩/TOCTOU 취약점도 존재합니다. lookup_host()가 호스트 이름을 확인하고 IP를 검증하지만, 별도의 reqwest 호출이 두 번째 DNS 확인을 수행하여, 공격자가 먼저 안전한 IP를 제공한 후 두 번째 확인에서 내부 IP로 리바인딩할 수 있습니다.
src/utils.rs)fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
// MISSING: || ip.is_unspecified() <- 0.0.0.0 not blocked
}
fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
|| ip.is_unspecified() // <- Now blocks 0.0.0.0
}
+---------------------------------------------------+
| SSRF via 0.0.0.0 Bypass |
+---------------------------------------------------+
| |
| 1. Attacker hosts ActivityPub object with |
| URL pointing to http://0.0.0.0:<port>/path |
| |
| 2. Lemmy instance fetches the object via |
| activitypub-federation-rust |
| |
| 3. v4_is_invalid() checks IP address: |
| x is_loopback() -> false (not 127.x) |
| x is_private() -> false (not RFC1918) |
| x is_link_local() -> false (not 169.254.x) |
| x is_broadcast() -> false (not 255.x) |
| x is_unspecified() -> NOT CHECKED |
| Result: 0.0.0.0 PASSES validation |
| |
| 4. Request sent to 0.0.0.0 -> resolves to |
| localhost -> accesses internal services |
| |
| 5. Internal service data returned to attacker |
| via ActivityPub federation response |
| |
+---------------------------------------------------+
하위 프로젝트 노출: activitypub-federation-rust 크레이트는 Fediverse 생태계의 6개 이상의 프로젝트에서 사용됩니다:
공격자는 다음을 수행할 수 있습니다:
activitypub-federation을 PR #162의 수정 사항이 포함된 버전으로 업그레이드하세요.이 저장소는 책임 있는 취약점 공개(responsible disclosure)의 일환으로 교육 및 방어 목적으로 게시됩니다. 이 취약점은 GitHub의 비공개 취약점 신고(PVRT) 프로세스를 통해 신고되었습니다. 운영 중인 시스템에 대한 어떠한 악용도 수행되지 않았으며, 모든 테스트는 격리된 환경에서 진행되었습니다.
이 프로젝트의 전체 라이트업, 방법론 및 관련 연구 자료는 다음에서 확인할 수 있습니다:
https://snailsploit.com/security-research/cves/cve-2026-33693/
작성자: Kai Aizen — 독립 공격 보안 연구원.
snailsploit.com · 연구 · 프레임워크 · GitHub · LinkedIn · ResearchGate · X/Twitter
같은 공격, 다른 기반.
| 프로젝트 | Stars | 설명 |
|---|
| Lemmy | 13.7K+ | Fediverse용 링크 애그리게이터 |
| hatsu | -- | ActivityPub 브리지 |
| gill | -- | 연합(federation)을 지원하는 Git 호스팅 |
| ties | -- | 소셜 네트워킹 |
| fediscus | -- | 연합 토론 |
| fediverse-axum | -- | ActivityPub 프레임워크 |
| 지표 | 값 |
|---|
| 공격 경로 | 네트워크 |
| 공격 복잡도 | 낮음 |
| 필요 권한 | 없음 |
| 사용자 상호작용 | 없음 |
| 범위 | 변경 없음 |
| 기밀성 | 낮음 |
| 무결성 | 낮음 |
| 가용성 | 없음 |
| CVSS 벡터 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| 점수 | 6.5 (Moderate) |
| 날짜 | 내용 |
|---|
| 2026-03-11 | GitHub PVRT를 통해 취약점 신고 |
| 2026-03-13 | 유지보수자가 발견 사항 확인 |
| 2026-03-13 | 수정 PR #162 제출 |
| 2026-03-13 | 보안 권고가 실수로 종료됨 |
| 2026-03-16 | 보안 권고 재개 |
| 2026-03-23 | CVE-2026-33693 배정 및 보안 권고 게시 |