Fig. 1. Contusion, mais pas cassĂ©. La calculatrice Windows, dont le code a Ă©tĂ© rĂ©cemment publiĂ© sur Github , s'est avĂ©rĂ©e ĂȘtre l'une des deux applications testĂ©es qui ne se bloquaient pas et ne tombaient pas en opposition avec le flou des messages de fenĂȘtre dĂ©veloppĂ© en 2000. Taille de fenĂȘtre spĂ©cialement agrandie pour afficher les artefacts de fuzzingIl est temps pour la deuxiĂšme partie de nos efforts de tester les anciennes techniques de fuzzing sur les systĂšmes modernes. Si vous avez ratĂ©, voici la
premiÚre partie . Cette fois, nous allons essayer les techniques de fuzzing de Windows 10 de l'article «Investigation empirique de la fiabilité des applications Windows NT à l'aide de tests aléatoires» (alias «NT Fuzzing Report») par Justin Forrester et Barton Miller, publié en 2000.
Les chercheurs ont testĂ© 33 applications de Windows NT et une version antĂ©rieure de Windows 2000 pour la sensibilitĂ© aux messages de fenĂȘtre dĂ©formĂ©s et aux Ă©vĂ©nements alĂ©atoires de la souris et du clavier. Depuis que le Dr Miller a publiĂ© le code flou, nous avons utilisĂ©
exactement les mĂȘmes outils que les auteurs originaux pour rechercher des bogues dans les applications Windows modernes.
Les rĂ©sultats sont presque identiques: il y a 19 ans, 100% des applications testĂ©es se sont Ă©crasĂ©es ou se sont Ă©crasĂ©es lorsqu'elles ont rencontrĂ© des messages de fenĂȘtre dĂ©formĂ©s. Aujourd'hui, le mĂȘme fuzzer a abandonnĂ© ou suspendu 93% des applications testĂ©es. Seuls deux se tenaient, dont notre vieil ami
Calculatrice (Fig. 1). Nous avons également trouvé un bogue (mais pas un problÚme de sécurité) sur Windows.
Une brĂšve introduction Ă Windows
Alors, quels sont les messages de fenĂȘtre et pourquoi provoquent-ils le plantage d'un programme?
Les applications Windows GUI sont pilotées par les événements: mouvements de la souris, pressions sur les boutons, frappes de touches, etc. Une application pilotée par les événements ne fera rien tant qu'elle ne recevra pas un événement. Une fois qu'un événement est reçu, l'application exécute l'action en fonction de l'événement, puis attend d'autres événements. Cela vous semble familier? Cette architecture
a reçu une seconde vie sur des plateformes telles que node.js.Les messages de fenĂȘtre sont une mĂ©thode de notification d'Ă©vĂ©nements Windows . Chacun d'eux a un
code numérique associé à un événement spécifique . Chaque message a un ou plusieurs paramÚtres, qui
par convention sont appelĂ©s lParam et wParam . Ils dĂ©finissent des informations plus dĂ©taillĂ©es sur l'Ă©vĂ©nement. Des exemples de telles informations sont les coordonnĂ©es du mouvement de la souris, la touche enfoncĂ©e ou le texte Ă afficher dans la fenĂȘtre. Ces messages peuvent ĂȘtre envoyĂ©s par le programme lui-mĂȘme, le systĂšme d'exploitation ou d'autres programmes. Ils peuvent arriver Ă tout moment et dans n'importe quel ordre et doivent ĂȘtre traitĂ©s par la demande cĂŽtĂ© rĂ©ception.
Conséquences pour la sécurité
Avant Windows Vista, un processus à faible privilÚge pouvait envoyer un message à un processus à privilÚge élevé. En utilisant la bonne combinaison de messages, vous pouvez exécuter du code dans ce processus. Sous Vista, ces
«attaques subversives» étaient largement protégées par
UIPI et en isolant les services systĂšme dans une session distincte.
Un traitement incorrect des messages de fenĂȘtre est peu susceptible d'affecter la sĂ©curitĂ© des systĂšmes Windows modernes pour deux raisons. Tout d'abord, les messages de fenĂȘtre ne peuvent pas ĂȘtre envoyĂ©s sur le rĂ©seau. DeuxiĂšmement, planter une application ou exĂ©cuter du code au mĂȘme niveau de privilĂšge n'est pas trĂšs utile pour un attaquant. C'Ă©tait probablement Ă©vident pour les auteurs du rapport de fuzzing NT. Ils ne font pas de dĂ©clarations de sĂ©curitĂ©, mais soulignent correctement que les Ă©checs dans le traitement des messages de fenĂȘtre impliquent un manque de tests rigoureux.
Dans certains domaines, l'exĂ©cution de code avec les mĂȘmes privilĂšges peut compromettre la sĂ©curitĂ©. Certaines applications combinent diverses primitives de sĂ©curitĂ© pour crĂ©er un niveau de privilĂšge artificiel qui ne se trouvait pas Ă l'origine dans le systĂšme d'exploitation. Un exemple typique est un sandbox pour le rendu dans un navigateur. Les fabricants de navigateurs sont bien conscients de ces problĂšmes et
ont pris des mesures pour les résoudre . Un autre exemple est celui des produits antivirus. Là , le panneau de contrÎle fonctionne avec des privilÚges normaux, mais est isolé des autres modules antivirus.
Méthodologie de test
Pour fuzz toutes les applications de la suite de tests, nous avons utilisĂ© le mĂȘme code de base et la mĂȘme technique de fuzzing dĂ©crits dans le rapport NT initial. En particulier, dans les modes
SendMessage et
PostMessage , fazzer a utilisé trois itérations de 500 000 messages avec 42 graines et trois itérations de 500 000 messages avec 1 337 graines. Les résultats sont apparus aprÚs avoir effectué une seule itération de chaque méthode.
Nous avons manquĂ© des entrĂ©es alĂ©atoires de souris et de clavier en raison de contraintes de temps et d'un dĂ©sir de nous concentrer uniquement sur les messages de fenĂȘtre. Nous encourageons Ă©galement ceux qui souhaitent rĂ©pĂ©ter les tests et confirmer les rĂ©sultats.
PiĂšges
Pour fuzzer dans Windows 10 a dĂ» apporter deux modifications mineures. Tout d'abord, adaptez-le pour une plate-forme 64 bits. La deuxiĂšme modification a permis Ă Fuzzer de sĂ©lectionner un descripteur de fenĂȘtre spĂ©cifique Ă l'aide de l'argument de ligne de commande. Le fuzzing d'un descripteur spĂ©cifique est une solution rapide au fuzzing des
applications de la plateforme Windows universelle (UWP) . Le programme d'origine se concentre sur le flou des fenĂȘtres appartenant Ă un certain processus, mais toutes les applications UWP affichent leur interface utilisateur via le mĂȘme processus (Fig. 2). Cela signifie que le fuzzer ne peut pas ĂȘtre dirigĂ© vers la fenĂȘtre principale de l'application UWP.
Fig. 2. Sur la plate-forme UWP, toutes les applications appartiennent Ă un seul processus ( ApplicationFrameHost.exe
). Pour fuzz ces applications, j'ai dĂ» changer le fuzzer NT d'origine et le diriger vers des poignĂ©es de fenĂȘtre spĂ©cifiquesIl y avait une faille sĂ©rieuse dans la modification floue: les valeurs choisies pour les deux principales sources d'entrĂ©e alĂ©atoire, les arguments
lParam
et
wParam
pour
SendMessage
et
PostMessage
, sont limitées à des entiers 16 bits. Les deux arguments sont 32 bits sur Windows 32 bits et 64 bits sur Windows 64 bits. Le problÚme se produit dans
Fuzz.cpp
, oĂč
lParam
et
wParam
:
wParam = (UINT) rand(); lParam = (LONG) rand();
La fonction rand () renvoie un nombre dans la plage [0, 2
16 ], ce qui limite considérablement l'ensemble des valeurs testées. Nous avons intentionnellement enregistré cette erreur lors des tests afin que les résultats soient exactement adaptés au travail d'origine.
Applications testées
Dans le rapport NT d'origine, 33 programmes ont Ă©tĂ© testĂ©s. Nous n'en avons que 28, car une seule version de chaque programme est utilisĂ©e pour les tests. L'Ă©cosystĂšme logiciel Windows a considĂ©rablement changĂ© depuis 2000, mais Ă©tonnamment, beaucoup reste inchangĂ©. La suite Microsoft Office contient les mĂȘmes programmes que dans les tests d'origine. Netscape Communicator est devenu Firefox. Adobe Acrobat a Ă©tĂ© renommĂ© Adobe Reader, mais il est toujours valide. MĂȘme Winamp a publiĂ© une nouvelle version en 2018, ce qui permet une comparaison Ă©quitable avec le rapport d'origine. Cependant, certains programmes obsolĂštes ont dĂ» ĂȘtre remplacĂ©s. Voir ci-dessous pour une liste des changements et les raisons de ces changements:
- Lecteur CD ⚠Lecteur Windows Media: la fonctionnalité du lecteur CD est incluse dans le nouveau programme.
- Eudora ⚠Windows Mail: Qualcomm s'occupe désormais des puces plutÎt que des clients de messagerie. Depuis Eudora n'existe plus, le client de messagerie Windows par défaut a été testé à la place.
- Command AntiVirus ⚠Avast Free Edition: Command AntiVirus n'est plus disponible. Il a été remplacé par Avast comme antivirus tiers le plus populaire.
- GSView ⚠Photos: GSView n'est plus pris en charge. Il a été remplacé par la visionneuse de photos Windows par défaut.
- IDE JavaWorkshop Net NetBeans: l'IDE JavaWorkshop n'est plus pris en charge. NetBeans semble ĂȘtre une bonne alternative gratuite qui correspond Ă l'esprit de ce qui doit ĂȘtre vĂ©rifiĂ©.
- Secure CRT ⚠BitVise SSH: Secure CRT existe toujours, mais un formulaire Web trÚs long est requis pour télécharger la version d'essai. BitVise SSH a proposé un démarrage rapide.
- Telnet ⚠Putty: L' application telnet existe toujours sous Windows, mais maintenant c'est une application console. Pour flouer l'interface graphique, nous l'avons remplacée par Putty, l'émulateur de terminal open source populaire pour Windows.
- Nous avons trouvé Freecell et Solitaire dans la collection Microsoft Solitaire du catalogue d'applications Windows App Store.
La version spécifique de l'application est affichée dans le tableau des résultats. Tout le fuzzing a été effectué sur Windows 10 Pro 649 version 1809 (build 17763.253).
Résultats
Comme mentionnĂ© dans le rapport d'origine, les rĂ©sultats ne doivent pas ĂȘtre considĂ©rĂ©s comme des failles de sĂ©curitĂ©, mais comme un indicateur de la fiabilitĂ© et de la qualitĂ© des logiciels.
«Enfin, nos rĂ©sultats constituent un point de dĂ©part quantitatif Ă partir duquel juger de lâamĂ©lioration relative de la fiabilitĂ© des logiciels.»
- De «l'étude empirique de la fiabilité des applications Windows NT à l'aide de tests aléatoires» par Justin Forrester et Barton Miller
Les chiffres ne sont pas particuliĂšrement encourageants, bien que la situation s'amĂ©liore. Dans le rapport NT initial, toutes les applications se sont Ă©crasĂ©es ou ont suspendu le fuzzing. Maintenant, deux programmes: la calculatrice et Avast Antivirus, ont survĂ©cu au phasage des messages de fenĂȘtre sans aucune consĂ©quence nĂ©gative. Nous fĂ©licitons les Ă©quipes d'Avast et de Windows Calculator pour leur approche des messages de fenĂȘtre erronĂ©s. L'Ă©quipe de calculatrice a gagnĂ© un respect supplĂ©mentaire pour l'ouverture du code source et la dĂ©monstration de la crĂ©ation d'une application UWP de haute qualitĂ©. Voir le tableau 1 pour tous les rĂ©sultats de fuzzing, ainsi que la version spĂ©cifique du logiciel utilisĂ©.
Tableau 1. RĂ©sultats de la lecture du fuzzing d'origine sur Windows 10. AprĂšs 19 ans, presque toutes les applications ne gĂšrent toujours pas correctement les messages de fenĂȘtre dĂ©formĂ©sBogue Windows?
Malheureusement, la curiosité a prévalu et nous avons dû faire une exception. Il semblait que plusieurs applications non liées étaient frappées par un problÚme commun. Le débogage a montré que le problÚme était lié au message
WM_DEVICECHANGE
. Lorsque le fuzzer a envoyĂ© ce message, mĂȘme l'application la plus simple s'est Ă©crasĂ©e -
HelloWorld, l'exemple officiel de l'API Windows (Fig. 3).
Fig. 3. HelloWorld.exe 32 bits se bloque lors de la rĂ©ception d'un message de fenĂȘtre de fuzzer. Cela ne devrait pas se produire, car le programme est complĂštement simple. Il est entendu que le problĂšme se situe quelque part dans WindowsAprĂšs la chute de HelloWorld, nous avons immĂ©diatement rĂ©alisĂ© que le problĂšme affectait uniquement les applications 32 bits, mais pas celles 64 bits. Un dĂ©bogage rapide a montrĂ© qu'un crash se produit dans
wow64win.dll, une couche de compatibilitĂ© des applications 32 bits pour 64 bits . Mon analyse superficielle (et peut-ĂȘtre incorrecte) du problĂšme conduit Ă la conclusion que la fonction
wow64win.dll!whcbfnINDEVICECHANGE
considĂšre wParam comme un pointeur vers la structure
DEV_BROADCAST_HANDLE64
dans le programme cible. La fonction convertit cette structure en structure
DEV_BROADCAST_HANDLE32
pour la compatibilité avec les applications 32 bits. L'échec se produit car la valeur
wParam
générée par le fuzzer indique une mémoire non valide.
Traiter
wParam
comme un pointeur local est une mauvaise idée, bien qu'il s'agisse probablement d'une décision de conception délibérée pour que les notifications de périphériques amovibles fonctionnent avec les applications Windows 32 bits héritées. Mais il est toujours faux que vous puissiez planter une autre application sans aucun problÚme. Nous avons signalé le problÚme au MSRC, bien que la frontiÚre de sécurité n'ait pas été franchie. Ils ont confirmé que l'erreur n'était pas un problÚme de sécurité. Nous espérons voir une solution à cet étrange problÚme généralement accepté dans une future version de Windows.
Conclusion
Les messages de fenĂȘtre sont sous-estimĂ©s et souvent ignorĂ©s en tant qu'entrĂ©e peu fiable dans les programmes Windows. MĂȘme 19 ans aprĂšs l'apparition du premier flou de messages de fenĂȘtres open-source, 93% des applications testĂ©es se bloquent ou se bloquent toujours au dĂ©marrage du mĂȘme programme. Mais il est encourageant que certaines applications gĂšrent gracieusement cette entrĂ©e dĂ©formĂ©e: cela signifie que certaines organisations disposent de cadres et de connaissances institutionnelles pour Ă©viter de telles erreurs.
Bien sĂ»r, le fuzzer peut ĂȘtre amĂ©liorĂ© de plusieurs façons, mais mĂȘme la mĂ©thode la plus simple a bloquĂ© 93% des applications. Peut-ĂȘtre que dans certains cas, les messages de fenĂȘtre traversent mĂȘme la vraie frontiĂšre de sĂ©curitĂ©. Si vous explorez ce domaine, nous espĂ©rons que vous partagerez les rĂ©sultats.