Microsoft a donc publié le correctif tant attendu pour la vulnérabilité LNK lundi dernier. Observons la façon dont Microsoft l'a corrigée, par analyse différentielle de la bibliothèque shell32.dll pour Windows XP SP3.

Plusieurs nouvelles fonctions ont été ajoutées à la version corrigée de la DLL ; sachant que la vulnérabilité est liée à la gestion des raccourcis vers des éléments du panneau de configuration (CPL), la nouvelle fonction CControlPanelFolder:: _IsRegisteredCPLApplet() attire immédiatement notre attention. Or, il se trouve que la fonction CControlPanelFolder:GetUIObjectOf() a été modifiée pour se voir ajouter un nouveau bloc appelant cette fonction :

En bas de la capture, on note un appel à la fonction _ControlExtractIcon_CreateInstance(), chargée d'extraire l'icône, qui ne sera donc réalisé que si le code de retour de _IsRegisteredCPLApplet() est non-nul.

Si l'on regarde de plus près _IsRegisteredCPLApplet(), on observe qu'après avoir récupéré la listes des éléments du panneau de configuration enregistrés grâce à CPLD_GetModules(), la fonction itère sur ces éléments grâce à DSA_GetItemPtr() jusqu'à ce qu'une correspondance avec la DLL pointée par le raccourci soit trouvée par CompareString() (valeur de retour 2, soit CSTR_EQUAL, auquel cas la fonction _IsRegisteredCPLApplet() retourne 1), ou qu'il n'y ait plus d'éléments avec qui comparer (auquel cas elle retourne 0) :

Si l'on crée par exemple un raccourci CPL pointant vers C:\Windows\system32\zuaucpl.dll (au lieu du légitime wuaucpl.dll), on remarque bien que Windows compare le nom de notre DLL malveillante à la liste des éléments du panneau de configuration enregistrées :

Windows n'autorisera ainsi que les CPL légitimement enregistrés à être chargés lors de la récupération de l'icône.

Cette mise à jour ajoute également le support de la valeur de registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\IsAutorunForCDROMOnly (sans pour autant la créer par défaut), permettant de désactiver l'AutoRun sur tous les supports à l'exception des CD et des DVD. Cette désactivation est le cas par défaut à partir de Windows 7 et Microsoft proposait jusqu'à présent le KB971029 pour l'appliquer aux versions antérieures de Windows.

On trouve en effet un appel à une nouvelle fonction _IsAutorunForCDROMOnly() en tête des fonctions CMountPoint::_ProcessAutoRunFile() et CContentTypeData::Init() :

En bas de fonction CContentTypeData::Init(), un nouveau test a été ajouté afin d'appeler ou non AddRemovableOrFixedDiskAutorunINFHandler(), en fonction du retour de _IsAutorunForCDROMOnly() (dans le cas de CMountPoint::_ProcessAutoRunFile(), il y a plusieurs vérifications au fil du code) :

La fonction _IsAutorunForCDROMOnly() récupère simplement la valeur depuis le registre :

Plus curieux, cette mise à jour modifie plusieurs fonctions (InitializeFormatDlg(), BeginFormat() et FileSysChange()) pour ajouter "exFAT" à la boîte de dialogue du formatage de disque :

Problème : seule la boîte de dialogue a été modifiée ; les pilotes exFAT ne sont pas présents et le formatage ne sera donc pas possible en l'état... Le support de exFAT nécessite l'application d'une mise à jour distincte sous la forme du KB955704 qui comprend d'autres fichiers que shell32.dll.

En plus du correctif, cette nouvelle version de shell32.dll comprend donc deux mises à jour fonctionnelles (support pour la valeur permettant la désactivation complète de l'AutoRun hors CD et DVD, ainsi que support partiel du formatage exFAT), ce qui n'est, à notre connaissance, documenté nulle part (en dehors du fait que des mises à jour de shell32.dll ont été effectuées dans des KB publiés précédemment).