- 단순한 오타인 ghcr.io와 ghrc.io 혼동이 심각한 보안 위협을 야기함
- ghrc.io는 첫눈에는 기본 nginx 서버처럼 보이지만, 내부적으로는 OCI API를 모방하는 행위가 포착됨
- 이 사이트는 www-authenticate 헤더를 통해 컨테이너 클라이언트로 하여금 민감한 인증 정보를 보내도록 유도함
- docker login 등 실수로 인증 정보를 입력하거나 잘못된 레지스트리로 사용하는 경우 자격 증명 유출이 발생할 수 있음
- 잘못된 서버에 로그인했다면 비밀번호 변경, PAT 폐기, GitHub 계정 이상 활동 점검이 필요함
개요
단순한 오타로 인해 자주 발생할 수 있는 ghcr.io와 ghrc.io의 혼동이 매우 위험한 보안 문제를 야기하는 사례임. 많은 개발자와 팀이 사용하는 GitHub Container Registry(ghcr.io) 의 오타 버전인 ghrc.io에서 자격 증명 탈취 시도가 포착되었음.
ghcr.io란 무엇인가
- ghcr.io는 컨테이너 이미지 및 OCI 아티팩트를 위한 OCI 호환 레지스트리임
- GitHub의 일부로, 수많은 오픈소스 프로젝트에서 인기 있는 레지스트리로 쓰임
ghrc.io: 표면상 보이는 모습
- ghrc.io에 접속하면 단순한 nginx 기본 화면이 보임
- 대표적인 404 오류 등 기본 동작은 일반 nginx 서버와 동일함
악의적인 행위의 정체
- 핵심 문제는
/v2/프리픽스 하위 OCI API 호출 시에 나타남 - 이 경로로 접근할 경우,
www-authenticate헤더와 401 응답으로 공식 컨테이너 레지스트리와 매우 유사한 동작을 보임 www-authenticate: Bearer realm="https://ghrc.io/token"헤더가 존재함- 이 헤더 때문에 Docker, containerd, podman, Kubernetes 등의 클라이언트가 사용자 인증 정보를
https://ghrc.io/token으로 자동 전달 시도함 - nginx 기본 설정에는 해당 헤더가 없으므로, 명백히 의도적으로 구성된 것임
위험성: 자격 증명 탈취 시나리오
- 이 패턴은 타이포스쿼팅(typo-squatting) 기반 자격 증명 탈취 공격으로 판단됨
- 위험은 사용자 클라이언트가 ghrc.io에 저장된 자격 증명을 입력 또는 저장한 경우에만 발생함
- 실제 자격 증명이 노출될 수 있는 상황 예시
docker login ghrc.io를 실행하는 경우- GitHub Action 내에서
docker/login-action사용 시, 레지스트리를 ghrc.io로 지정한 경우 - Kubernetes 시크릿에 ghrc.io용 레지스트리 자격 증명을 저장 후 이미지 풀링을 시도한 경우
- 단순하게 ghrc.io에 이미지를 push/pull만 시도하면 인증 정보는 노출되지 않음(익명 토큰 시도 후 오류 반환)
대응 방안
- ghrc.io로 실수로 로그인한 적이 있다면, 즉시 비밀번호 변경 및 사용한 PAT(퍼스널 액세스 토큰) 을 폐기해야 함
- GitHub 계정에서 이상 로그인 또는 악성 활동을 반드시 점검해야 함
- 공격자는 이를 이용하여 ghcr.io의 저장소에 악성 이미지 추가 또는 계정 접근권을 획득할 수 있음
결론
- ghcr.io와 유사한 주소를 사용하는 피싱 사이트에 주의 필요함
- 자격 증명, 토큰, 비밀번호 등 보안 정보 관리에 더욱 철저한 방침이 요구됨