Le désormais tristement célèbre ver Conficker n'en finit pas de sortir de nouveaux tours de son chapeau, non pas qu'il se mette à jour via les noms de domaine qu'il génère, mais parce que son étude par reverse engineering révèle à chaque fois de nouvelles astuces.
L'ISC a déjà posté deux billets indiquant entre autres la capacité du ver à corriger en mémoire la vulnérabilité MS08-067 par laquelle il se propage, mais aussi que celui-ci implémente un équivalent de la Red Pill de Joanna Rutkowska pour détecter une éventuelle machine virtuelle et s'endormir pour un long moment.

Voyons de notre côté quelques nouveautés à propos de Conficker.
Tout d'abord, si vous avez toujours dans votre parc des machines sous Windows NT 4.0, le ver n'en a que faire, il ne s'intéressera qu'aux versions de Windows supérieures ou égales à 5 :

Les dinosaures sont donc saufs, pour cette fois :-)

Deuxième point : comment Conficker s'occupe de supprimer la limite de 10 connexions TCP par seconde introduite par Microsoft pour justement empêcher une propagation trop rapide de vers. Certains éditeurs antivirus nous ont mis en garde sur l'action du virus qui consiste à modifier la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ TcpNumConnections à la valeur 0xfffffe. Toutefois, cette clé de registre ne sera pas créée sur un système sur lequel elle n'existe pas, mais si elle est présente, elle sera modifiée uniquement si sa valeur diffère de 0xfffffe : De plus, ce contrôle sur la clé de registre ne sera effectué que sous Windows 2000 et sous Windows XP, sous réserve que le Service Pack soit inférieur à 2, comme nous le montre le contrôle suivant : Les autres versions auront droit à un traitement un peu plus intéressant.

Chargement d'un pilote

Pour les versions 5.1 supérieures à SP2, 5.2 et 6.0, une nouvelle fonction est appelée, après que le processus ait acquis les privilèges SeLoadDriverPrivilege. Dans celle-ci, un nouveau contrôle de la version de l'OS est effectué afin d'écarter les versions 5.2 (Windows 2003) sans Service Pack. Dans le cas où la version est correcte, le ver va alors ouvrir le pilote tcpip.sys à la recherche de certains patterns. Dans le cas de Windows XP, il s'agit de la suite d'octets FF D6 C7 05, suivi de la valeur 0A (correspondant à 10 en décimal, le nombre de connexions simultanées autorisées par seconde). Cette suite d'octet correspond à la partie suivante du pilote, chargée d'affecter la valeur 0A à une variable qui est ensuite utilisée pour voir si de nouvelles connexions peuvent être initiées : Dans le cas de Vista, c'est directement le bloc effectuant la comparaison qui est recherché : Si ces valeurs sont trouvées dans le pilote, Conficker va alors remplir une structure de 3 DWORDs, avec les valeurs suivantes :

  • l'offset de la valeur à modifier dans le pilote (la valeur 0A pour XP, l'offset du saut conditionnel JA pour Vista)
  • la valeur actuelle à cet offset
  • la nouvelle valeur à y affecter (0x1000000 pour XP, 0 pour Vista (correspondant donc à un saut vers la prochaine instruction, ce qui revient ici à NOPer le saut))

tel que l'on peut le voir ici : Un pilote basique est ensuite déposé dans %SystemRoot%. Celui-ci est lancé en tant que service, puis le fichier est supprimé du disque. S'en suit alors l'envoi d'une IOCTL appelant la fonction 0x800 du pilote malveillant en lui passant en argument la structure précédemment remplie : Le ver continue ensuite en terminant puis supprimant le service. Propre et efficace, le pilote ne reste sur la machine que quelques courts instants ! Du côté du pilote, celui-ci récupère l'adresse de base du pilote tcpip.sys, vérifie que la valeur à l'offset fournit en argument correspond bien à la valeur attendue, puis y affecte la nouvelle valeur directement en mémoire. Le pilote est ainsi directement modifié en mémoire, sans laisser de trace sur le disque.

A bientôt pour de nouvelles aventures Confickeresques !