4.4 KiB
4.4 KiB
Umsetzungsplan: Hugging Face Hub Scanner
Zusammenfassung
Scan von öffentlichen Hugging Face Spaces, Models und Datasets nach geleakten API-Keys. AI/ML-Entwickler nutzen häufig Anthropic-Keys in ihren Projekten – besonders in Spaces (Gradio-Apps) und Notebooks.
Warum Hugging Face?
- 2M+ Models, 500k+ Datasets, 1M+ Spaces auf der Plattform
- ML/AI-Entwickler sind die Hauptnutzer von Anthropic-Keys
- Viele Anfänger hardcoden Keys in
app.py,.env, Notebooks - Hugging Face Full-Text-Suche indexiert Model Cards, Dataset Cards und
app.py-Dateien - Öffentliche REST API ohne Authentifizierung nutzbar
API-Analyse
Ansatz 1: Full-Text Search (Web-Scraping)
- URL:
https://huggingface.co/search/full-text?q=sk-ant-oat01&type=space - Indexiert: Model Cards, Dataset Cards, Spaces
app.py - Problem: Kein offizieller API-Endpoint, HTML-Scraping nötig → fragil
- Fazit: ❌ Nicht empfohlen
Ansatz 2: Hub REST API + Datei-Download ✅ (Empfohlen)
Die HF Hub API erlaubt:
- Spaces auflisten mit Suchfilter:
GET https://huggingface.co/api/spaces?search=anthropic&limit=100 - Dateien eines Repos auflisten:
GET https://huggingface.co/api/spaces/{repo_id}/tree/main - Datei-Inhalt herunterladen:
GET https://huggingface.co/spaces/{repo_id}/resolve/main/{path}
Strategie:
- Spaces die "anthropic", "claude", "sk-ant" im Namen/Description haben → Dateien scannen
- Gezielt nach
.env,app.py,*.py,config.*,.streamlit/secrets.tomlsuchen - Datei-Inhalt mit Regex auf Key-Patterns prüfen
Rate Limits
- Unauthentifiziert: ~100 Requests/Minute (geschätzt)
- Authentifiziert (HF Token): Höhere Limits
- Kein offizielles Rate-Limit-Dokument, aber großzügig
Implementierungsplan
Phase 1: Neue Scan-Methode ScanHuggingFace
private async Task<List<(string Key, string Url)>> ScanHuggingFace(CancellationToken ct)
Ablauf:
- Spaces suchen mit relevanten Keywords:
GET /api/spaces?search=anthropic&sort=modified&direction=-1&limit=100GET /api/spaces?search=claude&sort=modified&direction=-1&limit=100GET /api/spaces?search=sk-ant&sort=modified&direction=-1&limit=100GET /api/spaces?search=api+key&sort=modified&direction=-1&limit=100
- Für jeden gefundenen Space:
- Dateiliste abrufen:
GET /api/spaces/{id}/tree/main - Relevante Dateien filtern (
.env,*.py,*.yaml,*.toml,*.json,*.md,*.txt,*.ipynb) - Datei-Inhalt herunterladen und mit Regex scannen
- Dateiliste abrufen:
- Gleiche Prozedur für Models (viele haben Python-Inferenz-Scripts):
GET /api/models?search=anthropic&sort=modified&direction=-1&limit=100
- Gefundene Keys mit Source-URL zurückgeben
Phase 2: Integration in RunScan
// In RunScan(), nach Serper-Scan:
if (mode != "quick" && !string.IsNullOrWhiteSpace(_huggingFaceEnabled))
{
var hfKeys = await ScanHuggingFace(ct);
allFoundKeys.AddRange(hfKeys.Select(k => (k.Key, k.Url, "huggingface")));
}
- Mode
quick: Kein HF-Scan (zu langsam) - Mode
web: HF-Scan aktiv (gehört zu "Web"-Quellen) - Mode
full: HF-Scan aktiv
Phase 3: Config
{
"HuggingFaceToken": "hf_xxx" // Optional, erhöht Rate-Limits
}
Ein HF-Token ist nicht zwingend nötig – die API funktioniert auch ohne Auth. Mit Token aber höhere Rate-Limits und Zugriff auf gated Repos.
Scan-Targets (Dateien die gescannt werden)
| Datei-Pattern | Wahrscheinlichkeit für Keys |
|---|---|
.env, .env.* |
🔥 Sehr hoch |
app.py |
🔥 Hoch (Gradio Spaces) |
*.py |
🔥 Hoch |
*.ipynb |
🔥 Hoch (Notebooks) |
config.*, *.yaml, *.toml |
🟡 Mittel |
*.json |
🟡 Mittel |
*.md (README) |
🟡 Niedrig |
*.txt |
🟡 Niedrig |
Dateigröße-Limit: Nur Dateien < 500 KB herunterladen (keine Model-Weights etc.)
Suchbegriffe
private static readonly string[] HuggingFaceSearchTerms = {
"anthropic", "claude", "sk-ant", "api key anthropic",
"claude api", "anthropic key"
};
Aufwandsschätzung
- Implementierung: ~200 Zeilen Code (neue Methode + Config)
- Komplexität: Niedrig (einfache REST API, kein Auth nötig)
- Erwarteter Ertrag: Mittel-Hoch (AI/ML-Entwickler = Hauptnutzer von Anthropic)
Risiken
- Kein offizielles Rate-Limit-Dokument → könnte throttlen
- Spaces die nur im Runtime env-Vars setzen → Keys nicht in Dateien sichtbar
- Große Repos mit vielen Dateien → Timeout-Gefahr → Max 50 Dateien pro Repo scannen