Go 모듈, 안전하게 사용하는 방법은?
Go 언어의 모듈 시스템(Module System)은 코드의 무결성을 보장하지만, 코드 호스트(Code Host)의 취약점을 악용한 공격이 발생할 수 있음
Go Checksum Database를 통해 모듈 버전의 위변조를 감지하고, 안전한 소스 코드 사용을 지원함
직접 소스 코드를 다운로드하는 대신, go mod download 명령어를 사용하여 안전하게 소스 코드를 확인하는 방법 제시
pkg.geomys.dev와 같은 도구를 활용하여 코드 호스트의 취약점을 보완하고, 모듈 소스 코드(Module Source Code)를 안전하게 검증할 수 있는 환경 구축
Go 모듈 시스템의 보안 취약점
Go는 모듈 시스템(Module System)을 통해 패키지 무결성을 보장하지만, 코드 호스트(Code Host)의 취약점을 이용한 공격이 발생할 수 있다. 특히, GitHub와 같은 플랫폼에서 git tag 강제 푸시(Force-pushing git tags)를 통해 악성 코드를 삽입하는 공격이 가능하다. 이러한 공격은 Go 모듈 미러의 캐시를 악용하는 방식으로, 개발자가 의도하지 않은 악성 코드를 다운로드하게 만들 수 있다. 따라서, 코드 호스트의 소스 코드를 직접 신뢰하는 것은 위험하다.
Go Checksum Database를 활용한 무결성 검증
Go는 Checksum Database를 통해 모듈 버전의 무결성을 검증한다. 이 데이터베이스는 모듈 버전의 암호화 해시를 저장하고, 모든 Go 클라이언트에게 동일한 해시 값을 제공하여 위변조를 방지한다. 개발자는 go mod verify -tag 명령어를 사용하여 로컬 Git 저장소의 내용이 Checksum Database와 일치하는지 확인할 수 있다. 이는 모듈의 신뢰성을 확보하고, 공급망 공격(Supply Chain Attack)을 방어하는 데 중요한 역할을 한다.
안전한 소스 코드 확인 방법
직접 코드 호스트에서 소스 코드를 다운로드하는 대신, go mod download -json 명령어를 사용하여 안전하게 소스 코드를 확인할 수 있다. 이 명령어를 사용하면, Go 툴링이 사용하는 정확한 소스 코드를 다운로드하고, 반환된 `Dir` 경로를 통해 파일을 읽을 수 있다. 또한, pkg.geomys.dev와 같은 서비스를 활용하여 코드 호스트의 취약점을 보완하고, 안전하게 모듈 소스 코드를 검증할 수 있다.
pkg.geomys.dev를 활용한 소스 코드 검증
pkg.geomys.dev는 Go 모듈 소스 코드를 안전하게 검증할 수 있는 서비스이다. 이 서비스는 HTTP Range 요청(HTTP Range Requests)을 통해 모듈 버전의 zip 파일을 직접 가져와 브라우저에서 압축을 푼다. 또한, Google Modules Proxy의 CORS 설정이 수정되면, Geomys 백엔드 없이도 작동할 수 있다. 이 서비스는 투명성 로그(Transparency Log)를 통해 데이터베이스 운영자조차 위변조를 할 수 없도록 설계되어, 안전한 소스 코드 검증 환경을 제공한다.