SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

Gitea Org-mode 렌더러 사전 인증 임의 파일 읽기 취약점 (CVE-2026-59774)

EQST Now | 2026.08.05

NOW Briefing

Brief 1 자체 호스팅 Git 서버 Gitea의 마크업 미리보기 기능에서 사전 인증 임의 파일 읽기 취약점(CVE-2026-59774)이 공개됐습니다. 문서 서식인 Org-mode의 파일 포함 지시자가 서버의 실제 파일 경로를 그대로 읽어 오는 문제로, 1.22.1부터 1.27.0까지가 영향을 받습니다.
Brief 2 인터넷에 노출된 인스턴스에 공개 저장소가 하나만 있으면 로그인 없이 Gitea 서비스 계정 권한으로 읽을 수 있는 파일이 외부로 노출됩니다. 설정 파일의 내부 토큰이 유출되면 Git 훅 주입을 거쳐 원격 코드 실행(RCE)까지 확대될 수 있습니다.
Brief 3 1.27.1 이상으로 즉시 업그레이드하고, 설정 파일에 담긴 내부 토큰·OAuth 비밀값·JWT 키·데이터베이스 자격증명을 노출된 것으로 간주해 재발급해야 합니다.

Gitea Org-mode 렌더러 사전 인증 임의 파일 읽기 취약점 (CVE-2026-59774)

■ 개요

Gitea는 조직 내부나 폐쇄망에 직접 설치해 쓰는 경량 Git 저장소 서버입니다. 이번 취약점은 저장소 화면에서 마크업 문서를 미리 보여 주는 렌더링 기능에 있습니다. 이 요청 경로는 저장소 할당과 읽기 권한만 검사하므로, 코드 단위가 활성화된 공개 저장소를 대상으로 하면 익명 사용자도 그대로 통과합니다. 영향 범위는 Gitea 1.22.1부터 1.27.0까지이며 1.27.1에서 수정됐습니다.

공격자는 저장소에 파일을 커밋하거나 쓰기 권한을 얻을 필요가 없습니다. 렌더링 요청에 Org-mode 문서 내용과 .org 파일명을 실어 보내면, 문서에 다른 파일을 끼워 넣는 지시자가 서버 파일 시스템의 절대 경로를 검증 없이 읽어 응답으로 돌려줍니다. 읽히는 범위는 Gitea 프로세스 계정이 접근 가능한 모든 파일이며, 여기에는 내부 토큰과 각종 비밀값이 들어 있는 설정 파일 app.ini가 포함됩니다.

인터넷에 노출된 Gitea 인스턴스이면서 공개 저장소를 하나라도 운영 중이라면 전제 조건이 이미 충족된 상태입니다. 같은 1.27.1 릴리스에서는 저장소 쓰기 권한자가 diffpatch API로 Git 훅을 설치할 수 있는 별개 취약점(CVE-2026-60004)도 함께 수정됐으므로, 두 건을 한 번에 해소하려면 부분 패치가 아니라 릴리스 단위 업그레이드가 필요합니다. 현재까지 공개된 어드바이저리와 보도에서 실제 공격에 악용된 사례는 확인되지 않았습니다.

■ 요약

항목 내용
CVE ID CVE-2026-59774(GHSA-6v53-hr58-556r)
CVSS 점수 CVSS v3.1 9.8 / Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) — GitHub 어드바이저리 산정, NVD 미게시
취약점 유형 CWE-22, 사전 인증 임의 파일 읽기(경로 탐색)
영향/위험 • 인증 없이 서버 파일 열람 가능
• 설정 파일의 내부 토큰·OAuth 비밀값·JWT 키·데이터베이스 자격증명 노출
• 내부 토큰 확보 시 Git 훅 주입으로 원격 코드 실행까지 확대 가능
• 공개 저장소 1개만 있으면 전제 조건 충족됨
취약 버전 Gitea 1.22.1 ~ 1.27.0
패치 버전 Gitea 1.27.1 이상

■ 기술 분석

근본 원인은 Gitea가 Org-mode 렌더링에 사용하는 외부 라이브러리 go-org를 기본 설정 그대로 초기화한 데 있습니다. go-org 설정 구조체에는 #+INCLUDE 지시자가 가리키는 파일을 읽어 오는 콜백 ReadFile 항목이 있고, 기본값은 경로 제한 없이 파일을 그대로 읽는 표준 함수(ioutil.ReadFile)입니다. Gitea는 이 콜백을 교체하지 않았기 때문에, 렌더링 대상 문서에 적힌 절대 경로가 검증 없이 파일 읽기로 이어졌습니다.

