Contexte du problème
Le blog de Disconnect3d signale qu’une configuration courante du PATH peut introduire un répertoire ./~/.local/bin/ au lieu du répertoire personnel /home/<user>/.local/bin/. L’erreur apparaît lorsqu’on écrit export PATH="$PATH:~/.local/bin/" dans ~/.bashrc ou ~/.zshrc. Le sandbox nono agent détecte alors le préfixe ~/.local/bin/ comme une entrée modifiable, mais la tilde n’est pas développée, ce qui conduit le shell à interpréter le chemin comme relatif à . (le répertoire courant).
Mécanisme d’expansion du tilde
La documentation de Bash précise que « si un mot commence par un tilde non cité, tous les caractères jusqu’au premier slash non cité sont considérés comme un préfixe de tilde ». L’expansion s’effectue uniquement sur des mots non entourés de guillemets ou d’apostrophes. Dans une affectation de variable, Bash recherche les préfixes de tilde immédiatement après le signe = ou un deux‑points :. Ainsi, export PATH=$PATH:~/.local/bin fonctionne parce que le tilde n’est pas cité. En revanche, dès que l’on introduit des espaces ou des guillemets, comme dans export PATH = " $PATH :~/.local/bin/", le tilde devient une chaîne littérale et n’est plus remplacé par $HOME.
Conséquences sur le PATH et la sécurité
Lorsque le PATH contient ./~/.local/bin/, le shell recherche d’abord ce répertoire relatif au répertoire de travail. Un attaquant disposant d’un accès en écriture à ./~ peut placer un exécutable malveillant qui sera exécuté avant les binaires légitimes. L’exemple du blog montre la création d’un répertoire ./~/.local/bin, la compilation d’un programme kek avec gcc, puis son exécution via kek hello. Le binaire est trouvé et lancé depuis le répertoire erroné, prouvant que la résolution du PATH ne passe jamais par le répertoire $HOME. Cette situation fragilise les environnements de sandboxing, car les outils de confinement s’appuient sur la confiance que les chemins pointent vers des emplacements contrôlés.
Correction et bonnes pratiques
La solution la plus fiable consiste à remplacer le tilde par la variable d’environnement $HOME, qui n’est jamais soumise à une expansion conditionnelle. La ligne correcte est :
export PATH="$PATH:$HOME/.local/bin/"
Cette forme fonctionne tant sous Bash que sous Zsh, même en présence d’espaces, car $HOME est résolue avant l’affectation. Pour vérifier rapidement la présence d’un tilde non développé, on peut exécuter :
echo "$PATH" | tr ':' '\n' | grep '~'
Si la commande renvoie une ligne, il faut corriger le fichier de configuration concerné (.bashrc, .zshrc ou .profile). En production, il est recommandé de placer les ajouts de PATH en début de fichier, d’éviter les espaces superflus autour du signe =, et de valider le résultat avec echo $PATH après chaque modification. Ces pratiques limitent les risques d’injection de code via des chemins mal résolus.