
Gitea의 hostmatcher 허용 목록에서 인증된 SSRF를 시연하는 개념 증명 랩으로, http://0.0.0.1로의 웹훅이 127.0.0.1로는 도달할 수 없는 루프백 서비스에 도달한다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-hostmatcher-0000-ssrf
Gitea 1.27.3 - Gitea
CVE-2026-22874에서 reservedIPNets를 추가했습니다. CGNAT, TEST-NET, NAT64, Teredo, Azure WireServer. 실제 대역입니다. RFC 6890의 0.0.0.0/8, 예전 "this network" 블록이 아닙니다. IANA는 여전히 이를 공개하고 있습니다. Go의 IsGlobalUnicast는 0.0.0.1에 대해 true입니다. IsLoopback(127.0.0.0/8)이 아닙니다. IsPrivate도 아닙니다. 기본 외부 허용 목록은 이를 공용 인터넷으로 취급합니다. Linux는 해당 주소가 lo에 있으면 0.0.0.1을 로컬 소켓으로 전달합니다. 동일한 리스너, 두 개의 이름.
로그인한 사용자는 http://0.0.0.1로 웹훅을 보내고 훅 기록에서 HTTP 본문을 읽을 수 있습니다. 같은 포트의 127.0.0.1은 거부됩니다.
| ID | 아직 CVE 없음 |
| CWE | CWE-918 |
| CVSS | High: 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N |
| 제품 | Gitea |
| 영향 | v1.27.3(146cc3e)까지; CVE-2026-22874의 잔여물 |
| 인증 | 저장소 웹훅을 생성할 수 있는 로그인 사용자 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
가입하고(기본 개방 가입), 저장소를 만들고, 웹훅을 http://0.0.0.1:<local-port>/로 지정하고, 테스트한 뒤 훅 기록에서 응답 본문을 읽습니다. 이는 같은 포트의 127.0.0.1로는 도달할 수 없는 루프백 HTTP입니다. Gitea의 netns에서 수신 대기 중인 것 중 루프백보다 넓게 바인딩된 모든 것, 즉 운영자가 127.0.0.0/8을 차단했기 때문에 "로컬호스트 전용"이라고 생각했던 서비스를 포함합니다.
X-Gitea-Internal-Auth를 설정하지 않습니다. 그 자체로 RCE는 아닙니다. 허용 목록이 여전히 외부라고 부르는 주소에서 온 완전한 HTTP 본문입니다.
v1.27.3은 2026 GHSA 물결을 닫은 빌드입니다. 그래도 저는 그 태그를 계속 지켜봤습니다. 허용 목록이나 차단 목록을 추가하는 패치는 선물입니다. 목록을 읽고, IANA에 아직 남아 있는데 목록이 잊은 것이 무엇인지 묻습니다. 이미 두 개의 잔여물이 이 트리에 랩을 가지고 있었습니다(keys IDOR와 git-redirect SSRF). 그 게시물의 잔여물 표에는 http://0.0.0.1/로의 웹훅이 지도로 나열되어 있었습니다. 이것이 SUCCESS입니다.
웹훅 전달은 HTTP 본문을 훅 기록에 저장합니다. 이는 대부분 "fetch가 작동했는가"에 불과한 git clone보다 더 나은 오라클입니다. Gitea의 netns에 포트 8080으로 오라클을 두고, NET_ADMIN으로 lo에 0.0.0.1/8을 추가하고, 두 개의 웹훅을 만들었습니다. 먼저 네거티브 컨트롤.
이미 기록된 잘못된 방향: 웹훅 생성 HTTP 201을 오라클로 취급(오라클은 기록); 127.0.0.1 전달 성공(그것은 다른 버그일 것 - 랩은 거부를 요구); X-Gitea-Internal-Auth로 /api/internal 접근; 리버스 셸. 연극. 증인은 훅 기록의 GITEA-0000-SSRF입니다.
cd lab
./run.sh
대상은 오직 http://127.0.0.1:18131. 오라클은 포트 8080에서 Gitea의 netns를 공유합니다. run.sh는 lo에 0.0.0.1/8을 추가합니다.
create-hook name=neg-loopback status=201
negative-control 127.0.0.1 blocked
create-hook name=hit-0000 status=201
poll id=2 witness=True
SUCCESS GITEA-HOSTMATCHER-0000
reservedIPNets에 0.0.0.0/8을 추가하거나, IsGlobalUnicast를 "다이얼해도 안전"으로 취급하는 것을 중단하십시오. 0.0.0.1은 127.0.0.1과 같은 방식으로 거부되어야 합니다.
GNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.