Le programme ne peut pas être chargé après le réglage du bit setuid

Considérez ce scénario dans lequel un exécutable A.bin utilise libY.so et libZ.so. Ac, Yc et Zc sont tous écrits en CZc et Yc sont compilés en fichiers .so respectifs.

Ceci est la structure de répertoire des fichiers

$ home / bin / A.bin $ home / lib / libY.so $ home / lib / libZ.so

Lorsque je lance A.bin en tant qu’utilisateur normal, A.bin s’exécute normalement comme prévu. Note: $ LD_LIBRARY_PATH contient $ home / lib

J’ai changé du code dans Ac en ajoutant des fonctionnalités qui nécessitent des privilèges d’administrateur (comme la liaison à un port inférieur à 1000). Je mets le bit setuid pour A.bin, libY.so et libZ.so à rwsrwsrws et change la propriété des fichiers en root. Lorsque j’essaie d’exécuter A.bin, j’obtiens l’erreur suivante

ld.so.1: A.bin: fatal: libY.so: a échoué: aucun fichier ou répertoire de ce type n’a été tué

Lorsque je supprime simplement l’autorisation setuid de tous ces fichiers, le binary s’exécute à l’exception des fonctionnalités qui échouent lorsqu’il nécessite des privilèges root.

Comment surmonter ce problème ?

Edit: Le système d’exploitation est Solaris 5.10

Comme AProgrammer l’a dit, lors de l’exécution des programmes setuid, $ LD_LIBRARY_PATH est ignoré. Par conséquent, le chemin doit être codé en dur dans l’exécutable lui-même en utilisant cet indicateur lors de la liaison

gcc -R $ home / lib

L’indicateur -R crée une liste de chemins de recherche d’exécution en exécutable.

Référence: http://www.justskins.com/forums/loading-shared-libraries-from-a-setuid-program-116597.html

Dans certaines variantes d’Unix, les exécutables suid ont des fonctionnalités de sécurité comme ignorer LD_LIBRARY_PATH , vérifier la propriété et les droits d’access sur l’exécutable et utiliser les bibliothèques partagées, … Je ne me souviens pas du cas de Solaris, mais