콘텐츠로 이동

OVHcloud CLI 릴리스 자산 변조 사고

OVHcloud CLI 릴리스 자산 변조 사고 thumbnail
2026년 10월 19일 OVHcloud 개발자의 GitHub 계정에서 탈취된 키가 OVHcloud CLI 릴리스 자산 교체에 사용됐다. 공격자는 14:47부터 16:21까지 UTC+2 기준으로 0.11.0부터 0.15.0까지의 macOS, Linux, Windows용 실행 파일을 정보 탈취 악성 코드가 포함된 바이너리로 바꿨다.

요약

2026년 10월 19일 OVHcloud 개발자의 GitHub 계정에서 탈취된 키가 OVHcloud CLI 릴리스 자산 교체에 사용됐다. 공격자는 14:47부터 16:21까지 UTC+2 기준으로 0.11.0부터 0.15.0까지의 macOS, Linux, Windows용 실행 파일을 정보 탈취 악성 코드가 포함된 바이너리로 바꿨다.

영향 시간대에 해당 버전을 내려받아 실행한 시스템에서는 로컬 비밀값이 노출된 것으로 간주해야 한다. 악성 파일 삭제나 0.16.0 재설치만으로는 탈취된 자격 증명의 재사용을 막을 수 없다.

실행 시스템의 비밀값을 폐기한다

영향 바이너리를 실행한 시스템을 격리하고, 해당 시스템에 저장됐거나 실행 계정이 접근할 수 있었던 자격 증명을 신뢰할 수 있는 시스템에서 교체한다. 원본 파일, 임시 디렉터리와 실행·통신 로그는 조사용으로 보존한다.

사고 범위

항목 내용
제품 OVHcloud CLI
유통 경로 공식 GitHub 저장소의 릴리스 자산
영향 버전 0.11.0부터 0.15.0까지
영향 시간 2026-10-19 14:47~16:21 UTC+2
영향 운영체제 macOS ARM64·x86-64, Linux ARM64·x86-64, Windows x86-64
비영향 버전 0.10.0 이하, 0.16.0 이상
공개 다운로드 수 약 250건
악성 기능 로컬 파일과 자격 증명 수집 및 외부 전송
CVE 없음
초기 대응 악성 자산 삭제, 계정 정지, 릴리스 불변성 활성화, 0.16.0 배포

영향 여부는 버전만으로 판정하지 않는다. 해당 버전을 2026년 10월 19일 14:47부터 16:21까지 UTC+2 기준으로 내려받거나 갱신한 뒤 실행했는지 확인해야 한다. 이전에 받은 동일 버전과 소스 빌드, 컨테이너 이미지는 영향을 받지 않았다.

저장소 소스, 태그와 빌드 체인은 변경되지 않았다. 공격자는 정상 릴리스 절차를 거치지 않고 로컬에서 만든 바이너리와 체크섬 파일을 기존 릴리스에 업로드했다. GitHub 릴리스 불변성 설정이 비활성화돼 있어 기존 자산을 교체할 수 있었다.

타임라인

날짜와 시각 사건
2026-10-19 14:47 UTC+2 0.15.0의 macOS 바이너리 교체 시작
2026-10-19 14:57 UTC+2 0.15.0의 대상 바이너리 전체 교체
2026-10-19 15:30 UTC+2 0.11.0부터 0.15.0까지 대상 확대
2026-10-19 15:50 UTC+2 사용자가 체크섬 변경과 비정상 빌드를 GitHub 이슈로 신고
2026-10-19 15:57 UTC+2 OVHcloud 조사 시작
2026-10-19 16:21 UTC+2 악성 바이너리 삭제 완료
2026-10-19 19:16 UTC+2 정상 버전 0.16.0 배포
2026-10-20 GitHub 보안 권고문 게시

공격 메커니즘

신고자는 0.15.0 Linux ARM64 압축 파일의 SHA-256 값이 기존 값에서 변경된 사실을 확인했다. 교체된 바이너리에는 다음 빌드 정보가 남아 있었다.

module: github.com/ovh/ovhcloud-cli
version: v0.15.1-0.20261013083505-5ead8ef9b43d+dirty
revision: 5ead8ef9b43d354dfb5caadff803b11afc8c5c58
modified: true
build time: 2026-10-13T08:35:05Z

