Skip to content

This tool is not affiliated with, endorsed by or sponsored by GitHub, Inc. or Microsoft Corporation. GitHub and GitHub Actions are trademarks of GitHub, Inc. Other names are trademarks of their respective owners.

Audit log forensics · runs in your browser

Was our GitHub organization compromised?

Drop your GitHub audit log exports — plus Git events and Actions run logs if you have them — and get a verdict, a supply-chain incident timeline and a remediation checklist. Analysed in your browser with WebAssembly: nothing is uploaded.

  • 31 detection rules
  • Rust → WebAssembly
  • nothing uploaded

Drop audit log exports here

Organization or enterprise audit log (JSON / CSV export, REST API output, streaming .json.log.gz), Git events export (.json.gz), Actions run log archives (.zip), secret-scanning alerts (JSON). Loose files, folders or ZIPs — several at once.

The sample is a fictional incident (organization "northwind-labs"): a developer's token stolen by an infostealer, replayed from a VPS.

Runs entirely in your browser. Your logs never leave this device. · Independent tool — not affiliated with GitHub.

How to get your data

From nothing to a file in the drop zone in about two minutes. Start with the first tab: it works on every plan.

  1. 1. CollectExport the audit log (below)
  2. 2. DropThe file, folder or ZIP, into the tool
  3. 3. Stays localAnalysed in your browser, nothing uploaded

Organization audit log, from the web interface

Needsorganization owner. Every plan (Free, Team, Enterprise Cloud).

  1. On GitHub, open the organization → Settings → Archive → Logs → Audit log.
  2. Optional: type a date filter in the search box, for example created:>=2026-09-01, and press Enter.
  3. Click Export → JSON (CSV works too, JSON keeps nested fields).
  4. Drop the downloaded .json file into the tool.

A suspicious workflow run? Take its logs too

Needsread access to the repository. Every plan.

  1. Repository → Actions → open the run.
  2. ⋯ menu (top right) → Download log archive.
  3. Drop the ZIP as is, with the audit log.

Gotchas

  • Retention: 180 days for the audit log, 7 days for Git events, 90 days by default for Actions logs. Export today, Git events first.
  • The web export has no Git events and stops at 100 MB compressed or 10 minutes of processing: split long periods with created:>= / created:<= filters. Overlaps are harmless.
  • No IP addresses unless an owner enabled IP display (Enterprise Cloud): without them, new-IP and new-country detections cannot fire. Times are UTC.

What this tool does

GitHub is often the first cloud foothold: a single stolen personal access token gives the attacker your source code, your CI/CD pipelines and — through Actions secrets — your cloud accounts. The organization audit log records most of it: who authenticated with which token, from which IP, cloned what, changed which setting.

This tool reads those exports in your browser, evaluates a set of published detection rules, and gives an overall verdict (Clean / Suspicious / Compromised), the findings with their evidence and MITRE ATT&CK techniques, an incident timeline, an entity pivot (actors, tokens, IPs, repositories, workflows, runners, apps) and a remediation checklist.

What you can drop

  • Organization or enterprise audit log exported from the web interface (JSON or CSV).
  • REST API output (GET /orgs/{org}/audit-log, with include=all for Git events), several pages concatenated or not.
  • Audit log streaming files (Amazon S3, Azure Blob, Google Cloud Storage): the YYYY/MM/DD/HH/MM/<uuid>.json.log.gz layout, gzip'd JSON lines — drop the whole folder.
  • Git events export (export-<enterprise>-<timestamp>.json.gz): git.clone, git.fetch and git.push with token metadata.
  • GitHub Actions run log archives (the ZIP from "Download log archive").
  • Secret-scanning alerts as returned by the REST API (JSON).

What it detects

Detections are data, not code: each rule is a reviewable JSON entry (conditions, threshold or baseline, severity, ATT&CK techniques, remediation) with positive and negative test cases. The rules shipped with this version:

