Open Source · · 1 day
elementary-data PyPI and GHCR releases forged
An attacker exploited a GitHub Actions script-injection flaw in elementary-data's issue-update workflow to forge release state, tag v0.23.3 at an orphan commit, and dispatch the legitimate release pipeline.
Between April 24 and 25, 2026, an attacker forged a release of elementary-data, an open-source data-observability tool used in dbt pipelines, by exploiting a script-injection flaw in one of the project's own GitHub Actions workflows. No maintainer ever pushed the bad version; the project's CI did it on the attacker's behalf.
The entry point was a pull-request comment. According to StepSecurity, which reverse-engineered the incident alongside Elementary's own post-mortem, the project ran an issue-update workflow that interpolated comment text directly into a shell run: block, so a crafted comment let the attacker execute arbitrary commands inside the workflow with the repository's GITHUB_TOKEN. From there, the attacker used that token to create an orphan commit, tag it v0.23.3, and add a large elementary.pth file along with a version bump. Python evaluates .pth files at interpreter startup, so the payload would fire without any explicit import elementary in the victim's code. The attacker then dispatched the project's normal release workflow against the forged tag. PyPI accepted elementary-data==0.23.3, and GHCR accepted a multi-architecture ghcr.io/elementary-data/elementary image tagged both 0.23.3 and latest, all signed off by the project's own automation.
The payload was a credential stealer of the kind familiar from the broader spring 2026 wave. It walked the host for SSH keys, cloud credentials, Kubernetes config, package-manager tokens, cryptocurrency wallets, and other secrets, then posted an archive named trin.tar.gz to igotnofriendsonlineorirl-imgonnakmslmao.skyhanni.cloud.
Elementary pulled the bad release, rotated affected credentials, and published a clean 0.23.4. The incident is a textbook example of how a single ${{ github.event.comment.body }} interpolated into a shell step can hand an outsider the same publish authority a maintainer holds.
Appendix · Affected releases
- Clean PyPI versions were identified as 0.23.2 and 0.23.4.
- The complete sdist was reproduced from the retained malicious Git commit using the repository's release command. Its BLAKE2b-256 is 2211e4da100e382242b5e00e60f9da48fe9927b31c8fa4ea331162c137321feb, exactly the content-addressed path PyPI Inspector recorded for elementary-data-0.23.3.tar.gz. The match proves byte-for-byte identity with the original PyPI archive; the SHA-1, SHA-256, and SHA-512 values above were measured from those verified bytes.
- Snyk maps this digest to the compromised multi-architecture 0.23.3 image, which was also served by the mutable latest tag during the incident window.
- Clean container tags included ghcr.io/elementary-data/elementary:0.23.2.
- A mutable latest tag or release channel was reported affected; it is recorded as scope rather than a fixed version identifier.
Indicators
References
- Security Incident Report: Malicious release of Elementary OSS Python CLI v0.23.3elementary-data.com
- elementary-data Compromised on PyPI and GHCRstepsecurity.io
- Malicious Release of elementary-data PyPI Package Steals Cloud Credentials from Data Engineers - Snyksnyk.io
- Popular PyPI Package With 1 Million Monthly Downloads Hacked to Inject Malicious Scripts - Cyber Security Newscybersecuritynews.com
- Retained malicious Elementary 0.23.3 release commitgithub.com
- PyPI Inspector record carrying the original sdist content addressinspector.pypi.io
- Public Triage capture of the PyPI Inspector record on 2026-04-27tria.ge
Source record: oss/attacks/elementary-data/meta.yaml