Comment prévenir les attaques par dépassement de tampon
Étape 1
Écrivez le code de sécurité pour éviter les attaques par débordement. En C, il existe un certain nombre de fonctions de vulnérabilité que les pirates peuvent exploiter pour saturer les tampons. Réduisez au minimum votre utilisation de strcpy (), strcat (), sprintf () et vsprintf (), ce qui ne vérifie pas les limites. Si possible, évitez d’utiliser gets (), qui ne spécifie pas le nombre de caractères à lire et laisse donc votre code vulnérable. Si vous utilisez scanf (), veillez à spécifier une largeur pour le format% s afin d'éviter les débordements.
Étape 2
Vérifiez si vous pouvez utiliser des trampolines pour éviter le débordement de mémoire tampon. Étant donné que les tampons débordent dans les piles de mémoire et non dans le code, la solution la plus simple semble être d'empêcher vos piles d'exécuter du code en insérant un petit extrait de code pour interdire ces actions. C'est possible sous Linux, mais c'est très difficile. Seuls quelques compilateurs utilisent les petits morceaux de code appelés trampolines, qui servent de barrière entre le code d'appel de fonction et la fonction elle-même. Par conséquent, si le code malveillant tente de remplacer un tampon, le trampoline peut intercepter et neutraliser les tentatives des pirates.
Étape 3
Implémentez des outils de compilation pour vous avertir lorsque vous utilisez un code qui vous rend vulnérable aux attaques. Certains de ces outils génèreront du code qui empêchera les étrangers d'accéder aux adresses illégales et désactivera le code qui tente une telle exécution. Des produits comme StackShield et StackGuard sont d'une grande aide. StackSheild analysera l'adresse de retour d'une fonction et la terminera en cas d'irrégularité. StackGuard place un mot Canary dans l'adresse de l'expéditeur et vérifie si le mot a été modifié, mettant fin à une fonction quand il l'a.
Étape 4
Installez des outils tels que libsafe pour vérifier la sécurité dans un environnement dynamique au moment de l'exécution. Libsafe fonctionne sous Linux et vérifie l'adresse de retour la plus proche d'un cadre de pile, puis s'assure que l'adresse n'est pas écrasée. Libsafe remplacera également des fonctions non sécurisées, telles que gets (), strcpy () et scanf ().