web-dev-qa-db-fra.com

Conséquences de la modification / etc / ssh / moduli

Quelles sont les conséquences si un attaquant est en mesure de modifier le /etc/ssh/moduli fichier?

32
vergoglio

Le /etc/ssh/moduli Contient des paramètres de groupe pré-générés pour Diffie-Hellman . Un échange de clé DH se produit dans les premières étapes de la connexion SSH et génère la clé partagée secrète qui sera utilisée pour crypter les données. DH fonctionne dans un groupe donné ; techniquement, un module p (un grand entier premier) et un générateur g: le générateur est dans le 1..p-1 range, et il doit être tel que son ordre soit un multiple d'un nombre premier "assez grand" q. L'ordre k est le plus petit entier non nul tel que pk = 1 mod p. Le logarithme discret , et donc DH, peut être brisé avec un effort qui dépend à la fois p et du plus grand facteur premier de k (que nous appellerons q):

  • Il existe une variante du tamis à champ numérique qui casse le logarithme discret si p n'est pas assez grand; l'enregistrement actuel concerne un nombre premier de 530 bits et il est supposé que les nombres premiers de 1024 bits sont toujours sûrs [ Ed. Plus maintenant, consultez divers articles de blog sur Diffie-Hellman datés du 15/10/2015.], et les nombres premiers à 2048 bits seront sûrs dans un avenir prévisible.

  • Les algorithmes génériques de logarithme discret s'appliquent avec un coût proportionnel à la racine carrée du plus grand facteur premier de k; il est donc important (et suffisant) que k admette un facteur premier d'au moins 200 bits si la "sécurité 100 bits" doit être atteinte.

Un attaquant qui peut modifier /etc/ssh/moduli Pourrait essayer de remplacer les paramètres du groupe Nice DH par d'autres paramètres de groupe qui ça va bien mais rendre le DH-break plus facile (ou même facile) pour lui. Il existe principalement deux façons de procéder:

  1. Choisissez un premier p et un générateur g tel que l'ordre k de g = est un produit uniquement de petits entiers premiers. Cela peut facilement être fait; par exemple, commencez par générer un tas de petits nombres premiers (disons 80 bits chacun au maximum); puis essayez des produits aléatoires de tels nombres premiers: pour chaque produit r, calculez p = 2r + 1 et voyez si cela donne un nombre premier. Si c'est le cas, alors p est tel que any générateur g modulo ce premier impliquera un Diffie-Hellman faible.

  2. Générez un nombre premier spécial p tel que NFS est plus rapide pour ce p spécifique. Voir cet article pour des informations théoriques.

Le fichier /etc/ssh/moduli Ne contient pas l'ordre du générateur suggéré, vous ne pouvez donc pas simplement vérifier si cet ordre est premier et correspond à g. Cependant, vous pouvez prendre p-1 et appliquer la méthode de factorisation courbe elliptique : cela trouvera tous les petits facteurs premiers dans p-1, et permet ainsi de vérifier que l'ordre de g n'a pas été affaibli ( k est nécessairement un diviseur ou p-1). Ainsi, un affaiblissement du premier type peut être détecté (mais pas en quelques secondes). En conséquence, les attaquants qui n'aiment pas le risque d'exposition (en particulier les agences d'espionnage) s'abstiendront d'utiliser cette méthode.

Le deuxième type d'affaiblissement est cependant difficile à détecter. Il faut donc supposer que un attaquant qui pourrait en quelque sorte corrompre votre fichier /etc/ssh/moduli (par exemple en modifiant le fichier tel qu'il est distribué avec OpenSSH , à travers une corruption de développeurs OpenSSH) pourrait, potentiellement, ont introduit une porte dérobée lui permettant de décrypter vos connexions SSH à will (connexions SSH à votre serveur, car les paramètres de groupe sont choisis par le serveur). Puisque les mathématiques impliquées ne sont pas simples, cet attaquant serait, au moins, un attaquant compétent.

La seule bonne contre-mesure est de remplacer le contenu de /etc/ssh/moduli Par des valeurs que vous savez pour être correct et non malicieux, du fait de les avoir générés vous-même. ssh-keygen Peut le faire (voir la page de manuel ). Vous pouvez également le faire avec du code personnalisé (par exemple avec la classe BigInteger de Java, il s'agit de 50 lignes de code au maximum).

Alternativement, utilisez les paramètres de groupe DSA (ils fonctionnent également) qui ont été générés comme décrit dans l'annexe A de FIPS 186-4 : ce sont des nombres rien-up-my-sleeve parce que les valeurs candidates pour p sont obtenues par le biais d'un PRNG déterministe et entièrement spécifié, qui, vraisemblablement, ne peut pas être contraint à créer un "prime spéciale" qui rend NFS facile. Il aurait été préférable que les développeurs d'OpenSSH aient utilisé une telle méthode de génération vérifiable pour commencer.

41
Thomas Pornin