Bonjour,

deux failles ont été trouvées cette semaine:

   - un DoS (Denial-of-Service) dans la gestion des liens symboliques;

   - une attaque root locale

En ce qui concerne l'attaque root locale, elle fonctionne ainsi:

   un processus (user) 1 s'attache à un processus 2 (user) via ptrace(2)
      autorisé (strace -p PROC_NUM, où PROC_NUM appartient au même `user'

   le processus 1 (celui qui peut tracer l'autre) exécute un programme
   suid-root qui a la propriété de lancer ensuite un shell sous
   le même l'utilisateur `user': sous certaines conditions, p.ex. newgrp
   (changement de groupe SVR3), ou su (switch user).

      pendant l'exécution de ce programme, le processus 2 appelle un
      autre programme suid. Vu que le processus 1 est remplacé par un
      programme suid (exec(2)), le processus 2 obtient les droits
      suid *même sous ptrace*.

   le processus 1 (programme suid-root newgroup ou su) exécute maintenant
   un shell sous l'utilisateur normal `user'.

      mais ce processus a maintenant la possibilité de tracer un
      processus suid (2), ce qui ne devrait jamais être possible.
      Cela veut dire qu'il a les pouvoirs de debugger ce programme,
      de le modifier, etc.

   -> modification du programme suid en mémoire, exécution d'un shell
      sous root.

Comment on voit, une attaque assez complexe mais dont l'implémentation
circule. Cette attaque est rendu possible par:

   - l'héritage du traçage d'un processus via exec(2)

   - en particulier provenant d'un passage suid -> non suid.

Ce problème est corrigé dans 2.4.12, et il y a un patch pour 2.2.19.

A voir seul Linux souffre de cette attaque (et pas 2.0.38 p.ex.).

Sur la base du patch pour 2.2.19 j'ai produit un patch simple pour 2.4.9,
qui empêche dans tous les cas l'exec(2) en suid d'un processus
déjà tracé (y compris si l'autre programme a les droits).

diff -urP linux-2.4.9/fs/exec.c linux-2.4.9-ptrace-fix/fs/exec.c
--- linux-2.4.9/fs/exec.c       Fri Jul 20 05:32:54 2001
+++ linux-2.4.9-ptrace-fix/fs/exec.c    Sat Oct 20 14:05:56 2001
@@ -588,12 +588,11 @@
 }
 
 /*
- * We mustn't allow tracing of suid binaries, unless
- * the tracer has the capability to trace anything..
+ * We shall not allow tracing of suid binaries, not matter what.
  */
 static inline int must_not_trace_exec(struct task_struct * p)
 {
-       return (p->ptrace & PT_PTRACED) && !cap_raised(p->p_pptr->cap_effective, 
CAP_SYS_PTRACE);
+       return (p->ptrace & PT_PTRACED);
 }
 
 /* 

Ce n'est pas une solution correcte, mais elle devrait corriger les
symptômes. On voit que must_not_trace_exec() est appelé depuis
compute_creds() et que si elle retourne TRUE, et que le processus courant
n'est pas capable de faire suid, on remet les effective U/GIDs à
current.

Elle pourrait aider ceux qui veulent utiliser 2.4.9 car 2.4.10-2.4.11
n'ont pas prouvé leur stabilité (changement de VM), et les -ac ne sont pas
forcément compatibles avec certaines extensions comme LVM/ext3.

PS: ces attaques sont strictement locales.



--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se désabonner aussi.

Reply via email to