Rechercher
Contactez-nous Suivez-nous sur Twitter En francais English Language
 





















Abonnez-vous gratuitement à notre NEWSLETTER

Newsletter FR

Newsletter EN

Vulnérabilités

Se désabonner

Corto Gueguen, Nomios : Les nouveaux types de failles (et comment essayer de les contrer)

septembre 2014 par Corto Gueguen, Ingénieur Sécurité Réseaux, Nomios

Lorsque le langage C est sorti en 1972, le principe de la mémoire non contrôlée a très vite été mis en avant. La mémoire non contrôlée, c’est l’écriture non prévue par le programmeur de fonctions Assembleur et d’adresses mémoire à l’intérieur même du programme. Ainsi, un utilisateur peut choisir quoi écrire permettant de modifier à la volée le fonctionnement de l’exécutable pour, par exemple, modifier son comportement. C’est ce que l’on appelle un Buffer Overflow (BOF). On injecte dans la mémoire du programme des fonctions, ce qui donne lieu à l’exécution de fonctions, par exemple le lancement d’un shell, c’est-à-dire un payload (partie du code exécutable d’un virus spécifiquement destiné à nuire).

De 1972 à 2014 : l’évolution des failles

Bien qu’étant apparus dès 1972, les Buffers Overflow ont commencé à être connus à la fin des années 1990, grâce à un article écrit par Aleph One, intitulé « Smashing the stack for fun and profit ».

Presque 20 ans nous séparent de ce texte et pourtant, la renommée des Buffers Overflow ne faiblit pas. Pourtant, de nombreuses protections des systèmes d’exploitation modernes ont été mises en place : ASLR, canaries, UAC, NX/XD, etc. Les Buffers Overflow classiques ne fonctionnent plus, grâce ou à cause - selon le point de vue, depuis plusieurs années. Pourtant, les hackers sont toujours présents - ce qui siginfie que les techniques d’attaque ont évolué.

L’Address Space Layout Randomisation (ASLR) a en effet rendu plus difficile l’utilisation de BOF, car, comme son nom l’indique, les adresses mémoire sont choisies aléatoirement au démarrage du poste. Il est donc impossible de connaître l’emplacement précis d’un dépassement mémoire, cependant les hackers ont réussi à contourner cette protection de plusieurs manières, la plus simple étant d’utiliser un module n’ayant pas l’ASLR activé. De nombreux modules de ce genre existent, et leur adresse sera ainsi toujours la même.

 Le NOP sliding est une méthode d’attaque brutale qui a fait ses preuves. Dans certains cas, lorsqu’il n’est pas possible de récupérer de manière précise l’adresse de la prochaine instruction (l’EIP), il peut être utile d’utiliser cette technique. Pour ce faire, il faut remplir la mémoire avec plusieurs instructions NOP (NO OPERATION) qui n’ont aucune incidence sur le fonctionnement du programme. Ainsi, lorsque l’adresse de la prochaine instruction va être chargée par le processus, il y a de très fortes chances qu’elle corresponde à une adresse contenant un NOP. De plus, à la fin de la suite de NOP, un payload est inscrit, qui permettra d’attaquer la cible.

 Le Heap Spraying est une technique similaire au NOP sliding, qui consiste à remplir la mémoire avec des données, puis d’utiliser une faille qui fera pointer vers ces données. Le Heap Spraying, n’est en soit pas une attaque, mais permet de faciliter l’exploitation d’un Buffer Overflow.

 Une méthode d’attaque connue depuis quelques années est le Double Free, qui diffère légèrement des Buffers Overflow classiques, car le vecteur d’attaque est différent. Ici, le problème ne vient pas d’une injection directe de données en mémoire, mais de la suppression d’une variable. Lorsque la mémoire allouée à une variable est supprimée deux fois, cela créé un état dans lequel un attaquant peut potentiellement modifier les registres Assembleur, et donc modifier l’exécution du code.

L’écriture de shellcode est également de plus en plus difficile. La mémoire non exécutable bloque les Buffers Overflow classiques, puisqu’ils sont chargés en mémoire et que l’OS refuse de lancer le code en mémoire. Cependant, il existe certaines techniques pour contrer ces protections, comme le Return Oriented Programming qui, plutôt que d’injecter du code Assembleur, va simplement jouer avec les adresses de retours des fonctions. En utilisant cette méthode, aucune partie de la mémoire ne sera exécutée directement puisque le principe est simplement d’utiliser des fonctions chargées dans une partie exécutable.

Enfin, il est impossible de parler des nouveaux types d’attaques sans mentionner les Advanced Persistent Threat. Les APT ne sont pas à proprement parlé un type d’attaque, mais un mélange de différentes méthodes de piratage pour atteindre un but précis et ciblé. Un APT peut utiliser une ou plusieurs des techniques précédemment citées, mais a également pour objectif de pénétrer un système d’information à coup sûr, en étudiant longuement la cible au préalable.

Comment contrer ces attaques ?

L’histoire de la sécurité informatique nous a prouvé que pour chaque attaque, un moyen de défense est mis en place au niveau du système d’exploitation, puis une contre-attaque est trouvée. Et si jamais, une technique venait à être complètement protégée, un autre biais d’attaque serait mis en place. Il est donc virtuellement impossible de bloquer toutes les attaques. Mais, pour autant, il est indispensable de se protéger. Pour cela, il faut prendre en compte l’axe système, ainsi que l’axe réseau.

Protéger le système

Protéger un système d’exploitation est connu depuis longtemps. L’utilisation d’antivirus, même avec les défauts qu’on peut leur trouver est un premier pas. On peut également penser à une modification du noyau, afin d’ajouter des protections supplémentaires. La mise en place de Hosts IPS est également un élément important. La plus-value de ces solutions est une protection complémentaire aux antivirus. Les hIPS peuvent par exemple bloquer les rootkits - qui modifient les fonctions vitales de l’OS - ou encore restreindre certaines fonctionnalités afin de réduire le champ d’attaque.

Protéger le réseau

La sécurité réseau se fait en premier lieu par la mise en place de firewalls. Cette brique est maintenant bien comprise, et il est normal de trouver des pare feux en entreprise.

Cependant, il existe de nombreuses autres protections. Une des plus importantes est la mise en place de network IPS - à opposer aux hosts IPS - qui vont détecter les attaques par Buffer Overflow avant qu’elles n’arrivent sur le poste. Pour cela, les IPS vont utiliser non pas des signatures, mais des patterns. Par exemple, une attaque par NOP sliding contient de nombreuses fois l’instruction NOP. Ainsi, il suffit de détecter un grand nombre de NOP pour être certain qu’une attaque est en cours. Cette brique de sécurité est primordiale, car c’est la première brique applicative mise en place. Sans elle, il ne faut compter que sur les protections de base des OS.

Une autre partie importante de la sécurisation des Buffers Overflow est l’utilisation d’anti APT. Plutôt que d’essayer de détecter une faille, un anti APT va détecter un comportement, et peut ainsi bloquer toutes les failles, sans même en avoir connaissance.

Bloquer un hacker est impossible. Même les environnements les plus sécurisés au monde sont virtuellement faillibles. L’évolution des techniques d’attaque montre d’une part, l’ingéniosité de la partie attaquante et d’autre part, les limites des protections. Cependant, rendre la tâche très difficile à un hacker par le biais de quelques méthodes, permet de bloquer de nombreuses attaques, et ainsi d’éviter le pire.


Voir les articles précédents

    

Voir les articles suivants