En lisant ceci , j'ai trouvé l'exploit suivant:
% cp /usr/bin/id ~
% chmod -x ~/id
% ls -al ~/id
-rw-r--r-- 1 edd edd 22020 2012-08-01 15:06 /home/edd/id
% ~/id
zsh: permission denied: /home/edd/id
% /lib/ld-linux.so.2 ~/id
uid=1001(edd) gid=1001(edd) groups=1001(edd),1002(wheel)
Cet extrait montre que nous pouvons contourner trivialement les autorisations d'exécution du système de fichiers en tant qu'utilisateur normal non privilégié. J'ai exécuté cela sur un Ubuntu 12.04.
Alors que le chargeur Linux est un objet partagé selon le fichier (1), il possède également un point d'entrée qui permet de l'exécuter directement. Lorsqu'il est exécuté de cette manière, le chargeur Linux agit comme un interpréteur pour les binaires ELF.
Sur ma machine OpenBSD, cependant, cet exploit n'est pas efficace, car vous ne pouvez pas exécuter le chargeur en tant que programme. La page de manuel d'OpenBSD dit: "ld.so est lui-même un objet partagé qui est initialement chargé par le noyau.".
Essayez ceci sur Solaris 9 et vous obtiendrez une erreur de segmentation. Je ne sais pas ce qui se passe ailleurs.
Mes questions sont donc:
- Pourquoi le chargeur Linux (lorsqu'il est exécuté directement) ne vérifie pas les attributs du système de fichiers avant d'interpréter un binaire ELF?
- Pourquoi mettre en œuvre un mécanisme conçu pour interdire l'exécution de fichiers, s'il est si trivialement ignoré? Ai-je raté quelque chose?
libc
(je l'ai fait une fois, en mettant à niveau une boîte Arch), vous serez reconnaissant pour cette petite bizarrerie.