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.