flawopen.com/AI Security/plugin4shell-ai-agent-plugin-sha-pin-bypass
Plugin4Shell: Umgehung des SHA-Pins
Vier KI-Agenten-Installer fixierten die Git-Revision, prüften aber den ausgecheckten Commit nicht. Plugin4Shell zeigt die Lücke; SHA prüfen.[1]
Eine Bibliothek reserviert eine bestimmte Buchausgabe über ihre eindeutige Katalognummer. Die Angestellte fragt diese Nummer ab, nimmt aber ein anderes Buch an, wenn ein Regalaufkleber denselben Text trägt. Der SHA-Pin ist die Katalognummer; der Installer muss den tatsächlich ausgecheckten Commit prüfen, bevor er dem Plugin vertraut oder es startet.[1]
Kernkonzepte & Begriffe
Commit-SHA- Ein Hash, der ein bestimmtes Git-Commit-Objekt identifiziert. Ein sicheres Pinning-Verfahren vergleicht den aufgelösten Checkout mit diesem Wert.[1], [2]
Git-Ref-Mehrdeutigkeit- Git akzeptiert Objekt-IDs und Namen wie Branches als Revisionsausdrücke. Unter bestimmten Bedingungen kann ein Name, der wie eine Commit-ID aussieht, als Ref aufgelöst werden.[1]
Plugin-Marktplatz- Ein Katalog, der Agent-Erweiterungen verteilt und einen geprüften Stand speichern kann. Der installierende Client muss den Pin trotzdem durchsetzen.[1]
CWE-345- Unzureichende Prüfung der Datenauthentizität: Ein System verwendet Daten, ohne ausreichend zu prüfen, ob sie dem erwarteten authentischen Wert entsprechen.[5]
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-345
Schritt-für-Schritt Angriffsablauf
Der Marktplatz speichert einen geprüften Commit
Ein Plugin-Eintrag verweist auf ein Repository und eine konkrete Commit-SHA, die der Installer verwenden soll.[1]
Der Repository-Kontrolleur kann Refs ändern
AIR Security berichtet, dass ein Repository-Kontrolleur auf Hosts, die solche Namen erlauben, einen Standard-Branch mit dem Namen der angeforderten SHA anlegen kann. Für Gemini CLI beschreibt die Meldung zusätzlich einen separaten FETCH_HEAD-Auflösungspfad.[1]
Quellcode: Verwundbar vs. Sicher
Der anfällige Pfad setzte eine erfolgreiche Namensauflösung mit dem Nachweis der Objektidentität gleich. Der Patch vergleicht das resultierende HEAD mit dem Marketplace-Pin und verweigert einen anderen Commit. Dieses Codepaar zeigt die Codex-Korrektur; die anderen Produkte hatten eigene Installer und dürfen nicht als identisch gepatcht gelten.[2], [6]
// Zustand vor der Korrektur aus OpenAI Codex PR #34644
if let Some(target) = sha.or(ref_name) {
run_git(&["checkout", target], Some(destination))?;
}
// Ein erfolgreicher Checkout galt als Beweis für eine passende SHA.
// Codex-Korrektur: aufgelösten Commit prüfen, nicht nur das angeforderte Argument
if let Some(sha) = sha {
run_git(&["checkout", sha], Some(destination))?;
let checked_out_sha =
run_git_output(&["rev-parse", "HEAD"], Some(destination))?;
if !checked_out_sha.eq_ignore_ascii_case(sha) {
return Err(format!(
"checked out Git SHA {checked_out_sha} does not match requested SHA {sha}"
));
}
} else if let Some(ref_name) = ref_name {
run_git(&["checkout", ref_name], Some(destination))?;
}
Checkliste für Engineering & Systemsicherheit
- ✓Löse nach jedem per SHA fixierten Checkout den ausgecheckten Commit auf (zum Beispiel mit <code>git rev-parse HEAD</code>) und vergleiche ihn exakt mit dem angeforderten Pin, bevor Plugin-Dateien geladen werden.[2], [6]
- ✓Umsetzungsempfehlung von FlawOpen: Brich bei Abweichung, fehlendem HEAD, Befehlsfehler oder unerwartetem Revisionsformat sicher ab; verwende keinen Branch-Namen als Rückfalllösung.[2]
- ✓Teste den Installer mit einem temporären lokalen Repository, dessen Standard-Branch mit der SHA eines anderen Commits kollidiert; die Installation muss abgelehnt werden und darf keinen Plugin-Code laden.[6]
- ✓Umsetzungsempfehlung von FlawOpen: Trenne Ref-Namen und unveränderliche SHA-Pins in Typen und Kontrollfluss; speichere den verifizierten Commit in den Installationsmetadaten.[1]
- ✓Erfasse betroffene Agent-Versionen und Git-Hosts der Marktplätze. GitHub sperrt SHA-förmige Branch-Namen; diese hosteigene Regel schützt jedoch weder andere unterstützte Hosts noch den für Gemini gemeldeten FETCH_HEAD-Pfad.[1], [4]
- ✓Die zitierte AIR-Offenlegung nennt Codex 0.146.0 und Claude Code 2.1.179 als korrigierte Versionen, aber keine vollständigen Bereiche betroffener Versionen. Prüfe aktuelle Herstellerhinweise, bevor du den Status oder Maßnahmen für Copilot und Gemini CLI empfiehlst.[1], [3], [7]
- ✓Behalten Sie Codex’ Regressionstest
materialize_git_source_rejects_sha_that_resolves_to_hostile_default_branchbei. Er erstellt ein temporäres lokales Repository und prüft, dass ein abweichender HEAD vor der Materialisierung des Plugin-Quelltexts abgelehnt wird.[6]
Quellen
- AIR Security: Plugin4Shell-Offenlegung und koordinierter Herstellerstatus
- OpenAI-Codex-PR #34644: Git-Plugin-Checkouts anhand der SHA verifizieren
- OpenAI-Codex-Version 0.146.0
- The Hacker News: unabhängige Berichterstattung und Host-Einschränkungen
- MITRE CWE-345: Unzureichende Prüfung der Datenauthentizität
- Codex regression test: reject SHA resolving to hostile default branch
- Anthropic Claude Code Version 2.1.179