Aller au contenu

GCC : GNU Compiler Collection

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é

← Tout le glossaire