[Sécurité] Les images de packages sont signées (Cosign) mais jamais vérifiées au pull/install #14
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constat
La signature Cosign a été ajoutée côté push (commits
cf6ba49/ee1747e), viacommon/src/ocihandler.rs:Mais aucune vérification de signature n'est faite au moment du pull / de l'installation.
pull_image()etverify_tag_in_registry()ne font que récupérer le manifest/les layers :Le
scande jukebox et leunpack(initContainer du job d'install) téléchargent et exécutent donc le contenu du package sans valider qu'il provient bien d'une source de confiance.Pourquoi c'est un risque
La signature n'apporte aujourd'hui aucune protection à la consommation : un attaquant capable de pousser un tag dans le registre (registre compromis, MITM si un registre HTTP est utilisé, ou simple typosquatting de jukebox) sert un package non signé / signé par une autre clé, et il est installé sans broncher. Combiné au fait que l'agent tourne en cluster-admin (#13), c'est une chaîne d'approvisionnement non protégée.
Pistes
cosign verify --key <pub>(ou keyless/Fulcio selon le modèle retenu) sur le digest résolu, dans l'initContainerunpacket dans lescan. Échec de vérification ⇒ refus d'installer.push_response.manifest_url) et installer par@sha256:…, pas par tag mutable.specdeJukeBox) ou globalement dans la config opérateur, avec un modematurity/verify: required|warn|offpour migration progressive.ClientConfigd'oci_client, par défautClientProtocol::Httpsmais à confirmer/forcer).Tests
verify_signature(reference, digest, pubkey)renvoyantErrquand cosign échoue (analogue au test existantsign_image_cosign_not_found_returns_error).Une piste à explorer, pour renforcer la défense en profondeur, serait aussi de faire vérifier en plus au cluster kubernetes la signature des images des packages
Deux compléments pour garder l'issue alignée avec les évolutions en cours :
Vérification côté cluster (commentaire précédent) : pertinent en défense en profondeur (policy-controller/Kyverno
verifyImagessur les images des Jobs d'agent), mais ça ne remplace pas la vérification par vynil lui-même : le scan lit les annotations des manifests sans jamais pull l'image, et c'est lui qui alimente le catalogue. Une signature vérifiée seulement à l'admission ne protège pas le catalogue d'entrées forgées.Index statiques (sources http/s3) : si la proposition d'index statique pré-calculé avance, la chaîne de confiance doit la couvrir aussi — les fichiers d'index doivent embarquer les digests des images (épinglage tag→digest au moment du
file-scan, vérification du digest à l'unpack) et idéalement être signés eux-mêmes. Sinon l'index devient le maillon faible : il court-circuite la lecture des annotations OCI.L'épinglage par digest (piste 2 de l'issue) est le socle commun aux deux points : résoudre une fois au scan, stocker dans
box.status.packages, et installer par@sha256:….Analyse et rédaction : Claude (assistant IA), publié via le compte de Xavier.
Je vois bien que la réflexion sur le sujet est encore en maturation. Je trouves l'idée de feature intéressante, mais elle ne fonctionne que temps qu'on utilise pas le montage OCI pour les images des packages Vynil. Hors c'est dans la roadmap. en fait, c'est une feature prévu dès le début, mais qui attends que tous nos clusters soit a k8s 1.36+ pour le cabler. Tout est déjà prêt dans le code, il n'y a plus qu'a activer si le cluster est en version 1.36 ou supérieur et tous ce qu'il faut pour implémenter ce test est déjà présent.
Au final, il va falloir déléguer la vérification cosign au cluster