web-dev-qa-db-fra.com

Les balises git signées sont-elles sûres? Aussi sûr que SHA-1 ou plus sûr?

Les balises git signées sont-elles sûres? Surtout parce que git utilise SHA-1. Il y a des informations contradictoires autour.

Donc, si l'on vérifie une balise git (git tag -v tagname), puis checksouts la balise et vérifie que git status ne signale aucun fichier non suivi/modifié, sans autre vérification manuelle du code, est-ce réellement sécurisé? Est-il aussi sûr que SHA-1?

Supposons un adversaire capable de produire des collisions SHA-1.

Linus Torvalds a dit .

Git utilise SHA-1 pas pour la sécurité

Et continue.

Les pièces de sécurité sont ailleurs

Peux tu développer ta pensée à ce propos? Où sont les pièces de sécurité? Pouvez-vous expliquer brièvement comment cela fonctionne? Où puis-je en savoir plus à ce sujet?

Wikipedia dit.

Néanmoins, sans une seconde résistance à la pré-image des validations et des balises signées SHA-1 ne sécuriseraient plus l'état du référentiel car ils ne signent que la racine d'un arbre Merkle.

( résistance à la pré-image | Arbre Merkle )

Ce qui contredit ce que Linus Torvalds a dit. Qu'est-ce que cela signifie pour la sécurité? Quelle affirmation est vraie?

Sources:

Le système de gestion du contrôle des sources Git utilise SHA-1 non pas pour la sécurité mais pour garantir que les données n'ont pas changé en raison d'une corruption accidentelle. Linus Torvalds a dit: "Si vous avez une corruption de disque, si vous avez une corruption de DRAM, si vous avez des problèmes, Git les remarquera. Ce n'est pas une question de savoir si, c'est une garantie. Vous pouvez avoir des gens qui essaient être malicieux. Ils ne réussiront pas. [...] Personne n'a été en mesure de briser SHA-1, mais le fait est que le SHA-1, en ce qui concerne Git, n'est même pas un élément de sécurité. purement une vérification de cohérence. Les parties de sécurité sont ailleurs, donc beaucoup de gens supposent que puisque Git utilise SHA-1 et SHA-1 est utilisé pour des choses sécurisées cryptographiquement, ils pensent que, OK, c'est une énorme fonctionnalité de sécurité. Il n'a rien tout ce qui concerne la sécurité, c'est juste le meilleur hachage que vous pouvez obtenir. [...] Je vous garantis, si vous mettez vos données dans Git, vous pouvez faire confiance au fait que cinq ans plus tard, après leur conversion à partir de votre disque dur disque sur DVD à n'importe quelle nouvelle technologie et vous l'avez copiée, cinq ans plus tard, vous pouvez vérifier que les données que vous récupérez sont exactement les mêmes données que vous avez saisies. [...] One o f la raison pour laquelle je me soucie est pour le noyau, nous avons eu une intrusion sur l'un des sites BitKeeper où les gens ont essayé de corrompre les référentiels de code source du noyau. "

Mise à jour:
J'ai obtenu une réponse détaillée de Mike Gerwitz, l'auteur de ne histoire d'horreur Git: l'intégrité du référentiel avec des commits signés :

https://forums.whonix.org/t/security-git-general-verification-verifying-whonix-submodules/513/12

41
adrelanos

Il n'y a aucune contradiction. Linus lui-même dit dans ce même discours :

Si j'ai ces 20 octets, je peux télécharger un dépôt git à partir d'une source complètement non fiable et je peux garantir qu'ils n'y ont rien fait de mal.

J'interpréterais le "Git utilise SHA-1 pas pour la sécurité" comme "SHA-1 n'a pas été ajouté à git pour des raisons de sécurité, mais pour des raisons de fiabilité, mais la sécurité est toujours un effet secondaire sympa ", et" Les éléments de sécurité sont ailleurs "car" la vérification finale est effectuée par gpg, et git verify-tag ".

Les identifiants de validation Git ne sont pas "plus sûrs" que SHA-1 "nu". Cependant, les cas d'utilisation git sont utilisés sont plus résistants aux attaques par collision que la plupart des autres cas d'utilisation SHA-1.

Par exemple, SHA-1 dans les certificats est dangereux. Quelqu'un pourrait créer deux certificats avec le même hachage et pour des noms de domaine différents. L'un (le "légitime") est envoyé dans un CSR à une CA, et l'autre gardé secret jusqu'à ce qu'il soit utilisé sur une victime avec la signature de la CA. Pour les attaques par collision, si l'attaquant modifie la pré-image à une partie (comme le champ de nom de domaine du certificat), il doit également la modifier à une autre position. Alors que l'attaquant avait le libre choix pour les deux noms de domaine, les autres changements sont pour la plupart fixes. En particulier, ils sont binaires et ne peuvent faire partie d'aucune partie lisible par l'homme du certificat. Certaines attaques les cachent dans les clés publiques/privées du cert ( discussion pour MD5 ).

