OVHcloud CLI Compromised: Infostealer Distributed Through Hijacked GitHub Releases for 25 Minutes

On October 19, the official OVHcloud CLI tool was compromised when an attacker used a hijacked developer account to replace binaries in five existing releases from v0.11.0 to v0.15.0. The attack lasted from 15:47 to 16:12 Moscow time, with the infostealer targeting API keys, SSH keys, and other secrets stored on developer and CI machines. The malicious binaries were uploaded directly via the GitHub Releases API, and the checksums.txt file was also replaced to match the tampered archives. Only users who had hardcoded the original SHA-256 hash in their CI pipelines, such as one customer who opened issue #300, detected the tampering when builds failed. The compromised account HassenBF had been infected with GlassWorm malware since March 2025, allowing persistent access until the October attack. OVH responded by deleting the malicious files at 17:21 and releasing v0.16.0 with immutable releases and attestation enabled.

HabrTranslated from Russian

Read at source

On October 19, the official OVHcloud CLI utility was compromised when an attacker used a hijacked developer account to replace binaries in five already-published releases spanning v0.11.0 through v0.15.0. The malicious files were served for approximately 25 minutes between 15:47 and 16:12 Moscow time (12:47–13:12 UTC), affecting macOS, Linux x86_64/arm64, and Windows x86_64 builds while leaving rarer platforms untouched.

How the Attack Unfolded

The attacker leveraged the GitHub Releases API to overwrite existing artifacts without creating new tags or triggering GitHub Actions workflows. The final file uploaded was checksums.txt, ensuring the release page displayed matching hashes for the tampered archives. The install.sh script performed no hash verification, allowing any user running curl ... | sh or downloading directly from the release page to receive the infostealer.

The malware itself was a relatively simple infostealer designed to scan the local filesystem for secrets including OVH API keys, SSH keys, .kube/config, .npmrc, .netrc, and environment files. It was built from a dirty working copy of the repository, as evidenced by Go build metadata showing a pseudo-version and vcs.modified=true.

Why Hardcoded Hashes Provided Protection

Users who had pinned the original SHA-256 hash of ovhcloud-cli_Linux_arm64.tar.gz (5c2beb56…) in their CI pipelines detected the attack immediately when the new archive (3833daff…) caused builds to fail. The Homebrew cask in ovh/homebrew-tap also remained untouched, protecting users who installed via that channel. Those who built from source, used go install, or pulled the official Docker image were likewise unaffected.

Account Compromise Timeline

The compromised account HassenBF had been under attacker control since at least March 2025, when GlassWorm malware was deployed across multiple personal repositories using force-push amend commits. The same loader later used the Solana blockchain as a resilient C2 mechanism, reading memo fields from a specific wallet to retrieve the next-stage payload address. The account retained write access to the ovhcloud-cli repository until the October incident.

OVH has since enabled immutable releases and attestation for v0.16.0 and requested that affected users rotate all secrets discovered on compromised machines. A full post-mortem is expected in the coming days.

Meridian digestThe week's most consequential security stories, distilled into one briefing.See the digest

More in Supply Chain & Open Source

Passwordless Kubernetes Image Pulling with Artifact Keeper via ServiceAccount Tokens
Malicious Code Injected into LiteLLM Open Source AI Package via Supply Chain Attack
GhostAction Campaign Compromises 790 GitHub Repositories via Malicious Workflows