패치는 취약 함수인 마크업 렌더러(modules/markup/orgmode/orgmode.goRender)에서 파서를 만들 때 ReadFile 콜백을 직접 지정하는 방식으로 처리했습니다. 교체된 콜백은 파일을 읽지 않고 요청된 경로를 그대로 담은 문자열을 돌려주므로, #+INCLUDE는 파일 내용 대신 평문 텍스트로만 표시됩니다.

/* [패치 전] */
res, err := org.New().Silent().Parse(input, "").Write(w)

/* [패치 후] */
cfg := org.New()
cfg.ReadFile = func(path string) ([]byte, error) {
    content := fmt.Sprintf("#+INCLUDE: [[%s]]", path)
    return []byte(content), nil
}
doc := cfg.Silent().Parse(input, "")
res, err := doc.Write(w)

인용 가능한 공개 익스플로잇 코드는 확인되지 않았고, 어드바이저리에도 재현 절차나 PoC 코드는 포함돼 있지 않습니다. 다만 수정 커밋과 신규 테스트가 공개돼 있어 취약 지점과 트리거 조건을 파악하는 난이도는 낮은 편입니다.

■ 토큰 유출에서 코드 실행까지

이 취약점의 실질적 위험은 읽히는 파일의 성격에서 나옵니다. Gitea 설정 파일에는 내부 통신 인증에 쓰이는 INTERNAL_TOKEN을 비롯해 OAuth 비밀값, JWT 키, 데이터베이스 접속 정보가 함께 들어 있어, 파일 하나가 노출되면 인스턴스 전체의 신뢰 기반이 흔들립니다.

어드바이저리 기준으로, 공격자가 app.ini에서 내부 토큰을 확보하면 내부 로거로 저장소에 Git 훅(저장소 이벤트가 발생할 때 서버에서 실행되는 스크립트)을 심을 수 있습니다. 이후 익명 사용자가 해당 저장소를 클론하는 시점에 Gitea OS 계정 권한으로 명령이 실행되는 경로가 제시됐습니다. 파일 읽기 취약점 하나가 서버 장악으로 이어질 수 있는 구조이며, CVSS 무결성·가용성 영향이 모두 High로 산정된 근거이기도 합니다.

⚠️ WARN

취약 버전을 외부에 노출해 운영했다면, 명시적인 침해 흔적이 없더라도 설정 파일의 비밀값은 유출된 것으로 간주하고 대응해야 합니다.
파일 읽기는 요청 한 번으로 끝나므로 별도의 지속성 흔적을 남기지 않습니다.

■ 탐지 및 점검

• 운영 중인 인스턴스 버전을 확인해 1.22.1 이상 1.27.0 이하 구간에 해당하는지 점검합니다.

• 웹 접근 로그에서 POST /{owner}/{repo}/markup 요청을 추출하고, 미인증 세션에서 발생한 요청이나 짧은 간격의 반복 요청이 있는지 확인합니다.

• 요청 본문이 기록되는 프록시·WAF 로그가 있다면 #+INCLUDE 문자열과 .org 파일명이 포함된 마크업 요청을 검색합니다.

• 인터넷에 노출된 인스턴스에서 공개 저장소가 운영 중인지 확인해 공격 전제 조건 충족 여부를 판단합니다.

• 침해가 의심되면 각 저장소에 등록되지 않은 Git 훅 스크립트가 존재하는지 점검합니다.

✅ CHECK

마크업 렌더링 요청은 정상 사용자도 발생시키므로, 요청 존재 자체가 아니라 인증 상태와 요청 본문 내용으로 구분해야 합니다.

■ 대응 방안

• Gitea 1.27.1 이상으로 업그레이드합니다. 같은 릴리스에 포함된 CVE-2026-60004 수정도 함께 적용됩니다.

• 즉시 업그레이드가 어렵다면 공개 저장소 노출과 인스턴스의 외부 접근 경로를 임시로 제한합니다. 어드바이저리에 공식 임시 대응책은 없으므로 이는 노출 축소 목적의 조치입니다.

• 설정 파일에 저장된 내부 토큰, OAuth 비밀값, JWT 키, 데이터베이스 자격증명을 모두 재발급합니다.

• 재발급 이후 기존 토큰으로 발급된 세션과 연동 애플리케이션이 정상적으로 갱신됐는지 확인합니다.

💡 TIP

자격증명 재발급은 업그레이드 이후에 해야 합니다. 취약 버전에서 먼저 교체하면 새 비밀값이 같은 경로로 다시 읽힐 수 있습니다.

[참고 자료]

GHSA-6v53-hr58-556r — Gitea Security Advisory

Gitea PR #38642 — fix: orgmode render include path

Gitea 1.27.1 릴리스 노트

go-org — Configuration.ReadFile 기본값

Critical Gitea Flaw Lets Unauthenticated Attackers Read Server Files and Execute Code

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.