Este artículo explora una vulnerabilidad de seguridad recientemente descubierta en OpenBSD 6.3 para sistemas i386 (32 bits), que permitía a procesos de usuario causar fallos en todo el sistema operativo. La raíz del problema se remonta a una peculiaridad en el diseño de la arquitectura x86, específicamente a la forma en que Intel implementó el control de acceso a puertos de I/O en los primeros procesadores 386.
Originalmente, en el 80286, se introdujo el concepto de Task State Segments (TSS) para soportar el cambio de tareas. Cuando Intel añadió el mapa de bits de permisos de I/O (IOPB) para permitir un control más granular sobre qué puertos de I/O podían acceder los procesos, se integró de manera poco ortodoxa dentro de la estructura del TSS. Esto implicó redefinir parte de la última palabra del TSS para incluir un offset al IOPB. La documentación original de Intel sobre este mecanismo era incompleta y, en algunos casos, directamente incorrecta, lo que generó una situación donde el IOPB podía comenzar en la dirección cero del TSS, una práctica peligrosa si no se manejaba con cuidado.
El problema clave radica en que el diseño del IOPB requería un byte de relleno al final, con todos los bits establecidos, para asegurar que la CPU siempre pudiera leer datos válidos al evaluar los permisos de I/O. Esta peculiaridad, crucial para la estabilidad del sistema, no fue documentada adecuadamente en las primeras referencias de programación de Intel. Debido a una combinación de factores, incluyendo la falta de documentación clara y la forma en que OpenBSD gestionaba los permisos de I/O, se creó una brecha de seguridad que permitía a los procesos de usuario manipular el A20 gate, un componente crítico para el funcionamiento del sistema, provocando fallos.
Esta vulnerabilidad, aunque específica de sistemas i386, sirve como un recordatorio de la importancia de una documentación precisa y completa en el diseño de hardware y software. También destaca cómo las decisiones de diseño tomadas hace décadas pueden tener consecuencias inesperadas en el futuro, especialmente en sistemas operativos de código abierto donde se puede rastrear la evolución del código y comprender la génesis de los problemas. La historia de esta vulnerabilidad es un ejemplo de cómo incluso los gigantes de la industria como Intel pueden cometer errores, y cómo la comunidad de código abierto puede ayudar a identificar y corregir esos errores a través de la transparencia y la colaboración.
