Avec la LTS18.4 je découvre que ma programmation tout du moins mon makefile .... ben je dois changer en -no-pie sinon je n'ai plus d'executable ... pour j'étais déjà en 7.3 mais avec la 16.4
j'ai essayé de comprendre et fait quelques recherches mais j'ai du mal à comprendre
deux explications (mais elles ne viennent pas de moi ) mais dans ce cas on perd la notion d'executable ... ????
Parce que d’une part, tu ne spécifies à aucun moment que tu souhaites avoir un objet partagé lors de l’édition de liens (implicite), d’autre part, l’option -no-pie spécifie que ton binaire sera toujours chargé en mémoire à la même adresse de référence.
"pie" signifie Position Independent Executable. L’intérêt d’utiliser cette option est de pouvoir, à chaque exécution de ton binaire, le charger à des adresses mémoires différentes (exactement comme pour des objets partagés qui ont besoin d’être relocalisés en mémoire en permanence plutôt que de toujours être chargés à une adresse mémoire fixe, ce qui peut entraîner des problèmes de collisions si deux objets partagés doivent être chargés à la même adresse, par exemple).
L’intérêt de faire ça pour un binaire exécutable et pourquoi pas seulement pour les objets partagés ? Eh bien il s’agit d’une mesure d’atténuation (je ne sais pas comment traduire correctement "mitigation") d’attaques informatique de type Return Oriented Programming où tu vas corrompre la mémoire de ton binaire pour exécuter un code arbitraire. Et pour exécuter ce code arbitraire, tu as besoin de savoir à quels adresses mémoires chercher les bonnes informations. Et comme avec l’option PIE les adresses ne sont jamais les mêmes à chaque exécution, ça rend l’exploitation d’une vulnérabilité plus compliqué que prévu.
ou encore ....
Il semble que GCC soit configuré pour créer des binaires -pie par défaut. Ces binaires sont en réalité des bibliothèques partagées (de type ET_DYN), sauf qu'ils s'exécutent exactement comme un exécutable normal. mais ne sont pas marqué executable donc il faut soit les faire monter avec un lanceur ou dans un terminal si l'on conserve l'option -pie (perso je trouve que l'on aurait pu les marqués comme executable c'est plus simple lors de test etc... mais j'ai peut-être pas compris)
j'ai trouvé les paramètres par défaut
Linker Options
object-file-name -llibrary -nostartfiles -nodefaultlibs
-nostdlib -pie -rdynamic -s -static -static-libgcc
-static-libstdc++ -shared -shared-libgcc -symbolic -T script
-Wl,option -Xlinker option -u symbol
tout ce que j'ai compris :
c'est pour la sécurité.... mais mais mon programme n'est plus un binaire mais une lib partagé et là je butte parce que pour des applications de gestions d'entreprise qui ne concerne que des données et dont l'environnement est fermé ?????
reprendre l'ensemble des makefiles pour changer en -no-pie ouffff bref si ont pouvait m'aider je serais preneur ... et je ne suis pas partisan de changer la configuration de base.
# GCC option de compilation change avec -pie par défaut
Posté par jpllaroche (site web personnel) . En réponse à la dépêche Sortie d’Ubuntu 18.04 LTS Bionic Beaver. Évalué à 0.
bonjour ,
Avec la LTS18.4 je découvre que ma programmation tout du moins mon makefile .... ben je dois changer en -no-pie sinon je n'ai plus d'executable ... pour j'étais déjà en 7.3 mais avec la 16.4
j'ai essayé de comprendre et fait quelques recherches mais j'ai du mal à comprendre
deux explications (mais elles ne viennent pas de moi ) mais dans ce cas on perd la notion d'executable ... ????
Parce que d’une part, tu ne spécifies à aucun moment que tu souhaites avoir un objet partagé lors de l’édition de liens (implicite), d’autre part, l’option -no-pie spécifie que ton binaire sera toujours chargé en mémoire à la même adresse de référence.
"pie" signifie Position Independent Executable. L’intérêt d’utiliser cette option est de pouvoir, à chaque exécution de ton binaire, le charger à des adresses mémoires différentes (exactement comme pour des objets partagés qui ont besoin d’être relocalisés en mémoire en permanence plutôt que de toujours être chargés à une adresse mémoire fixe, ce qui peut entraîner des problèmes de collisions si deux objets partagés doivent être chargés à la même adresse, par exemple).
L’intérêt de faire ça pour un binaire exécutable et pourquoi pas seulement pour les objets partagés ? Eh bien il s’agit d’une mesure d’atténuation (je ne sais pas comment traduire correctement "mitigation") d’attaques informatique de type Return Oriented Programming où tu vas corrompre la mémoire de ton binaire pour exécuter un code arbitraire. Et pour exécuter ce code arbitraire, tu as besoin de savoir à quels adresses mémoires chercher les bonnes informations. Et comme avec l’option PIE les adresses ne sont jamais les mêmes à chaque exécution, ça rend l’exploitation d’une vulnérabilité plus compliqué que prévu.
ou encore ....
Il semble que GCC soit configuré pour créer des binaires -pie par défaut. Ces binaires sont en réalité des bibliothèques partagées (de type ET_DYN), sauf qu'ils s'exécutent exactement comme un exécutable normal. mais ne sont pas marqué executable donc il faut soit les faire monter avec un lanceur ou dans un terminal si l'on conserve l'option -pie (perso je trouve que l'on aurait pu les marqués comme executable c'est plus simple lors de test etc... mais j'ai peut-être pas compris)
j'ai trouvé les paramètres par défaut
Linker Options
object-file-name -llibrary -nostartfiles -nodefaultlibs
-nostdlib -pie -rdynamic -s -static -static-libgcc
-static-libstdc++ -shared -shared-libgcc -symbolic -T script
-Wl,option -Xlinker option -u symbol
tout ce que j'ai compris :
c'est pour la sécurité.... mais mais mon programme n'est plus un binaire mais une lib partagé et là je butte parce que pour des applications de gestions d'entreprise qui ne concerne que des données et dont l'environnement est fermé ?????
reprendre l'ensemble des makefiles pour changer en -no-pie ouffff bref si ont pouvait m'aider je serais preneur ... et je ne suis pas partisan de changer la configuration de base.
Merci
pourrait-on m’éclairer S.V.P.
JPL @bientôt