Cependant, Git est principalement utilisé pour le code source. Masquer votre collision {prefixe-choisi} dans un ASCII examiné par les humains est beaucoup plus difficile. Les responsables posent généralement des questions lorsque vous effectuez une condition if sur l'adresse hexadécimale 2ff5e du fichier logo.png vous avez ajouté dans le commit. Dans l'ensemble, il est plus facile de cacher une porte dérobée dans un commit que d'attaquer SHA-1.

22
user10008

La balise git signée est juste une somme de contrôle SHA1 signée. Très simplement, chaque commit git est la somme de contrôle SHA1 du commit précédent (qui contient également SHA1 de son commit précédent qui contient également le checksum SHA1 de son commit précédent et ainsi de suite ...).

Si vous trouvez un moyen, comment changer quelque chose dans un référentiel, en gardant le SHA1 inchangé (vous trouvez une collision), alors vous pouvez casser la signature.

Gardez à l'esprit que git est distribué VCS. Habituellement, il y a beaucoup de gens qui ont leurs propres clones. Il serait rapidement repéré en cas de problème.

En outre, il existe une grande différence entre trouver une collision et trouver une collision particulière. Par exemple, il est facile de trouver 2 données différentes "aléatoires" avec la même somme MD5. Mais AFAIK, comment changer légèrement les données données et garder MD5 inchangé est toujours un problème difficile et SHA1 est beaucoup plus fort que MD5.

Néanmoins, si quelqu'un réussissait à trouver un moyen de trouver facilement les collisions SHA1, alors git aurait un problème beaucoup plus important. Git utilise SHA1 comme chaque index d'objet. Si vous essayez de valider un objet entré en collision avec SHA1, vous rompriez probablement (... je ne suis pas sûr ...) au moins la validation.

7
smrt28

Ce qui suit est ma compréhension.

Git identifie à peu près tout par les hachages sha1. Votre balise signée fait référence au commit par son hachage sha1, le commit identifie l '"arbre" par son hachage sha1 et "l'arbre" fait référence au fichier "blobs" par leurs hachages sha1.

Donc, si vous avez deux fichiers qui sont représentés par des "blobs" avec le même hachage sha1, vous pouvez alors remplacer l'un par l'autre et la balise signée sera toujours très bien validée.

Le hachage git des objets ajoute un en-tête au type et à la taille, cela signifie que les collisions utilisées pour attaquer git doivent être préparées spécifiquement pour attaquer git mais ne présentent pas de problèmes réels au-delà.

Pratiquement, je pense que le risque dépend fortement de ce que vous gardez dans vos dépôts git. Nous n'avons pas d'attaque de pré-image pour SHA1 et il est peu probable que nous en ayons bientôt. Nous n'avons donc qu'à nous soucier des attaques par collision.

S'il s'agit d'un code source lisible par l'homme revu par des évaluateurs humains, le risque est faible. Si quelqu'un peut glisser un bloc de déchets binaires inexpliqués et un conditionnel qui fait du mal en fonction du contenu de ce bloc de déchets binaires, il peut probablement glisser des choses malveillantes sans avoir à se soucier des collisions sha1.

OTOH s'il est utilisé pour stocker des fichiers binaires provenant de sources non fiables, il y a plus de risques de problèmes.


"il est peu probable que nous ayons bientôt" - hmm. "Les attaques ne font que s'améliorer".

Les attaques de pré-image sont beaucoup plus difficiles que les attaques par collision. Une décennie après la démonstration des premières collisions pour MD5, nous n'avons toujours pas d'attaque de pré-image réalisable.

Je serais plus inquiet à propos de deux commits qui contiennent "jpeg + innocent code" et "jpeg + evil code"

La complication est due à la façon dont git commits sont structurés les données jpeg et le code devrait être dans le même fichier. Je suppose que cela pourrait être un problème si les gens stockent des tarballs dans leur dépôt git ou quelque chose comme ça.

Un autre scénario possible serait si un code décidait quoi faire avec un fichier basé sur la détection automatique du type de fichier. Si une collision avec un "préfixe choisi distinct" devient pratique, alors quelqu'un pourrait commettre un fichier binaire d'aspect inoffensif (une image ou plus) qui contenait un tas d'ordures quelque part. Remplacez-le ensuite par un fichier plus dangereux.

Pour comparer avec md5, il a fallu environ 2 ans pour passer des collisions de base à des collisions de préfixes choisis.

0
Peter Green