flawopen.com/AI Security/plugin4shell-ai-agent-plugin-sha-pin-bypass
Plugin4Shell : contournement du pin SHA
Quatre installateurs de plugins IA fixaient la révision Git sans vérifier le commit extrait. Plugin4Shell révèle le défaut : contrôlez le SHA final.[1]
Une bibliothèque réserve une édition précise d’un livre avec son numéro de catalogue unique. L’employé demande ce numéro, mais accepte un autre livre si une étiquette de rayon porte le même texte. Le pin SHA est ce numéro de catalogue ; l’installateur doit vérifier le commit réellement extrait avant de faire confiance au plugin ou de l’exécuter.[1]
Concepts Clés et Termes
Commit SHA- Empreinte qui identifie un objet commit Git précis. Un pinning sûr compare le checkout résolu à cette valeur.[1], [2]
Ambiguïté de ref Git- Git accepte des identifiants d’objet et des noms comme les branches comme expressions de révision. Dans certains cas, un nom ressemblant à un identifiant de commit peut désigner une ref.[1]
Marketplace de plugins- Catalogue qui distribue des extensions d’agent et peut enregistrer une révision vérifiée. Le client d’installation doit toujours faire respecter le pin.[1]
CWE-345- Vérification insuffisante de l’authenticité des données : le système utilise des données sans confirmer suffisamment qu’elles correspondent à la valeur attendue.[5]
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-345
Déroulement de l'Attaque Étape par Étape
Le marketplace enregistre un commit vérifié
Une entrée de plugin désigne un dépôt et un SHA de commit précis que l’installateur est censé utiliser.[1]
Le propriétaire du dépôt peut modifier les refs
AIR Security rapporte que, sur les hébergeurs qui autorisent ces noms, le contrôleur du dépôt peut créer une branche par défaut portant le même nom que le SHA demandé. Pour Gemini CLI, la recherche décrit séparément un chemin de résolution par la ref FETCH_HEAD.[1]
Code Source : Vulnérable vs Sécurisé
Le chemin vulnérable confondait la résolution réussie d’un nom avec la preuve de l’identité de l’objet. Le patch compare le HEAD obtenu au pin du marketplace et refuse un autre commit. Cette comparaison reflète le correctif Codex ; les autres produits avaient des installateurs différents et il ne faut pas leur attribuer automatiquement ce même correctif.[2], [6]
// Forme antérieure au correctif du PR #34644 d’OpenAI Codex
if let Some(target) = sha.or(ref_name) {
run_git(&["checkout", target], Some(destination))?;
}
// Un checkout réussi était considéré comme la preuve que le SHA correspondait.
// Correctif Codex : vérifier le commit résolu, pas seulement l’argument demandé
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))?;
}
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Après chaque checkout épinglé par SHA, résolvez le commit obtenu (par exemple avec <code>git rev-parse HEAD</code>) et comparez-le exactement au pin demandé avant de charger les fichiers du plugin.[2], [6]
- ✓Recommandation de mise en œuvre de FlawOpen : Échouez de manière fermée en cas d’écart, de HEAD absent, d’erreur de commande ou de format de révision inattendu ; ne retentez pas avec un nom de branche.[2]
- ✓Testez l’installateur avec un dépôt local temporaire dont la branche par défaut entre en collision avec le SHA d’un autre commit ; vérifiez que l’installation est refusée et qu’aucun code du plugin n’est chargé.[6]
- ✓Recommandation de mise en œuvre de FlawOpen : Séparez les noms de refs des pins SHA immuables dans les types et le flux de contrôle, puis consignez le commit vérifié dans les métadonnées d’installation.[1]
- ✓Inventoriez les versions d’agents concernées et les hébergeurs Git des marketplaces. GitHub bloque les branches au format SHA, mais cette règle propre à l’hébergeur ne protège pas les autres serveurs compatibles ni le chemin FETCH_HEAD signalé pour Gemini.[1], [4]
- ✓La divulgation d’AIR citée indique que Codex a été corrigé en 0.146.0 et Claude Code en 2.1.179, mais ne fournit pas de plage complète des versions concernées. Vérifiez les recommandations actuelles des éditeurs avant de conseiller sur l’état ou les mesures pour Copilot et Gemini CLI.[1], [3], [7]
- ✓Conservez le test de régression Codex
materialize_git_source_rejects_sha_that_resolves_to_hostile_default_branch; il crée un dépôt local temporaire et vérifie qu’un HEAD différent est refusé avant la matérialisation du code du plugin.[6]
Sources
- AIR Security : divulgation Plugin4Shell et statut coordonné des éditeurs
- PR OpenAI Codex #34644 : vérifier les checkouts Git de plugins par SHA
- Version OpenAI Codex 0.146.0
- The Hacker News : enquête indépendante et limites liées aux hébergeurs
- MITRE CWE-345 : vérification insuffisante de l’authenticité des données
- Codex regression test: reject SHA resolving to hostile default branch
- Version 2.1.179 d’Anthropic Claude Code