Lire en dehors des lignes : Symlink Escape dans l'API de fichiers d'OpenCode

DEV - 28/01
La dernière vulnérabilité que j’ai trouvée était la plus silencieuse. Aucune exécution de commande. Juste... lire des fichiers qui...

La dernière vulnérabilité que j’ai trouvée était la plus silencieuse. Aucune exécution de commande. Juste... lire des fichiers qui ne devraient pas être lisibles.

Après l'injection de commande, j'ai regardé ce que l'API du serveur exposait d'autre. Le/fichier/contenule point final a attiré mon attention. Il lit les fichiers du répertoire du projet.

"Depuis le répertoire du projet", telle est la phrase clé. Le point final est censé avoir une portée. Vous pouvez lire les fichiers de votre projet, mais pas les fichiers n'importe où sur le système.

Mais qu’en est-il des liens symboliques ?

La question

Si j'ai un lien symbolique à l'intérieur de mon projet qui pointe vers l'extérieur de mon projet, dans quel sens se déroule la vérification des limites ?

mon-projet/ ├── src/ ├── package.json └── lien -> /home/user/.ssh/id_rsa
Entrer en mode plein écran Quitter le mode plein écran

Le lien symboliquelienest à l'intérieurmon-projet. Sa cible,/home/user/.ssh/id_rsa, ne l'est pas.

Quand je demande/file/content?path=lien, est-ce que j'obtiens :

  1. Une erreur (le chemin échappe aux limites du projet), ou
  2. Ma clé privée SSH ?

La réponse

J'ai reçu ma clé privée SSH.

Eh bien, j'ai un fichier de test que j'ai créé en dehors du projet pour simuler cela. Mais le principe est le même.

# Créez un fichier secret en dehors du projet echo "TOP_SECRET" > /tmp/outside_secret.txt # Créez un lien symbolique à l'intérieur du projet pointant vers lui ln -s /tmp/outside_secret.txt ./leak # Démarrez le serveur et demandez le lien symbolique curl "http://localhost:8080/file/content?path=leak" # Réponse : TOP_SECRET
Entrer en mode plein écran Quitter le mode plein écran

Le con...
[Courte citation de 8% de l'article original]

Loading...