Commit metadata is easy to forge. Git does not enforce any relationship between an author’s claimed identity, their email address, or the timestamps embedded in a commit object — and GitHub faithfully records whatever the client sends. Two distinct attack techniques exploit this: rebase injection, where an attacker backdates malicious commits to blend into historical activity; and tooling fingerprints left by specific attacker frameworks that incorrectly serialize commit metadata. Both rules in this category require commit data collected viaDocumentation 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.
--commits and are critical severity.
commit-date-gap
Severity: criticalRequired data: Commits (
--commits)
What it detects
A commit where the committer date is more than 90 days later than the author date. In normal development, these two timestamps are nearly identical or differ by at most a few days (e.g. a long-lived feature branch). A gap exceeding 90 days indicates the commit was authored far in the past but only recently introduced into the repository’s history — the hallmark of a rebase injection attack.How rebase injection works
In a rebase injection attack, an attacker:- Creates a malicious commit and backdates its author timestamp to a point in the past when the repository was presumably less scrutinized — for example, a date before the current maintainers joined the project.
- Performs an interactive rebase (
git rebase -i) to splice the backdated commit into the middle of the repository’s history. - Force-pushes the rewritten history to the default branch.
git log between legitimate commits from months or years ago, making it far less likely to be noticed during a normal code review or audit. The author date is the forged past timestamp; the committer date is the actual time the rebase occurred — and this gap is what the rule detects.
The threshold is defined in commit_tamper.py:
How detection works
The analyzer queries thepush_commits table (populated by --commits) for rows where committer_date exceeds author_date by more than 90 days.
Finding description
Evidence fields
| Field | Description |
|---|---|
sha | Full commit SHA |
author_date | Claimed timestamp of original authorship |
committer_date | Actual timestamp when the commit was introduced via rebase |
gap_days | Computed difference in days between the two timestamps |
message_headline | First line of the commit message |
before_sha | The SHA that was HEAD before this push (for history comparison) |
Collecting commit data
Commit-level metadata is not included in GitHub’s public event stream and requires a separate collection step:null-committer-email
Severity: criticalRequired data: Commits (
--commits)
What it detects
A commit where the committer email is the literal string'null' — not an empty string, not a missing value, but the four-character string null. This is a known fingerprint left by ForceMemo, an attacker tooling framework that incorrectly serializes Git commit metadata when constructing crafted commits for injection attacks.
The ForceMemo fingerprint
ForceMemo is a toolset used in targeted supply chain attacks to automate the construction and injection of backdated commits. A bug in its commit serialization layer causes it to write the stringnull as the committer email when the committer identity is not explicitly configured — rather than using the author’s email or raising an error. This fingerprint is stable across known ForceMemo versions and is not produced by any legitimate Git client or CI system.
A single occurrence of committer_email = 'null' in a repository’s commit history is sufficient to indicate that the commit was produced by attacker tooling, regardless of what the commit itself contains.
How detection works
The analyzer queries thepush_commits table for an exact string match on the committer email field.
Finding description
Evidence fields
| Field | Description |
|---|---|
sha | Full commit SHA |
committer_email | The literal string 'null' |
committer_date | Timestamp when the commit was introduced |
message_headline | First line of the commit message |
before_sha | The SHA that was HEAD before this push |