Was dieses Werkzeug tut
GitHub ist oft der erste Brückenkopf in die Cloud: Ein einziges gestohlenes Personal Access Token gibt dem Angreifer Ihren Quellcode, Ihre CI/CD-Pipelines und — über Actions-Secrets — Ihre Cloud-Konten. Das Audit-Log der Organisation hält das meiste davon fest: wer sich mit welchem Token von welcher IP authentifiziert, was geklont und welche Einstellung geändert hat.
Dieses Werkzeug liest diese Exporte im Browser, wertet einen Satz veröffentlichter Erkennungsregeln aus und liefert ein Gesamturteil (Unauffällig / Verdächtig / Kompromittiert), die Befunde mit Beweisen und MITRE-ATT&CK-Techniken, eine Vorfall-Zeitleiste, eine Sicht nach Entitäten (Akteure, Tokens, IPs, Repositories, Workflows, Runner, Apps) und eine Maßnahmenliste.
Was Sie ablegen können
- Audit-Log der Organisation oder des Enterprise, aus der Weboberfläche exportiert (JSON oder CSV).
- REST-API-Ausgabe (GET /orgs/{org}/audit-log, mit include=all für Git-Events), Seiten verkettet oder einzeln.
- Audit-Log-Streaming-Dateien (Amazon S3, Azure Blob, Google Cloud Storage): Struktur YYYY/MM/DD/HH/MM/<uuid>.json.log.gz, gzip-komprimierte JSON Lines — legen Sie den ganzen Ordner ab.
- Git-Events-Export (export-<enterprise>-<timestamp>.json.gz): git.clone, git.fetch und git.push mit Token-Metadaten.
- Protokollarchive von GitHub-Actions-Läufen (das ZIP aus „Download log archive“).
- Secret-Scanning-Warnungen, wie sie die REST-API liefert (JSON).
Was erkannt wird
Erkennungen sind Daten, kein Code: Jede Regel ist ein prüfbarer JSON-Eintrag (Bedingungen, Schwelle oder Referenz, Schweregrad, ATT&CK-Techniken, Maßnahmen) mit positiven und negativen Testfällen. Die Regeln dieser Version:
| Regel | Schweregrad | ATT&CK |
|---|---|---|
Workflow-Schritt kodiert oder verschickt Secretsactions-secret-exfil | Kritisch | T1552.001, T1567 |
Token aus einem neuen Land verwendettoken-new-country | Hoch | T1550.001, T1078.004 |
Massen-Klonen von Repositoriesgit-clone-burst | Hoch | T1213.003 |
Repository öffentlich gemachtrepo-made-public | Hoch | T1567 |
Repository nach außen übertragenrepo-transferred | Hoch | T1537 |
Mehrere Repositories gelöschtrepo-mass-delete | Hoch | T1485 |
Owner der Organisation oder des Enterprise hinzugefügtowner-granted | Hoch | T1098.003 |
Zwei-Faktor-Pflicht deaktivierttwo-factor-disabled | Hoch | T1556 |
SAML-SSO deaktiviert oder umkonfiguriertsso-changed | Hoch | T1556 |
IP-Zulassungsliste deaktiviertip-allowlist-disabled | Hoch | T1562.007 |
Audit-Log-Streaming entfernt oder geändertaudit-stream-changed | Hoch | T1562.008 |
Branch-Schutz oder Ruleset entferntbranch-protection-removed | Hoch | T1562 |
Schutz einer Deployment-Umgebung entferntenvironment-protection-removed | Hoch | T1562 |
Konto aus einem neuen Land aktivactor-new-country | Mittel | T1078.004 |
Viele Quellcode-Archive heruntergeladenarchive-download-burst | Mittel | T1213.003 |
Admin-Zugriff an einen Collaborator vergebencollaborator-admin | Mittel | T1098 |
Einschränkungen für Drittanbieter-Apps deaktiviertoauth-restrictions-disabled | Mittel | T1562 |
Richtlinie für Personal Access Tokens geschwächtpat-policy-weakened | Mittel | T1562 |
Branch-Schutz umgangenbranch-protection-override | Mittel | T1562 |
Selbst gehosteter Runner registriertself-hosted-runner-registered | Mittel | T1072 |
Lange kodierte Zeichenkette in einem Workflow-Protokollactions-encoded-output | Mittel | T1552.001, T1027 |
Secret Scanning hat ein geleaktes Secret gefundensecret-leak-alert | Mittel | T1552.001 |
Push-Schutz für Secrets umgangenpush-protection-bypass | Mittel | T1552.001 |
SSH- oder Deploy-Key hinzugefügtdeploy-key-added | Mittel | T1098.004 |
Token von einer neuen IP-Adresse verwendettoken-new-ip | Niedrig | T1550.001 |
Forken privater Repositories erlaubtprivate-forking-enabled | Niedrig | T1537 |
Actions-Secret erstellt oder geändertactions-secret-created | Niedrig | |
Workflow-Lauf von einem nie gesehenen Branchworkflow-new-branch | Niedrig | T1677 |
Fine-grained Token angefragt oder freigegebenfine-grained-token-granted | Niedrig | T1550.001 |
App installiert oder OAuth-App genehmigtapp-authorized | Niedrig | T1528 |
Webhook erstelltwebhook-created | Niedrig | T1567 |
Wie das Urteil zustande kommt
- Kompromittiert: mindestens ein kritischer Befund (z. B. von einem Workflow ausgegebene Secrets) oder mehrere verschiedene Befunde mit hohem Schweregrad zu demselben Akteur, Token oder derselben IP-Adresse.
- Verdächtig: mindestens ein Befund mit hohem oder mittlerem Schweregrad.
- Unauffällig: kein Befund über niedrig. Das gilt nur für den Inhalt der Logs — prüfen Sie die Hinweise zur Abdeckung (IP-Anzeige, Git-Events, Token-Metadaten) und den abgedeckten Zeitraum.
Wenn Cloud-Schlüssel geleakt wurden
Actions-Secrets sind meist Cloud-Zugangsdaten. Tauchen sie in den Beweisen auf, ist der nächste Schritt das Cloud-Konto selbst — weiter mit den Schwesterwerkzeugen dieser Reihe:
Einschränkungen
- Das Audit-Log speichert keine Dateiinhalte: Ein veränderter Workflow wird aus Läufen abgeleitet (neuer Branch, im Protokoll ausgegebene Secrets), nicht aus dem Diff. Prüfen Sie die Historie von .github/workflows selbst.
- Ohne „Display IP addresses“ enthalten Exporte kein actor_ip und nur begrenzte Standortdaten: IP-basierte Erkennungen können nicht anschlagen.
- Git-Events (Clones, Fetches, Pushes) werden nur 7 Tage aufbewahrt und sind nicht im JSON-/CSV-Export der Weboberfläche enthalten: Ohne sie bleibt Massen-Klonen unsichtbar.
- Die Regeln sind Heuristiken mit Schwellen (10 in etwa einer Stunde geklonte Repositories, eine 24-Stunden-Referenz für neue IPs und Länder): Passen Sie sie an Ihre Organisation an. Ein unauffälliges Urteil ist kein Beweis für die Abwesenheit eines Angriffs.
- Die Tabelle zeigt die ersten 100.000 Ereignisse; analysiert werden alle. Sicherheitsprotokolle persönlicher Konten sind nicht abgedeckt.
FAQ
Werden meine Audit-Logs irgendwohin hochgeladen?
Nein. Der Analysator ist in Rust geschrieben, nach WebAssembly kompiliert und läuft in einem Web Worker in Ihrem Browser; Dateien werden als Stream von der Festplatte gelesen und lokal dekomprimiert. Es gibt keinen Upload-Endpunkt, und das Werkzeug funktioniert nach dem Laden der Seite auch offline.
Woran erkenne ich, dass ein GitHub-Token gestohlen wurde?
Achten Sie auf denselben hashed_token von einer neuen IP-Adresse oder aus einem neuen Land, git.clone-Serien über viele Repositories und Token-Aktivität außerhalb der Arbeitszeiten des Besitzers. Das Audit-Log speichert hashed_token, programmatic_access_type und token_scopes für per Token authentifizierte Ereignisse; dieses Werkzeug bildet für jedes Token eine Referenz und markiert neue Standorte.
Wie finde ich heraus, zu welchem Token ein hashed_token gehört?
hashed_token ist der Base64-kodierte SHA-256-Hash des Tokens. Mit einem Kandidaten-Token berechnen Sie ihn so: echo -n TOKEN | openssl dgst -sha256 -binary | base64 — und suchen dann im Audit-Log nach hashed_token:"WERT". Enterprise-Owner können auch das Credential-Inventar exportieren, das die hashed_token-Werte enthält.
Warum sehe ich keine git.clone-Ereignisse?
Git-Events sind nicht im JSON-/CSV-Export der Weboberfläche enthalten. Holen Sie sie über das Menü „Export Git Events“ des Enterprise, die REST-API mit include=git oder include=all oder das Audit-Log-Streaming — und zwar schnell: Sie werden nur 7 Tage aufbewahrt.
Kann ein Workflow Secrets leaken, obwohl GitHub sie maskiert?
Ja. GitHub ersetzt bekannte Secret-Werte in Protokollen durch ***, aber ein Skript, das sie Base64-kodiert (doppelt oder umgedreht), gibt eine unmaskierte Zeichenkette aus, die sich zum Secret zurückdekodieren lässt. Dieses Werkzeug markiert Skripte, die Secrets oder die Umgebung an Encoder oder externe Endpunkte weiterleiten, sowie lange kodierte Zeichenketten in der Ausgabe.
Ist das ein offizielles GitHub-Werkzeug?
Nein. Es ist ein unabhängiges Werkzeug, weder mit GitHub, Inc. verbunden noch von ihr unterstützt. Es liest die dokumentierten Exportformate des Audit-Logs.