PATH hijacking : comprendre et prévenir l’escalade de privilèges
Quand un programme privilégié lance une commande par son simple nom, c’est la variable d’environnement PATH qui décide quel exécutable est réellement lancé. Si un attaquant influence PATH, il peut faire exécuter son propre programme avec les droits du programme privilégié. C’est le PATH hijacking (CWE-426, untrusted search path).
Le principe
Pour une commande donnée sans chemin (ls), le système parcourt dans l’ordre les dossiers listés dans PATH et lance le premier exécutable trouvé. Si un dossier contrôlé par l’attaquant passe avant /bin, son ls est lancé à la place du vrai.
Un code vulnérable
Un programme exécuté avec des droits élevés (SUID, tâche planifiée, commande autorisée par sudo) qui lance une commande par son nom :
#include <stdlib.h>
int main(void) {
system("ls /var/log"); /* "ls" est cherché dans $PATH */
return 0;
}
Si l’environnement de l’appelant est conservé, rien ne garantit que ls désigne /bin/ls.
Détecter ce risque lors d’un audit
- Repérer les commandes lancées sans chemin absolu, avec
stringssur le binaire oultraceetstraceà l’exécution. - Vérifier que les dossiers de
PATHne sont pas modifiables par des utilisateurs non privilégiés. - Lire
sudo -l: une règle qui conservePATH(env_keep) est un signal d’alerte. - Lister les binaires SUID avec
find / -perm -4000 -type f 2>/dev/nullet les examiner.
Corriger
Un chemin absolu et un environnement minimal maîtrisé :
#include <unistd.h>
int main(void) {
char *const env[] = { "PATH=/usr/bin:/bin", NULL };
execle("/bin/ls", "ls", "/var/log", (char *)NULL, env);
return 1; /* atteint seulement si exec échoue */
}
- Toujours des chemins absolus dans le code privilégié, et éviter
system()etpopen()avec des chaînes interprétées par un shell. - Avec sudo, garder
env_resetetsecure_path, qui sont les réglages par défaut de Debian. - Ne jamais mettre
.ou un dossier modifiable par les utilisateurs dans lePATHd’un compte privilégié. - Appliquer le principe de least privilege : abandonner les droits dès qu’ils ne sont plus nécessaires, monter les partitions de données avec
nosuid.
Pourquoi c’est un classique
Ce scénario revient dans de nombreux challenges d’escalade de privilèges. Le comprendre côté défense est précisément ce qui permet d’écrire du code et des configurations qui n’y sont pas vulnérables.
Voir aussi : les challenges CTF, hardening d’un serveur Debian