Les débordements de tampon sont importants. Rien en C n'est vérifié par plage par défaut, il est donc très facile d'écraser un tampon. Il existe une fonction de bibliothèque standard gets()
, qui ne peut pas être empêchée de déborder du tampon, et ne devrait presque jamais être utilisée.
Il existe certaines techniques au niveau de l'implémentation pour entraver l'exploitation, telles que le brouillage des blocs de tas, mais cela n'arrêtera pas les débordements de tampon dans les tampons locaux, ce qui peut souvent faire des choses intéressantes comme changer l'adresse à laquelle une fonction retournera.
Il n'y a pas de bonne solution générale en C. De nombreuses fonctions de bibliothèque ont des versions qui limiteront la quantité à écrire. bien que le calcul puisse être maladroit. Il existe des logiciels qui peuvent détecter les débordements de tampon de tas dans le test, tant que le test approprié est exécuté, et le débordement de pile apparaîtra souvent comme un crash lors des tests. À part cela, c'est une question de codage et de révision du code.
Un problème connexe est le problème de l'écriture dans un tampon trop petit d'un caractère, oubliant qu'une chaîne C de n caractères nécessite n + 1 caractères en mémoire, à cause du '\0'
terminateur. Si l'attaquant parvient à stocker une chaîne sans le terminateur, toute fonction C s'attendant à ce qu'une chaîne continue son traitement jusqu'à ce qu'elle atteigne un octet zéro, ce qui pourrait entraîner la copie ou la sortie de plus d'informations que souhaité (ou la suppression de la mémoire protégée pour une attaque DOS ). La solution, encore une fois, est la sensibilisation, le soin et les revues de code.
Il y a un autre risque avec la printf()
famille. Si vous écrivez char * str; ... printf(str);
, vous vous installez pour des problèmes si str
contient un «%» lors de l'impression. La %n
directive format permet printf()
d'écrire en mémoire. La solution est printf("%s", str);
ou puts(str);
. (Utilisez également le C99 snprintf()
au lieu de sprintf()
.)
L'utilisation d'entiers non signés, en particulier comme index de boucle, peut entraîner des problèmes. Si vous attribuez une petite valeur négative à un non signé, vous obtenez une grande valeur positive. Cela peut compromettre des choses comme le traitement uniquement de N instances de quelque chose, ou dans des fonctions limitées comme strncpy()
. Examinez tous les entiers non signés. Vous voudrez peut-être éviter unsigned short
, car une grande valeur dans l'un d'eux se convertira en une grande valeur positive dans un int
.
N'oubliez pas qu'une constante de caractère, en C, est en fait un int
. Écrire quelque chose comme char c; while((c = getchar()) != EOF) ...
peut facilement échouer, car EOF
il ne sera pas représentable dans un fichier char
.
Il y a beaucoup plus d'erreurs C caractéristiques auxquelles je peux penser, mais cela pourrait causer des problèmes de sécurité.