이 정보는 0.15.0 태그가 가리키는 커밋과 일치하지 않는다. 정식 릴리스 설정에 포함된 버전 주입 옵션도 빠져 있어 릴리스 파이프라인 밖에서 빌드된 파일임을 보여준다.

악성 Go 코드는 envchecker 모듈로 삽입됐다. 바이너리가 실행될 때마다 임시 디렉터리에 envchecker-와 9~10자리 숫자로 구성된 작업 폴더를 만들고 수집한 파일을 복사한다. 이 폴더와 내용은 실행 후에도 삭제되지 않는다.

### 변조된 OVHcloud CLI 실행

  -> 임시 디렉터리에 envchecker-[0-9]{9-10} 생성
  -> 자격 증명·설정·개발 도구 데이터 복사
  -> 수집 결과를 압축 파일로 생성
  -> Solana RPC에서 전송 목적지 확인
  -> 45.32.148[.]174:443의 /upload로 전송

수집 대상에는 다음 파일과 디렉터리가 포함된다.

~/.aws/credentials
~/.aws/config
~/.config/gcloud/credentials.db
~/.config/gcloud/access_tokens.db
~/.azure/azureProfile.json
~/.azure/msal_token_cache.json
~/.docker/config.json
~/.kube/config
~/.ssh
~/.netrc
~/.config/doctl/config.yaml
~/.terraform.d/credentials.tfrc.json
~/.gitconfig
~/.claude
~/.local/share/opencode/opencode.db

VS Code, Cursor, Continue, Sourcegraph Cody와 Hermes의 데이터베이스·세션 기록도 수집 대상이었다. 따라서 OVHcloud 자격 증명만 교체해서는 대응이 끝나지 않는다.

악성 코드는 다음 Solana RPC 중 하나를 선택해 지갑 주소 BHaDaVbdCYFNaKZGn7yLXFneWoJHZgLiBYkHxVrjyALF와 관련된 호출을 수행했다.

solana.drpc[.]org
solana-rpc.publicnode[.]com
solana.api.pocket[.]network
api.mainnet-beta.solana[.]com
solana.api.onfinality[.]io/public

최종 수집 파일은 45.32.148[.]174:443의 /upload 경로로 전송됐다. 이 주소는 사고 당시 지표이므로 단독 판정 기준으로 사용하지 않는다.

영향 시스템 식별

현재 설치 버전보다 다운로드와 실행 이력이 중요하다. 다음 위치에서 영향 시간대의 파일 반입과 실행을 확인한다.

  • 개발자 작업용 컴퓨터
  • 지속적 통합·배포 실행기와 빌드 서버
  • 운영 자동화 서버
  • 관리자 접속 서버
  • 내부 패키지 캐시와 산출물 저장소
  • 실행 파일을 포함할 수 있는 가상 머신 템플릿
  • 브라우저, 프록시와 종단 보안 제품의 기록

Windows에서는 관련 파일과 남은 임시 디렉터리를 수집한다.

Get-ChildItem -Path C:\Users,C:\ProgramData -Recurse -ErrorAction SilentlyContinue |
    Where-Object {
        $_.Name -match 'ovhcloud' -or
        $_.Name -match '^envchecker-\d{9,10}$'
    } |
    Select-Object FullName, Length, CreationTimeUtc, LastWriteTimeUtc

발견한 실행 파일은 실행하지 않는다. 해시, 서명과 시간 정보를 기록한 뒤 공식 권고문의 악성 파일 MD5 값과 대조한다.

Get-FileHash -Algorithm MD5 -LiteralPath 'C:\path\to\ovhcloud.exe'
Get-FileHash -Algorithm SHA256 -LiteralPath 'C:\path\to\ovhcloud.exe'
Get-AuthenticodeSignature -LiteralPath 'C:\path\to\ovhcloud.exe' |
    Select-Object Status, StatusMessage, SignerCertificate
운영체제와 구조 악성 파일 MD5
macOS ARM64 6f2f086239f3d88eb2750e871901927d
macOS x86-64 347e65eb7f2d78d1c6872690272a6cc3
Linux ARM64 01f57206d37c28cf711677f612052913
Linux x86-64 301bff0b51980b9e76c93633e7cfd3bd
Windows x86-64 6a3cf153338c416169cda2fe704c8848

탐지 포인트

네트워크

영향 바이너리의 실행 시각을 기준으로 도메인 이름 조회, 프록시, 방화벽과 종단 보안 제품의 통신 기록을 연결한다. 다음 지표를 우선 검색한다.

