
Erkennt und korrigiert automatisch hartcodierte Geheimnisse in Python-Repositories – lehnt ab, wenn die Korrektur Ihren Code beschädigen könnte
Autonoma erkennt hartcodierte Secrets und ersetzt sie mit os.environ[...]-Referenzen mittels AST-Umschreibungen. Änderungen werden nur angewendet, wenn die Umschreibung deterministisch und semantisch erhaltend ist.
Umschreibungen verwenden den geparsten Syntaxbaum – nicht Regex auf rohem Text.
Läuft lokal ohne Netzwerkaufrufe. Funktioniert in CI mit idempotenten, minimalen Diffs.

Hartcodierte Secrets in Codebasen:
Die meisten Werkzeuge erkennen sie.
Autonoma berührt nur, was es als sicher zu ändern nachweisen kann.
autonoma scan .
autonoma fix .
git diff
pip install autonoma-cli
Fügen Sie dies zu Ihrer .pre-commit-config.yaml hinzu, um zu verhindern, dass Secrets in Ihre Historie gelangen:
- repo: local
hooks:
- id: autonoma
name: Autonoma Scan
entry: autonoma scan
language: system
types: [python]
# 1. Erstellen Sie eine Testdatei mit hartcodierten Secrets
cat > test_secrets.py << 'EOF'
SENDGRID_API_KEY = "sg-live-abc123xyz789"
DB_PASSWORD = "Pr0dAccess2024!"
EOF
# Erstellen Sie auch die Umgebungsvertragsdatei (erforderlich für sichere Behebung)
printf 'SENDGRID_API_KEY=\nDB_PASSWORD=\n' > .env.example
# 2. Scannen – gibt JSON-Ergebnisse an stdout aus
autonoma scan test_secrets.py
# 3. Beheben – schreibt die Datei direkt um
autonoma fix test_secrets.py
# 4. Erneut scannen – sollte jetzt sauber sein (Exit 0)
autonoma scan test_secrets.py
# 5. Ergebnis anzeigen
cat test_secrets.py
Erwartete Ausgabe nach der Behebung:
import os
SENDGRID_API_KEY = os.environ["SENDGRID_API_KEY"]
DB_PASSWORD = os.environ["DB_PASSWORD"]
Erkennungsmodus. Gibt JSON an stdout und eine menschenlesbare Zusammenfassung an stderr aus. Nicht ändernd – modifiziert niemals Dateien.
# Ein Verzeichnis scannen (JSON-Ergebnisse an stdout)
autonoma scan src/
# JSON-Ergebnisse in eine Datei speichern
autonoma scan src/ > findings.json
Exit-Codes für scan:
| Code | Bedeutung |
|---|---|
0 | Keine Funde |
1 | Funde erkannt |
3 | Werkzeugfehler |
Behebt hartcodierte Secrets durch AST-Umschreibungen. Ändert Dateien direkt.
# Korrekturen anwenden
autonoma fix src/
# Patches vor dem Schreiben anzeigen
autonoma fix src/ --diff
# Prüfbericht schreiben
autonoma fix src/ --report-out audit.json
Exit-Codes für fix:
| Code | Bedeutung |
|---|---|
0 | Keine Funde – Repository war bereits sauber |
1 | Funde vor der Behebung vorhanden (Behebung kann erfolgreich gewesen sein – Ausgabe auf FIXED/REFUSED-Zählungen prüfen) |
3 | Werkzeugfehler |
Der Befehl
fixbeendet sich mit1, sobald vor dem Versuch der Behebung Secrets gefunden wurden, unabhängig davon, ob die Umschreibung erfolgreich war. Dies ist beabsichtigt: CI-Pipelines sollen den Commit markieren, in dem Secrets eingeführt wurden, auch nach Auto-Fix. Führen Sie anschließendautonoma scanaus, um zu bestätigen, dass das Repository sauber ist.
Durchsucht die Git-Historie nach Secrets, die committet und später entfernt oder geändert wurden.
[!NOTE] Nur Erkennung. Dieser Befehl schreibt die Git-Historie nicht um und ändert keine Commits.
autonoma history-scan .
Dies sind die Muster, die Autonoma heute tatsächlich behebt.
# settings.py
SENDGRID_API_KEY = "sg-live-abc123xyz789"
DB_PASSWORD = "Pr0dAccess2024!"
autonoma fix .)# settings.py
import os
SENDGRID_API_KEY = os.environ["SENDGRID_API_KEY"]
DB_PASSWORD = os.environ["DB_PASSWORD"]
# f-string – abgelehnt, da die Umschreibung die Semantik ändern würde
api_key = f"prefix_{BASE_KEY}"
# → REFUSED: refuse_fstring_mixed_expression
# Dict/Verschachtelter Wert – abgelehnt, da das Ziel keine einfache Zuweisung ist
DATABASES = {
"default": {"PASSWORD": "Pr0d@ccess2024!"}
}
# → REFUSED: unsupported assignment target type
Abgelehnte Funde werden im JSON-Output gemeldet und verursachen einen Non-Zero-Exit in CI. Dateien mit abgelehnten Funden werden niemals modifiziert.
Eine erneute Ausführung auf einer sauberen Datei nimmt keine Änderungen vor. Umschreibungen behalten die ursprüngliche Einrückung und Kommentare bei. import os wird nur hinzugefügt, wenn es fehlt.
Um Ihren Build fehlschlagen zu lassen, wenn Secrets erkannt werden:
- name: Scan for secrets
run: autonoma scan .
analyze wird aus Gründen der Abwärtskompatibilität beibehalten. Migrieren Sie zu scan oder fix.
# Entspricht 'autonoma scan'
autonoma analyze src/ --detect-only
# Entspricht 'autonoma fix'
autonoma analyze src/ --auto-fix
API_KEY = "secret"class Config: PASS = "secret"connect(password="secret")A = B = "secret") oder Tupel-Entpackung..env.example oder Umgebungsvertrag gefunden wird.Abgelehnte Fälle werden im JSON-Output gemeldet und verursachen Non-Zero-Exit-Codes in CI. Die Datei wird niemals modifiziert, wenn ein darin enthaltenes Problem abgelehnt wird.
<datei>.bak erstellt.SEC002 kombiniert derzeit Credential-Wert-Muster mit keyword-konditionierter Routing-Logik. Credentials, die sehr untypischen Variablennamen zugewiesen sind, werden möglicherweise nicht erkannt.
Autonoma vermeidet bewusst eine breite, nur auf Entropie basierende Secret-Erkennung, sofern die Präzisionsauswirkung nicht anhand eines gekennzeichneten False-Positive-Korpus gemessen werden kann.
autonoma scan gibt einen detect-only-Bericht an stdout aus:
{
"schema_version": "1.0",
"tool_name": "autonoma",
"tool_version": "0.1.5",
"generated_at": "2026-03-24T12:00:00Z",
"mode": "detect-only",
"summary": {
"files_processed": 3,
"total_findings": 2,
"safe_to_fix": 1,
"refused": 1
},
"findings": [
{
"file": "settings.py",
"line": 4,
"pattern_type": "api_key",
"severity": "high",
"rule_id": "SEC002",
"safe_to_fix": true,
"suggested_env_var": "SENDGRID_API_KEY",
"refusal_reason": null,
"fingerprint": "sha256:abc123..."
}
]
}
MIT-Lizenz
| Muster | Beispiel | Verhalten | Grund |
|---|
| Einfache Zuweisung | api_key = "sk-abc123" | Behoben | Deterministische AST-Umschreibung |
| Klassenattribut | class C: SECRET = "abc" | Behoben | Deterministische AST-Umschreibung |
| Keyword-Argument | connect(password="abc") | Behoben | Deterministische AST-Umschreibung |
| f-string | key = f"prefix_{v}" | Abgelehnt | Umschreibung würde Laufzeitverhalten ändern |
| Verkettung | key = "sk-" + suffix | Abgelehnt | Umschreibung würde Laufzeitverhalten ändern |
| Dict/Verschachtelter Wert | cfg = {"pass": "abc"} | Abgelehnt | Kein einfaches Zuweisungsziel |
| Mehrfachzuweisung | A = B = "secret" | Abgelehnt | Mehrdeutiges Ziel |
| Bereits sicher | key = os.getenv("KEY") | Übersprungen | Keine Änderung erforderlich |
Fehlendes .env.example | beliebiges Muster | Abgelehnt | Kein Umgebungsvertrag zur Ableitung des Variablennamens |