Events Join us at the AWS Summit in Dubai on 30th September
Read

A Hijacked Account Rewrote Five Old OVHcloud Releases. A Broken Checksum Caught It.

A hijacked account swapped five OVHcloud CLI releases for a secret stealing build. Here is the timeline, the IOCs and what you must rotate.

Why the OVHcloud CLI Attack Beat Every Verification Step You Trust

The build server failed a routine check on a Monday afternoon. That failure was the only alarm that rang. Someone had quietly reached back into five old OVHcloud CLI releases and swapped the download files for malware.

What Happened?

On October 19, between 12:47 and 13:12 UTC, a hijacked contributor account replaced the release archives on five versions of the OVHcloud command line tool, v0.11.0 through v0.15.0. Those versions had been published between April and September.

On each one, the attacker swapped the macOS, Linux, and Windows x86_64 archives and the checksums file, leaving the i386, Windows arm64, and WebAssembly builds alone.

I compiled the replacement binary by hand on a messy working tree, not through the official release pipeline. A customer who pins file fingerprints in CI saw the mismatch, pulled the metadata, and filed a public issue. The files came down at 14:21 UTC, 94 minutes after they went live.

Why It Worked

Here is the part that stings. The attacker also rewrote checksums.txt, the file whose entire job is to prove a download is honest. Compare the archive against the published list, and both sides agree, because the same person handwrote both.

Release immutability was switched off, so anyone holding write access could edit a release that shipped six months earlier. The version tag never moved. The commit never moved. Only the file you actually run changed.

What’s the Impact?

Anyone who used the install script, downloaded straight from a release page, or ran the built-in upgrade command during that window may have handed over every secret sitting on that disk. Homebrew installs, source builds, and the Docker image were untouched. The clean build is v0.16.0, now published with immutability on and an attestation attached.

How to Avoid This

  • Pin fingerprints, verify on every build
  • Turn on release immutability
  • Demand signed releases and attestations
  • Alert on force pushes and odd maintainer activity
  • Rotate secrets from a different machine

Indicators of Compromise

Indicators of Compromise

OVHcloud CLI release swap, October 19, 2026

Published indicators only. No copy of a swapped archive was preserved before deletion, so hashes exist for one file and behavioral checks carry the rest.

Affected releases

Compromised v0.11.0v0.12.0v0.13.0v0.14.0v0.15.0
Confirmed clean v0.10.0v0.16.0
Replaced on each release Darwin arm64, Darwin x86_64, Linux arm64, Linux x86_64, Windows x86_64, checksums.txt
Not replaced Linux i386, Windows i386, Windows arm64, JS wasm

Timeline, UTC

12:47 to 13:12Archives swapped on five releases
13:50Pinned hash check fails in customer CI, public issue filed
14:21Swapped files deleted. Exposure window 94 minutes
17:16v0.16.0 published, immutable, with attestation

File hashes, SHA-256

Malicious ovhcloud-cli_Linux_arm64.tar.gz, v0.15.0 3833daffcaaaab27e4e0e0833240ffcb1df8df648f4ec0bc4a75c176e28933cb
Original ovhcloud-cli_Linux_arm64.tar.gz, v0.15.0 5c2beb56e6d83a4b426565a1557791ef759316abcc4effb38dd627c90aeb80e0

Build metadata on the fake binary, go version -m

Module versionv0.15.1-0.20261013083505-5ead8ef9b43d+dirty
vcs.revision5ead8ef9b43d354dfb5caadff803b11afc8c5c58
vcs.modifiedtrue
vcs.time2026-10-13T08:35:05Z
Build flags-ldflags=”-s -w”, no version.Version stamp
Commit behind the real v0.15.0 tag760fd72

Loader artifacts tied to the same account earlier in 2026

preinstall.js SHA-25643df42fd79f6f81e530892b54634598770d6e496796a863c596e616bcb3fec70
Decrypted stage two SHA-2560f79989912572a24ba13baabb32b3fd084496271c51448d47b66fe1aedbf293c
AES-256-CBC keyzetqHyfDfod88zloncfnOaS9gGs90ONX
AES IVa041fdaa0521fb5c3e26b217aaf24115
Solana dead drop walletBjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC
Local marker, macOS~/init.json
Package hook“preinstall”: “node preinstall.js”

Hunt and verify

Check a local binarygo version -m $(which ovhcloud) | grep vcs
Verify a clean assetgh release verify-asset v0.16.0 FILE
Verify attestationgh attestation verify FILE –repo ovh/ovhcloud-cli
BehavioralForce pushes amending the tip of long idle repos; files carrying long runs of Unicode variation selectors; outbound Solana RPC from build hosts
Read this before you act on the list. Hashes for the other eight replaced archives were never published, because no sample was kept. No exfiltration domain, IP or stage two URL has been disclosed. The link between this swap and the loader artifacts above rests on shared account identity and is described by the researchers who found it as inference, not confirmation. Treat the hashes as confirmation, not as coverage.

Scope of exposure: install script, direct release downloads, unpinned CI fetches and the in product upgrade path. Homebrew, go install, source builds and the Docker image were not affected. Rotate every secret readable from an affected machine, and rotate from a different machine.

Your Pipeline Trusted a File That Changed Last Tuesday

Supply chain attacks like this don’t trigger alerts. They pass every check you run, because the attacker edited the check.

Secure.com runs governed AI Teammates above the stack you already own, with your team setting the rules:

  • Red Teammate attacks your own delivery path and shows which trust gap is actually reachable
  • AppSec Teammate watches dependencies, pipelines, and release artifacts for drift from what you approved
  • SOC Teammate assembles the case when a fingerprint breaks, instead of leaving it in a build log overnight
  • Cloud Teammate traces which hosts ran the bad build and what those hosts could reach
  • GRC Teammate keeps the evidence trail so you can prove to an auditor what moved and who approved it

Attack. Harden. Prove. Repeat. Your team sets the rules. AI Teammates do the work.