RuleSeverityATT&CK
Workflow step encodes or ships secrets
actions-secret-exfil
CriticalT1552.001, T1567
Token used from a new country
token-new-country
HighT1550.001, T1078.004
Mass cloning of repositories
git-clone-burst
HighT1213.003
Repository made public
repo-made-public
HighT1567
Repository transferred out
repo-transferred
HighT1537
Several repositories deleted
repo-mass-delete
HighT1485
Organization or enterprise owner added
owner-granted
HighT1098.003
Two-factor requirement disabled
two-factor-disabled
HighT1556
SAML single sign-on disabled or reconfigured
sso-changed
HighT1556
IP allow list disabled
ip-allowlist-disabled
HighT1562.007
Audit log streaming removed or changed
audit-stream-changed
HighT1562.008
Branch protection or ruleset removed
branch-protection-removed
HighT1562
Deployment environment protection removed
environment-protection-removed
HighT1562
Account active from a new country
actor-new-country
MediumT1078.004
Many source archives downloaded
archive-download-burst
MediumT1213.003
Admin access given to a collaborator
collaborator-admin
MediumT1098
Third-party app restrictions disabled
oauth-restrictions-disabled
MediumT1562
Personal access token policy weakened
pat-policy-weakened
MediumT1562
Branch protection bypassed
branch-protection-override
MediumT1562
Self-hosted runner registered
self-hosted-runner-registered
MediumT1072
Long encoded blob printed in a workflow log
actions-encoded-output
MediumT1552.001, T1027
Secret scanning found a leaked secret
secret-leak-alert
MediumT1552.001
Secret push protection bypassed
push-protection-bypass
MediumT1552.001
SSH or deploy key added
deploy-key-added
MediumT1098.004
Token used from a new IP address
token-new-ip
LowT1550.001
Forking of private repositories allowed
private-forking-enabled
LowT1537
Actions secret created or changed
actions-secret-created
Low
Workflow run from a branch never seen before
workflow-new-branch
LowT1677
Fine-grained token requested or granted access
fine-grained-token-granted
LowT1550.001
App installed or OAuth app approved
app-authorized
LowT1528
Webhook created
webhook-created
LowT1567

How the verdict is decided

  • Compromised: at least one critical finding (for example secrets printed by a workflow), or several distinct high-severity findings on the same actor, token or IP address.
  • Suspicious: at least one high or medium finding.
  • Clean: no finding above low. It only covers what the logs contain — check the coverage notes (IP display, Git events, token metadata) and the period covered.

When cloud keys leaked

Actions secrets are usually cloud credentials. When they appear in the evidence, the next hop is the cloud account itself — continue with the sibling tools of this series:

Limitations

  • The audit log does not record file contents: a modified workflow is inferred from runs (new branch, secrets printed in the run log), not from the diff. Review .github/workflows history yourself.
  • Without "Display IP addresses", exports have no actor_ip and location data is limited: IP-based detections cannot fire.
  • Git events (clones, fetches, pushes) are only retained 7 days and are not in the web interface's JSON/CSV export: without them mass cloning is invisible.
  • Rules are heuristics with thresholds (10 repositories cloned within about an hour, a 24-hour baseline for new IPs and countries): tune them to your organization. A clean verdict is not proof of absence.
  • The table lists the first 100,000 events; every event is analysed. User security logs (personal account events) are not covered.

FAQ

Are my audit logs uploaded anywhere?

No. The analyzer is Rust compiled to WebAssembly and runs in a Web Worker in your browser; files are streamed from disk and decompressed locally. There is no upload endpoint, and you can use the tool offline once the page is loaded.

How do I know if a GitHub token was stolen?

Look for the same hashed_token used from a new IP address or country, git.clone bursts across many repositories, and token activity outside the owner's working hours. The audit log records hashed_token, programmatic_access_type and token_scopes for token-authenticated events; this tool baselines each token and flags new locations.

How do I find which token a hashed_token belongs to?

hashed_token is the base64 SHA-256 of the token. If you have a candidate token, compute it with: echo -n TOKEN | openssl dgst -sha256 -binary | base64 — then search the audit log for hashed_token:"VALUE". Enterprise owners can also export the credential inventory, which lists hashed_token values.

Why don't I see git.clone events?

Git events are not included in the web interface's JSON/CSV audit log export. Get them from the enterprise "Export Git Events" menu, the REST API with include=git or include=all, or audit log streaming — and quickly: they are kept 7 days only.

Can a workflow leak secrets even though GitHub masks them?

Yes. GitHub replaces known secret values with *** in logs, but a script that base64-encodes them (twice, or reversed) prints an unmasked string that decodes back to the secret. This tool flags run scripts that pipe secrets or the environment into encoders or external endpoints, and long encoded blobs in the output.

Is this an official GitHub tool?

No. It is an independent open tool, not affiliated with or endorsed by GitHub, Inc. It reads the documented audit log export formats.

What to do next

If the verdict is Suspicious or Compromised, start with the remediation checklist the tool generates, keep the original exports read-only, and follow GitHub's official documentation (in English, on docs.github.com):

Official documentation by GitHub, Inc.; this site is independent of it.

What the GitHub audit log does not record: 180-day and 7-day retention, plan limits for API and Git events, hidden IPs, no file contents or secret reads.
A fictional GitHub supply chain attack investigated end to end: stolen PAT, 38 repos cloned, AWS keys printed by a workflow, branch protection removed.
AWS, Google Cloud or Azure keys leaked from GitHub Actions or a repo: contain the key, trace its use in the cloud audit logs, then replace keys with OIDC.

This tool is not affiliated with, endorsed by or sponsored by GitHub, Inc. or Microsoft Corporation. GitHub and GitHub Actions are trademarks of GitHub, Inc. Other names are trademarks of their respective owners.