destination.ip == "45.32.148.174"
OR destination.domain IN (
  "solana.drpc.org",
  "solana-rpc.publicnode.com",
  "solana.api.pocket.network",
  "api.mainnet-beta.solana.com",
  "solana.api.onfinality.io"
)

Solana RPC는 정상 응용 프로그램에서도 사용할 수 있다. ovhcloud 프로세스 실행, envchecker- 임시 디렉터리 생성과 외부 통신이 같은 시간대에 발생했는지 확인한다.

엔드포인트

다음 행위 연결을 조사한다.

### ovhcloud 또는 ovhcloud.exe 실행

  -> 임시 디렉터리에 envchecker-[0-9]{9-10} 생성
  -> 클라우드·개발 도구 설정 파일 대량 읽기
  -> 작업 디렉터리에 파일 복사 및 압축
  -> Solana RPC 통신
  -> 45.32.148[.]174:443/upload 통신

종단 보안 기록에서 실행 경로, 해시, 실행 계정, 명령행과 부모 프로세스를 확인한다. 파일이 삭제됐더라도 Windows Prefetch·Amcache, 셸 기록, 지속적 통합 작업 기록과 종단 보안 원격 측정에 흔적이 남을 수 있다.

서버

지속적 통합·배포 시스템에서는 영향 바이너리 실행 당시 작업에 제공된 비밀값을 식별한다. 저장소 단위 비밀값뿐 아니라 조직 공용 비밀값, 배포 계정, 컨테이너 저장소 토큰과 클라우드 연동 자격 증명도 포함한다.

내부 산출물 저장소와 이미지 저장소에서는 악성 바이너리가 복제됐는지 확인한다. OVHcloud와 다른 클라우드의 감사 기록에서는 실행 이후 발생한 새 출발지 인증, 키 생성, 권한 변경과 평소 사용하지 않던 자원 접근을 찾는다.

대응

순서 조치 완료 기준
1 영향 파일과 실행 시스템 격리 추가 실행과 외부 통신 차단
2 파일·임시 디렉터리·로그 보존 해시와 실행·통신 시각 확보
3 노출 가능한 자격 증명 폐기 기존 키와 토큰 비활성화 확인
4 인증 및 외부 통신 기록 분석 탈취 자격 증명의 후속 사용 확인
5 내부 캐시와 배포 이미지 검사 악성 파일의 재배포 경로 제거
6 공식 0.16.0 이상 버전 설치 신뢰할 수 있는 시스템에서 무결성 확인
7 감염 시스템 재구축 여부 결정 수집 범위와 조사 결과 반영

새 자격 증명은 조사 대상 시스템에서 만들거나 배포하지 않는다. 다음 자격 증명을 실행 시스템의 저장 파일과 작업 환경을 기준으로 교체한다.

  • AWS, Google Cloud, Azure와 DigitalOcean 자격 증명
  • Kubernetes와 Docker 설정에 저장된 토큰
  • SSH 키와 .netrc 인증 정보
  • Terraform과 NPM 자격 증명
  • Git 원격 저장소 접근 자격 증명
  • 개발 보조 도구의 세션과 토큰
  • 지속적 통합·배포 작업에 주입된 비밀값

OVHcloud는 악성 릴리스 자산을 삭제하고, 관련 개발자 계정을 조직에서 정지했으며, 쓰기 권한 계정과 저장소 기록을 조사했다. 이후 조직 전체에서 GitHub 릴리스 불변성을 활성화하고 서명된 태그로 0.16.0을 배포했다.

배포 무결성 점검

이번 사고에서는 소스와 태그가 유지된 상태에서 릴리스 자산과 체크섬 파일이 함께 교체됐다. 같은 위치에 게시된 체크섬만 검증하면 변조를 탐지할 수 없다.

### 보호된 소스 커밋

  -> 서명된 태그
  -> 격리된 빌드
  -> 외부에 고정한 파일 해시
  -> 암호학적 서명
  -> 출처 증명
  -> 변경 불가능한 릴리스
  -> 내부 배포

파일 해시와 서명은 릴리스 자산과 별도 신뢰 경로로 배포한다. 내부 반입 과정에서는 승인된 해시, 서명과 출처 증명을 검증하고 기존 자산의 식별자가 사후에 바뀌는지 감시한다.

참고 자료