Forgejo 16.0.4 및 15.0.8 버전에서 저장소 템플릿 취약점 수정

Forgejo 16.0.4 및 15.0.8 버전에서 저장소 템플릿 취약점 수정

Forgejo가 16.0.4와 15.0.8 버전을 출시하면서 저장소 템플릿 기능에 숨어 있던 치명적인 보안 문제를 수정했습니다.

문제가 되는 환경에서는 악의적으로 만들어진 템플릿 저장소가 Forgejo 서버의 파일을 읽거나 서버에서 임의의 프로세스를 실행하는 원격 코드 실행으로 이어질 수 있었습니다. Forgejo를 직접 구축(Self-Hosted) 해서 운영한다면 반드시 업데이트 해야 합니다.

저장소 템플릿이 공격 지점이 된 이유

Forgejo 저장소 템플릿 취약점
Forgejo 저장소 템플릿 취약점

Forgejo의 저장소 템플릿은 이미 준비된 파일과 설정을 바탕으로 새 저장소를 빠르게 만드는 기능입니다. 유저는 템플릿을 복사한 뒤 새 프로젝트에 맞게 이름이나 설명 같은 내용을 바꿀 수 있습니다.

여러 팀이 같은 기본 구조로 저장소를 시작할 때 유용하지만, 서버가 외부에서 가져온 파일을 처리하고 새 Git 저장소로 초기화한다는 점에서 일반적인 파일 복사보다 복잡한 경로를 거칩니다.

이번에 발견된 취약점은 바로 그 처리 순서에서 발생했습니다. Forgejo는 템플릿 저장소를 복제한 뒤 기존 .git 디렉터리를 제거하고, .forgejo/template에 지정된 파일을 대상으로 변수 확장을 수행합니다.

변수 확장은 파일 안의 치환 대상 값을 새 저장소의 이름이나 설명에 맞게 바꾸는 단계입니다. 문제는 이 과정에서 파일 내용이 새 .git디렉터리를 만들어 내도록 악용될 수 있었다는 데 있습니다.

삭제된 디렉터리가 다시 살아난 과정

Git 저장소의 생성 과정의 보안 취약점 공격
Git 저장소의 생성 과정의 보안 취약점 공격

Git은 작업 디렉터리 안의 .git을 해당 위치의 저장소 메타데이터로 인식합니다. 메타데이터에는 커밋과 브랜치, 원격 저장소 정보가 기록되므로 새 저장소를 초기화할 때 예상하지 못한 .git이 남아 있으면 처리 대상과 권한 경계가 달라질 수 있습니다.

Forgejo는 처음에 템플릿의 .git을 지웠지만, 변수 확장이 끝나기 전에 공격자가 새로운 .git디렉터리를 만들어 두면 이 방어를 우회할 수 있었습니다.

그 상태에서 새 Git 저장소 초기화가 진행되면, 악성 템플릿이 심어 둔 디렉터리를 Git이 채택할 수 있습니다.

결과적으로 서버가 의도하지 않은 경로를 읽고 명령을 실행할 수 있는 조건이 만들어집니다. 공격자가 저장소 생성 권한이나 템플릿 등록과 관련된 접근권을 확보했을 때 특히 위험한 유형이죠. 단순히 웹 화면에 이상한 파일을 올리는 문제와 달리, 서버 프로세스가 파일을 해석하는 절차 자체가 해커의 공격이 됩니다.

이번 수정은 어디에서 막았나

Forgejo 취약점 수정
Forgejo 취약점 수정

Forgejo는 변수 확장이 모두 끝난 다음 작업 디렉터리 안에 존재하는 .git 폴더를 다시 제거하도록 수정했습니다. 즉, 처음 복제 직후 한 번만 정리하는 방식에서 벗어나, 공격자가 중간 단계에서 만든 디렉터리까지 확인한 뒤 Git 저장소를 초기화합니다. 이 순서 변경은 템플릿 파일의 정상적인 변수 치환 기능은 유지하면서, 초기화 시점에 남아 있는 Git 메타데이터를 신뢰하지 않도록 하는 조치입니다.

