Infrastructure
GCC : GNU Compiler Collection, suite de compilateurs libre du projet GNU. « Le traducteur qui transforme le code source en programme exécutable et décide au passage de la solidité des murs », par analogie avec le maçon, dont personne ne regarde le travail tant que la maison tient debout.
Origine : Écrit à l'origine par Richard Stallman et publié en 1987 sous le nom de GNU C Compiler, il compile aujourd'hui notamment le C, le C++, le Fortran, l'Ada et le Go. Il est distribué sous licence GPL et reste le compilateur par défaut de la plupart des distributions Linux, Clang étant son principal concurrent.
Options de durcissement : Protection de pile par canari (-fstack-protector-strong), vérification renforcée de certaines fonctions de la bibliothèque C (-D_FORTIFY_SOURCE, actif seulement avec optimisation), exécutable relocalisable pour profiter pleinement de l'ASLR (Address Space Layout Randomization) avec -fPIE et -pie, relocalisations en lecture seule (-Wl,-z,relro,-z,now) et pile non exécutable (-Wl,-z,noexecstack).
Piège : Ces protections ne valent que si elles s'appliquent à tout le binaire et à ses dépendances. Un drapeau présent dans un fichier de construction peut être annulé par un autre plus loin : il faut vérifier le binaire produit, pas l'intention de celui qui l'a produit.
Homonyme : GCC désigne aussi le Conseil de coopération du Golfe (Gulf Cooperation Council), qui compile surtout des accords commerciaux.
Ce qui arrive si on s'en passe
Un programme compilé sans les options de durcissement transforme le moindre débordement de mémoire en exécution de code arbitraire : pas de canari pour détecter l'écrasement de la pile, adresses prévisibles faute de code relocalisable, table des fonctions importées réinscriptible. L'attaquant n'a plus à contourner les protections, il constate leur absence. Ces lacunes passent inaperçues tant qu'on vérifie les fichiers de construction plutôt que les binaires livrés.
Explication de la marmotte
Un compilateur traduit le code écrit par un humain en instructions que l'ordinateur peut exécuter. GCC est l'un des plus utilisés, en particulier sous Linux. Selon les options qu'on lui donne, il ajoute des protections qui rendent beaucoup plus difficile l'exploitation des erreurs de programmation. Ces protections ne coûtent presque rien, mais il faut penser à les activer et vérifier qu'elles sont bien présentes dans le programme final.
Où ce terme est utilisé
- Comment un buffer overflow écrase la pile (2 occurrences)
- Linux : définition, origine et rôle du noyau (2 occurrences)
- Vérifier une chaîne de compilation reproductible (2 occurrences)
- ASLR DEP NX canaries et CFI contre les exploits mémoire (1 occurrence)
