Release tampering is one of the highest-impact supply chain attacks because it affects every downstream user who installs or updates the package. An attacker who gains momentary write access to a repository — through a compromised token, social engineering, or a dependency confusion attack on the release tooling itself — can publish a malicious release without any prior visible activity in the repository. The two rules in this category address that scenario directly: the first fires when a release is published by an actor with no verifiable history in the repository, and the second fires when releases are created at a machine-like rate that suggests automated hijack tooling.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/morwn/github-threat-detector/llms.txt
Use this file to discover all available pages before exploring further.
release-actor-anomaly
Severity: criticalRequired data: Events + releases (
--releases) + contributors (--contributors, optional but recommended)
What it detects
AReleaseEvent where the publishing actor:
- Has no prior push history in the repository (not found in
github_eventsforPushEvent), and - Is not in the contributor list (not found in
repo_contributors), and - Has published fewer than 2 total releases in this repository.
-bot or contains [bot] — are explicitly excluded, as they are legitimate release automation and never appear in push history.
How detection works
The analyzer builds aknown_actors CTE by unioning all actors who have ever pushed to the repository with all entries in the repo_contributors table (populated by --contributors). It then queries for non-bot release events where the actor does not appear in that known set and has a total release count below 2.
total_releases < 2 guard prevents a scenario where a new-but-legitimate maintainer’s first release triggers a flood of findings once they’ve established a pattern.
Finding description
Evidence fields
| Field | Description |
|---|---|
tag_name | The release tag (e.g. v1.4.2) |
release_name | The human-readable release title |
created_at | Timestamp when the release was published |
Improving accuracy with --contributors
Without --contributors, the known_actors set only contains actors who have made direct pushes recorded in the events table. If a contributor has only submitted merged pull requests (which appear as push events from the merge bot, not the contributor), they will not be in the push history and could generate a false positive.
Seeding the contributor list with --contributors adds all repository contributors recognized by the GitHub API, eliminating this class of false positive:
rapid-releases
Severity: highRequired data: Releases (
--releases)
What it detects
An actor who publishes 3 or more releases within a single clock hour, and for whom this is the first time this burst pattern has occurred. Bot accounts are excluded.How detection works
The analyzer groups release events by actor, repository, and hour bucket (date_trunc('hour', created_at)). Any actor-hour bucket with 3 or more events is a candidate. A second aggregation counts how many such rapid-window buckets the actor has historically produced. Only actors with exactly one rapid window (i.e. this is their first burst) generate a finding, which prevents noisy alerts for repositories that legitimately use automated release tools.
Finding description
Evidence fields
| Field | Description |
|---|---|
count | Number of releases published in the hour window |
first_at | Timestamp of the first release in the burst |
last_at | Timestamp of the last release in the burst |