
Gitea restore-repo file:// 로컬 파일 포함(CWE-73) 취약점에 대한 개념 증명으로, 신뢰할 수 없는 덤프 외부의 심볼릭 링크 대상을 릴리스 첨부 파일로 복사합니다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-restore-file-open
Gitea 1.27.3 - Gitea
CVE-2026-59765는 OpenWithClient에 hostmatcher HTTP 클라이언트를 배치했습니다. file:// 분기는 해당 클라이언트를 무시하고 os.Open을 호출합니다. 덤프 복원에는 DownloadFunc가 없습니다. 그런 다음 gitea_uploader.go가 재작성된 file:// URL을 엽니다. os.Open은 덤프 측 심볼릭 링크를 따라갑니다. 조인은 덤프 아래에 머무릅니다. 심볼릭 링크는 그렇지 않습니다.
신뢰할 수 없는 덤프를 운영자가 복원하면 심볼릭 링크 대상이 릴리스 첨부 파일로 복사됩니다. Gitea uid로서 이는 서비스 계정이 읽을 수 있는 모든 파일입니다.
| ID | 아직 CVE 없음 |
| CWE | CWE-73 |
| CVSS | Medium: 4.2 CVSS:3.1/AV:L/AC:L/PR:H/UI:R/S:U/C:H/I:N/A:N |
| 제품 | Gitea |
| 영향받는 버전 | v1.27.3 (146cc3e)까지; 로컬 운영자 gitea restore-repo |
| 인증 | 신뢰할 수 없는 덤프의 로컬 운영자 복원 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
관리자에게 조인된 덤프 하위 경로 아래에 심볼릭 링크를 포함하는 신뢰할 수 없는 덤프("백업" 디렉터리, 신뢰할 수 없는 원격에서의 복원)를 건네주세요. 복원은 대상 파일을 복원된 저장소의 릴리스 첨부 파일로 복사합니다. 해당 저장소를 읽을 수 있는 사람은 누구나 이를 다운로드할 수 있습니다.
덤프 작성자가 app.ini의 이름을 지정하면 이는 자격 증명 탈취입니다(INTERNAL_TOKEN, SECRET_KEY, JWT, DB 비밀번호). 랩 오라클은 심어둔 증인 파일이었으며 app.ini가 아닙니다. 이는 OS LPE가 아닙니다. 인증되지 않은 것도 아닙니다. 덤프 루트 조인 탈출도 아닙니다. GitHub/GitLab/Gitea에서의 라이브 마이그레이션은 DownloadFunc를 설정하며 공격자의 file://을 os.Open하지 않습니다.
두 개의 복원 맵이 남은 테이블 위에 있었습니다. 나는 먼저 명백한 것을 랩에서 테스트했습니다.
발견 8은 덤프 루트 조인 탈출이었습니다: release.yml에 절대 DownloadURL을 넣고, FilePathJoinAbs가 순진한 filepath.Join(base, "/etc/passwd")처럼 덤프 접두사를 떨어뜨리기를 바라는 것입니다. 1.27.3에서는 그렇지 않습니다. 각 sub는 filepath.Clean("/"+s)이고 그 다음 filepath.Join(base, cleaned)입니다. /tmp/dump + /tmp/GITEA-JOIN-OUTSIDE의 복제 조인은 /tmp/dump/tmp/GITEA-JOIN-OUTSIDE로 유지되었습니다. 복원은 덤프 아래의 file://을 재작성하고 open ...: no such file or directory로 실패했습니다. 이 태그에서는 조인 탈출이 아닙니다.
발견 9가 성공한 것입니다. 나는 덤프 외부에 증인 파일을 심고, 조인된 덤프 하위 경로에 심볼릭 링크를 두고, gitea restore-repo를 실행했습니다. 복원 rc=0. 복원된 릴리스 첨부 파일에 GITEA-FILE-OPEN-WITNESS가 포함되었습니다.
이미 기록된 잘못된 방향: 절대 DownloadURL을 통한 덤프 루트 조인 탈출; 라이브 마이그레이션 file:// LFI; X-Gitea-Internal-Auth(복원은 /api/internal이 아닌 Gitea uid로서의 CLI입니다); 복원 HTTP를 원격 비인증으로 취급(CVSS는 로컬, 높은 권한, 사용자 상호작용); 리버스 셸. 연극입니다.
cd lab
./run.sh
오직 http://127.0.0.1:18137만 대상으로 합니다. Compose는 lab/dump를 읽기 전용으로 마운트합니다. run.sh는 컨테이너 내부에 증인을 심고, 덤프를 빌드하고, 심볼릭 링크를 배치한 다음, gitea restore-repo를 실행합니다.
restore-rc=0 Restore repo labadmin/restored successfully
download status=200 snippet=GITEA-FILE-OPEN-WITNESS
SUCCESS GITEA-RESTORE-FILE-OPEN
OpenWithClient에서 file://을 제거하거나, 덤프 심볼릭 링크를 따르기를 거부하고, 신뢰할 수 없는 덤프를 복원하지 마세요. 복원된 첨부 파일에는 덤프 외부 증인이 포함되어서는 안 됩니다.
uri.go · gitea_uploader.go · FilePathJoinAbsGNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 랩 전용. 보증 없음.