"La seule manière de venir à bout de ce truc, c'est de coder dans un langage de programmation qui permet de changer la valeur du euid (au hasard, le C). "
Oui, mais c'est bizarre qu'il faille que le programme agisse pour rendre le setuid utile. On s'attendrait à ce qu'un programme ne sache pas ce qui lui arrive. Cela dit, j'ai l'impression que ça vient de la gestion des scripts :
$ ./a.out
uid : 1000
euid : 0
$ ./a.ml
uid : 1000
euid : 1000
ou a.out est juste une version compilé de a.ml (et a.ml commence par #!...ocaml), ils sont tout les deux root:root (-rwsr-xr-x).
J'ai l'impression que le mécanisme d'exécution des scripts ne prends pas en compte le setuid. Est-ce que c'est le shell ou le système qui exécute les scripts ?
... après un petit coup de strace, et vu que execve est capable de lancer des scripts je pense que c'est bien le système qui gère ça. Du coup, je suis plus surpris. Parce que si c'était le shell je comprendrais le problème, mais vu que c'est le système je ne vois pas d'où est-ce que ça peut venir.
Surtout que si l'interpréteur de commande (celui qui vient après #!) est setuid alors l'euid est bien modifié, mais s'il ne l'est pas et il tourne lui même avec un euid égale à l'uid si le fichier de script est setuid (là il faut suivre, j'ai un script c qui commence par #!/home/dnob700/a.out avec mon a.out de tout à l'heure, mais qui n'est plus setuid, seulement le fichier c).
Bref, ça m'a l'air d'être un comportement ad-hoc qui fait que le système n'honore par le bit setuid pour les scripts. C'est pas sympa de sa part (et je ne vois pas l'utilité, ce n'est pas plus dangereux que si le programme est compilé).