viernes, 17 de mayo de 2002

Problema de seguridad en OpenBSD

Las versiones actuales de OpenBSD permiten que cualquier usuario
local del sistema bloquee la máquina y, bajo ciertas condiciones,
obtenga privilegios de administrador o "root".
El problema radica en la verificación de los descriptores de
ficheros 0, 1 y 2 (entrada, salida y error estándar, respectivamente)
cuando se intenta ejecutar un proceso SETUID o SETGID.

Debido a la forma en la que se hace dicha verificación, un usuario
local del sistema puede llenar la tabla de descriptores del
sistema, creando un ataque DoS (denegación de servicio) y, bajo
ciertas circunstancias, lograr privilegios de administrador o "root".

Las versiones en desarrollo de OpenBSD ya están "parcheadas".

Gracias a las ventajas del código abierto, los usuarios pueden
parchear sus propios sistemas sin necesidad de esperar una nueva
versión del sistema operativo. Con este parche, el kernel abortará
la ejecución de la función "exec()" sobre un ejecutable
SETUID/SETGID si se detecta algún tipo de problema:



Aplicar el parche con:
cd /usr/src
patch -p0 < 003_fdalloc2.patch

y luego recompilar el kernel.


Index: sys/kern/kern_exec.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.66
diff -u -r1.66 kern_exec.c
--- sys/kern/kern_exec.c 14 Mar 2002 17:17:23 -0000 1.66
+++ sys/kern/kern_exec.c 8 May 2002 20:18:41 -0000
@@ -534,9 +534,6 @@
* allocated. We do not want userland to accidentally
* allocate descriptors in this range which has implied
* meaning to libc.
- *
- * XXX - Shouldn't the exec fail if we can't allocate
- * resources here?
*/
if (fp == NULL) {
short flags = FREAD [ (i == 0 ? 0 : FWRITE);
@@ -544,7 +541,7 @@
int indx;

if ((error = falloc(p, &fp, &indx)) != 0)
- break;
+ goto exec_abort;
#ifdef DIAGNOSTIC
if (indx != i)
panic("sys_execve: falloc indx != i");
@@ -552,13 +549,13 @@
if ((error = cdevvp(getnulldev(), &vp)) != 0) {
fdremove(p->p_fd, indx);
closef(fp, p);
- break;
+ goto exec_abort;
}
if ((error = VOP_OPEN(vp, flags, p->p_ucred, p)) != 0) {
fdremove(p->p_fd, indx);
closef(fp, p);
vrele(vp);
- break;
+ goto exec_abort;
}
if (flags & FWRITE)
vp->v_writecount++;






Jesús Cea Avión
jcea@hispasec.com


Más información:

# 003: SECURITY FIX: May 8, 2002

A race condition exists where an attacker could fill the file descriptor
table and defeat the kernel's protection of fd slots 0, 1, and 2 for a
setuid or setgid process.

http://www.openbsd.org/errata.html#fdalloc2

Parche OpenBSD 3.1


ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.1/common/003_fdalloc2.patch

Parche OpenBSD 3.0


ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.0/common/021_fdalloc2.patch

Parche OpenBSD 2.9


ftp://ftp.openbsd.org/pub/OpenBSD/patches/2.9/common/026_fdalloc2.patch