수정 버전은 16.0.4와 15.0.8입니다. 두 버전은 서로 다른 유지보수 계열을 사용하는 운영자를 위해 제공됩니다. 따라서 구형 계열을 사용한다는 이유로 다음 큰 버전까지 기다릴 필요는 없습니다. 현재 설치된 계열에 맞는 최신 보안 수정판으로 올리는 것이 현실적인 대응입니다.

원문 뉴스 : LWN.net

🐧 Linuxroom의 생각 :

Forgejo(포지오)는 직접 서버에 설치해서 사용하는 오픈소스 Git 호스팅 소프트웨어입니다. 쉽게 말해 GitHub나 GitLab같은 서비스를 내 서버에 직접 구축 가능하게 해주는 프로젝트죠.

Forgejo 공식 홈페이지에 게시된 이미지 (출처 : Forgejo)
Forgejo 공식 홈페이지에 게시된 이미지 (출처 : Forgejo)

Forgejo는 에스페란토어로 '대장간'을 뜻하는 단어에서 유래한 이름입니다. 기존의 오픈소스 프로젝트였던 Gitea(기티)에서 갈라져 나온(Fork) 프로젝트예요.

이 프로젝트에서 무슨일이 일어났었냐면, 보통 문서를 작성할때, 템플릿을 만들어 두고 가져다 쓰는 경우가 많은데요. Forgejo에서도 저장소 템플릿 이라는 편리한 기능이 존재합니다.

쉽게 말하면, 붕어빵 틀처럼 새 프로젝트를 만들 때 미리 준비된 틀을 복사해 와서 프로젝트의 이름이나 설명만 자동으로 딱 맞게 바꿔주는 기능이죠.

이번 취약점은 서버가 템플릿을 복사해서 새 틀로 만드는 작업 순서의 빈틈을 노렸습니다. 원래대로라면, 서버가 템플릿을 가져오고 기존 정보(.git 폴더)를 삭제하고 글자(프로젝트 이름이나 설명등)를 바꾸면 새 프로젝트가 완성되는 형태였는데요.

공격자는 글자를 바꾸는 단 사이에 몰래 가짜 정보 (.git 폴더)를 새로 만들어 넣도록 템플릿을 교묘하게 조작하는 방식으로 공격을 시도합니다.

결과적으로, 서버는 공격자가 만들어 둔 가짜 정보 폴더를 진짜 정보 폴더인줄 알고 읽어버려, 이를 통해 서버 안의 파일을 몰래 읽거나 서버에 악성 코드 등을 실행할 수 있게 된 것이죠.

이번 버전 업데이트의 취약점 해결 방법은 간단히 말하면

작업을 다 끝내고 마지막에 한번 더 확인해서 싹 지우자.

라는 형태로 작업 순서를 바꾸어서, 글자 바꾸기 작업이 전부 끝난 뒤에, 공격자가 중간에 몰래 만들어 둔 가짜 .git 폴더까지 최종 단계에서 한번 더 지워버린 후에 새 프로젝트를 제작하도록 변경했습니다.

만약에 Forgejo 서버를 직접 운영중이시라면, 지금 바로 최신 업데이트를 적용하시고, 보안 사고를 사전에 예방하시기 바랍니다 😄


※ 각주

[1] Forgejo: Git 저장소를 웹에서 호스팅하고 협업 기능을 제공하는 오픈소스 소프트웨어입니다.

[2] 저장소 템플릿: 미리 준비한 파일 구조와 설정으로 새 Git 저장소를 만드는 기능입니다.

[3] 원격 코드 실행: 공격자가 네트워크를 통해 서버에서 임의의 명령이나 프로그램을 실행하는 취약점입니다.

[4] Git 메타데이터: 커밋, 브랜치, 원격 저장소 정보처럼 Git이 작업을 관리하기 위해 저장하는 내부 정보입니다.

[5] 변수 확장: 파일 속의 특정 표식을 실제 저장소 이름이나 설명 같은 값으로 치환하는 처리입니다.

[6] .git 디렉터리: Git이 해당 폴더를 저장소로 인식하게 만드는 특별한 디렉터리입니다.

[7] 유지보수 계열: 같은 주 버전 안에서 보안 수정과 버그 수정을 계속 제공하는 버전 묶음입니다.