El sistema operativo OpenBSD se centra en la seguridad y el desarrollo de funciones de seguridad . [1] [2] : xxvii [3] Según el autor Michael W. Lucas, OpenBSD "es ampliamente considerado como el sistema operativo más seguro disponible en cualquier lugar, bajo cualquier término de licencia". [2] : xxix
API y cambios de compilación
Los errores y fallas de seguridad a menudo son causados por errores del programador. Una fuente común de error es el mal uso de las funciones de cadenastrcpy
y en el lenguaje de programación C. Hay dos alternativas comunes, y , pero pueden ser difíciles de entender y fáciles de usar incorrectamente, [4] [5] por lo que los desarrolladores de OpenBSD Todd C. Miller y Theo de Raadt diseñaron las funciones y . [6] Estas funciones están destinadas a hacer más difícil para los programadores dejar accidentalmente búferes sin terminar o permitir que se desborden. [7] Han sido adoptadas por los proyectos NetBSD y FreeBSD, pero no por la Biblioteca de C de GNU . [8]strcat
strncpy
strncat
strlcpy
strlcat
En OpenBSD, el enlazador se ha cambiado a emitir una advertencia cuando las funciones de manipulación de cadenas inseguras , tales como strcpy
, strcat
, o sprintf
, se encuentran. Todas las apariciones de estas funciones en el árbol de fuentes de OpenBSD han sido reemplazadas. [ cita requerida ] Además, se incluye un verificador de límites estáticos en OpenBSD en un intento de encontrar otros errores comunes de programación en tiempo de compilación. [9] Otras API relacionadas con la seguridad desarrolladas por el proyecto OpenBSD incluyen issetugid
[10] y arc4random
. [11]
Aleatorización de kernel
En un correo electrónico de junio de 2017, Theo de Raadt declaró que un problema con los sistemas estables era que podían estar funcionando durante meses. Aunque existe una considerable aleatorización dentro del kernel, algunas direcciones clave siguen siendo las mismas. El proyecto en curso modifica el vinculador para que en cada arranque, el kernel se vuelva a vincular, así como todas las demás aleatorizaciones. Esto difiere del ASLR del núcleo ; en el correo electrónico afirma que "Como resultado, cada nuevo kernel es único. Las compensaciones relativas entre las funciones y los datos son únicas ... [El cambio actual] es un andamiaje para garantizar que inicie un kernel recién vinculado en cada reinicio ... . para que se pueda vincular un nuevo kernel aleatorio ... En una máquina rápida se tarda menos de un segundo ... Un reinicio ejecuta el nuevo kernel y se crea otro kernel para el siguiente inicio. Los deltas internos entre funciones dentro del kernel no están donde un atacante espera que estén, por lo que necesitará mejores filtraciones de información ". [12]
Protección de la memoria
OpenBSD integra varias tecnologías para ayudar a proteger el sistema operativo de ataques como desbordamientos de búfer o desbordamientos de enteros .
ProPolice , desarrollada por Hiroaki Etoh, es una extensión de GCC diseñada para proteger las aplicaciones de ataques de destrucción de pilas . [13] Lo hace a través de una serie de operaciones: las variables de pila locales se reordenan para colocar búferes tras punteros, protegiéndolos de la corrupción en caso de desbordamiento del búfer; los punteros de los argumentos de la función también se colocan antes de los búferes locales; y se coloca un valor canario después de los búferes locales que, cuando la función sale, a veces se puede usar para detectar desbordamientos de búfer. ProPolice elige si proteger o no un búfer basándose en heurísticas automáticas que juzgan qué tan vulnerable es, reduciendo la sobrecarga de rendimiento de la protección. [ vago ] Se integró en la versión GCC de OpenBSD en diciembre de 2002 y se puso a disposición por primera vez en OpenBSD 3.3; [14] se aplicó al kernel en la versión 3.4. [15] La extensión funciona en todas las arquitecturas de CPU compatibles con OpenBSD y está habilitada de forma predeterminada, por lo que cualquier código C compilado estará protegido sin la intervención del usuario. [dieciséis]
En mayo de 2004, OpenBSD en la plataforma SPARC recibió más protección de pila en forma de StackGhost . Esto hace uso de características de la arquitectura SPARC para ayudar a prevenir la explotación de desbordamientos de búfer. [17] El soporte para SPARC64 se agregó a -current en marzo de 2005.
OpenBSD 3.4 introdujo W ^ X , un esquema de administración de memoria para garantizar que la memoria sea grabable o ejecutable, pero nunca ambas, lo que proporciona otra capa de protección contra desbordamientos de búfer. Si bien esto es relativamente fácil de implementar en una plataforma como x86-64 , que tiene soporte de hardware para el bit NX , OpenBSD es uno de los pocos sistemas operativos que admite esto en la plataforma genérica i386, [18] que carece de funciones integradas por página. ejecutar controles.
Durante el ciclo de desarrollo de la versión 3.8, se realizaron cambios en las malloc
funciones de administración de memoria. En los sistemas operativos Unix tradicionales, malloc
asigna más memoria al extender el segmento de datos Unix, una práctica que ha dificultado la implementación de una protección sólida contra problemas de seguridad. [ vago ] La malloc
implementación ahora en OpenBSD hace uso de la mmap
llamada al sistema, que fue modificada para que devuelva direcciones de memoria aleatorias y asegura que las diferentes áreas no se mapeen una al lado de la otra. Además, la asignación de pequeños bloques en áreas compartidas ahora es aleatoria y la free
función se cambió para devolver la memoria al kernel inmediatamente en lugar de dejarla mapeada en el proceso. También se agregaron una serie de controles opcionales adicionales para ayudar en el desarrollo. [ cita requerida ] Estas características hacen que los errores del programa sean más fáciles de detectar y más difíciles de explotar: en lugar de que se corrompa la memoria o se ignore un acceso no válido, a menudo resultan en una falla de segmentación y la interrupción del proceso. Esto ha sacado a la luz varios problemas con el software que se ejecuta en OpenBSD 3.8, particularmente con programas que leen más allá del inicio o el final de un búfer, un tipo de error que antes no se detectaba directamente pero que ahora puede causar un error. [ cita requerida ] Estas habilidades tardaron más de tres años en implementarse sin una pérdida considerable de rendimiento.
Criptografía y aleatorización
Uno de los objetivos del proyecto OpenBSD es la integración de instalaciones y software para una criptografía sólida en el sistema operativo central. Con este fin, se proporcionan una serie de características de bajo nivel, incluida una fuente de números pseudoaleatorios fuertes ; [19] incorporado funciones hash criptográficas y transforma; y soporte para hardware criptográfico ( OpenBSD Cryptographic Framework ). Estas habilidades se utilizan en todo OpenBSD, incluyendo el bcrypt algoritmo de hash [20] derivado de Bruce Schneier 's Blowfish cifrado de bloques , que se aprovecha de la Blowfish intensivo de la CPU programación clave , por lo que los ataques de fuerza bruta menos práctico.
Para proteger la información confidencial, como las contraseñas, para que no se filtren en el disco, donde pueden persistir durante muchos años, OpenBSD admite el cifrado de la partición de intercambio. El espacio de intercambio se divide en muchas regiones pequeñas a las que se les asigna su propia clave de cifrado: tan pronto como los datos de una región ya no son necesarios, OpenBSD los elimina de forma segura descartando la clave de cifrado. [21] Esta función está habilitada de forma predeterminada en OpenBSD 3.9 y posteriores.
La pila de red también hace un uso intensivo de la aleatorización para aumentar la seguridad y reducir la previsibilidad de varios valores que pueden ser útiles para un atacante, incluidos los números de secuencia inicial de TCP y las marcas de tiempo, y los puertos de origen efímeros. [22] También se incluyen una serie de características para aumentar la resistencia y disponibilidad de la red, incluidas las contramedidas para problemas con ICMP y software para redundancia, como CARP y pfsync . El proyecto fue el primero en deshabilitar el demonio telnet de texto plano en favor del demonio SSH cifrado , en 1999, [23] y presenta otro software criptográfico integrado como IPsec . El demonio telnet se eliminó por completo de OpenBSD en 2005 [24] antes del lanzamiento de la versión 3.8 de OpenBSD.
X11
En X11 en OpenBSD, ni el servidor X ni los clientes X normalmente tienen privilegios de hardware o memoria directa escalados: cuando se maneja X con los controladores Intel (4) o Radeon (4), estos normalmente interactúan con el hardware subyacente a través de Direct Rendering Management (4) solo la interfaz del kernel, de modo que el acceso a la memoria / hardware de bajo nivel sea manejado únicamente por el kernel. Otros controladores como WSFB siguen un patrón similar. Por esta razón, X11 en OpenBSD no abre la memoria de bajo nivel o el acceso de hardware a los programas de usuario / raíz como se hace en otros sistemas, y como se hizo en el pasado, que luego necesitaba que el usuario escale la configuración machdep.allowaperture de su configuración cero predeterminada, a una configuración insegura. [ cita requerida ]
La versión de OpenBSD del X Window System (llamado Xenocara ) tiene algunas modificaciones de seguridad. El servidor y algunas de las aplicaciones predeterminadas están parcheadas para hacer uso de la separación de privilegios , y OpenBSD proporciona un controlador de "apertura" para limitar el acceso de X a la memoria. [25] Sin embargo, después de trabajar en X fallas de seguridad de Loïc Duflot, Theo de Raadt comentó que el controlador de apertura era simplemente "lo mejor que podemos hacer" y que X "viola todos los modelos de seguridad de los que se hablará en una clase universitaria. " [26] Continuó criticando a los desarrolladores de X por "tomarse su tiempo para resolver este problema de> 10 años". El 29 de noviembre de 2006, se desarrolló un controlador de kernel VESA que permitió que X se ejecutara, aunque más lentamente, sin el uso del controlador de apertura. [27]
El 15 de febrero de 2014, X se modificó aún más para permitir su ejecución sin privilegios de root. [28] [29]
Después del descubrimiento de una vulnerabilidad de seguridad en X, [30] OpenBSD no admite la ejecución de X como usuario root y solo admite la ejecución de X a través de un administrador de pantalla como _x11
usuario dedicado .
Otras características
La separación de privilegios , [31] revocación de privilegios , chrooting y carga aleatoria de bibliotecas también desempeñan un papel en el aumento de la seguridad del sistema. Muchos de estos se han aplicado a las versiones OpenBSD de programas comunes como tcpdump y Apache , y al sistema de autenticación BSD .
OpenBSD tiene un historial de proporcionar a sus usuarios información completa en relación con varios errores y brechas de seguridad detectadas por el equipo de OpenBSD. [32] Esto se ejemplifica con el lema del proyecto : "¡Solo dos agujeros remotos en la instalación predeterminada, en muchísimo tiempo!"
En OpenBSD 5.3, se introdujo el soporte para el cifrado de disco completo . [33]
OpenBSD 5.8 introdujo la pledge
llamada al sistema para restringir las capacidades del proceso a un subconjunto mínimo requerido para una operación correcta. [34] Si el proceso se ve comprometido e intenta realizar un comportamiento no deseado, el kernel lo terminará. Desde su introducción, las aplicaciones y los puertos se han modificado para admitir pledge
, incluido el navegador web Chromium .
OpenBSD 6.4 introdujo la unveil
llamada al sistema para restringir la visibilidad del sistema de archivos a un nivel mínimo. [35]
Referencias
- ^ Korff, Yanek; Esperanza, Paco; Potter, Bruce (2005). Dominar la seguridad de FreeBSD y OpenBSD . Sebastopol, California, Estados Unidos: O'Reilly. ISBN 0-596-00626-8.
- ^ a b Lucas, Michael W. (2013). Absolute OpenBSD: Unix para los paranoicos prácticos (2ª ed.). San Francisco: No Starch Press . ISBN 978-1-59327-476-4.
- ^ Palmer, Brandon; Nazario, José (2004). Arquitecturas seguras con OpenBSD . Boston: Addison-Wesley . ISBN 0-321-19366-0.
- ^ "strncpy - copia parte de una cadena a otra" . Páginas de manual de OpenBSD . Consultado el 14 de mayo de 2021 .
- ^ "strncat - concatenar una cadena con parte de otra" . Páginas de manual de OpenBSD . Consultado el 14 de mayo de 2021 .
- ^ "strlcpy, strlcat - copia y concatenación de cadenas limitadas por tamaño" . Páginas de manual de OpenBSD . Consultado el 14 de mayo de 2021 .
- ^ Miller, Todd C .; de Raadt, Theo (6 de junio de 1999). strlcpy y strlcat: copia de cadenas y concatenación coherentes, seguras . Conferencia Técnica Anual de USENIX . Monterey, California . Consultado el 26 de mayo de 2016 .
- ^ Drepper, Ulrich (8 de agosto de 2000). "Re: PATCH: copia segura y concatenación de cadenas" . [email protected] (lista de correo) . Consultado el 26 de mayo de 2016 .
- ^ Madhavapeddy, Anil (26 de junio de 2003). "CVS: cvs.openbsd.org: src" . openbsd-cvs (lista de correo) . Consultado el 31 de marzo de 2013 .
- ^ "issetugid - es el ejecutable actual que ejecuta setuid o setgid" . Páginas de manual de OpenBSD . Consultado el 14 de mayo de 2021 .
- ^ "arc4random, arc4random_buf, arc4random_uniform - generador de números aleatorios" . Páginas de manual de OpenBSD . Consultado el 14 de mayo de 2021 .
- ^ correo electrónico 2017-06-13
- ^ "Extensión de GCC para proteger las aplicaciones de ataques de destrucción de pilas" . IBM Research . Archivado desde el original el 4 de junio de 2014 . Consultado el 26 de mayo de 2016 .
- ^ "OpenBSD 3.3" . OpenBSD . Consultado el 28 de mayo de 2016 .
Integración de la tecnología de protección de pila ProPolice [...] en el compilador del sistema.
- ^ "OpenBSD 3.4" . OpenBSD . Consultado el 28 de mayo de 2016 .
La protección de pila de ProPolice también se ha habilitado en el kernel.
- ^ "gcc-local - modificaciones locales a gcc" . Páginas de manual de OpenBSD . Consultado el 28 de mayo de 2016 .
gcc viene con la extensión de protección de pila 'ProPolice', que está habilitada de forma predeterminada.
- ^ Frantzen, Mike; Shuey, Mike (13 de agosto de 2001). StackGhost: Protección de pila facilitada por hardware . X Simposio de Seguridad de USENIX . Washington, DC . Consultado el 26 de mayo de 2016 .
- ^ "OpenBSD 5.8" . OpenBSD . Consultado el 28 de mayo de 2016 .
Soporte para el bit NX (No-eXecute) en i386, lo que resulta en una aplicación mucho mejor de W ^ X en el área de usuario para el hardware que tiene esta característica.
- ^ de Raadt, Theo ; Hallqvist, Niklas; Grabowski, Artur; Keromytis, Angelos D .; Provos, Niels (6 de junio de 1999). Criptografía en OpenBSD: una descripción general . Conferencia Técnica Anual de USENIX . Monterey, California . Consultado el 30 de enero de 2005 .
- ^ Provos, Niels ; Mazières, David (6 de junio de 1999). Un esquema de contraseñas adaptable al futuro . Conferencia Técnica Anual de USENIX . Monterey, California . Consultado el 26 de mayo de 2016 .
- ^ Provos, Niels (14 de agosto de 2000). Cifrado de la memoria virtual . IX Simposio de Seguridad de USENIX . Denver, Colorado . Consultado el 9 de abril de 2006 .
- ^ Biancuzzi, Federico (12 de octubre de 2005). "Pila de red de OpenBSD" . SecurityFocus . Consultado el 10 de diciembre de 2005 .
- ^ de Raadt, Theo (10 de abril de 1999). "deshabilitar telnet / ftp / login por defecto, por ahora" . OpenBSD .
- ^ de Raadt, Theo (25 de mayo de 2005). "CVS: cvs.openbsd.org: src" . Lista de correo OpenBSD-CVS .
Archivos eliminados: libexec / telnetd
- ^ "xf86 - Controlador de apertura del sistema X Window" . Páginas de manual de OpenBSD . Consultado el 14 de mayo de 2021 .
- ^ de Raadt, Theo (11 de mayo de 2006). "Re: error de seguridad en hardware x86 (gracias a X WIndows)" . openbsd-misc (lista de correo) . Consultado el 26 de mayo de 2016 .
- ^ Herrb, Matthieu (29 de noviembre de 2006). "CVS: cvs.openbsd.org: XF4" . openbsd-cvs (lista de correo) . Consultado el 26 de mayo de 2016 .
- ^ Kettenis, Mark (15 de febrero de 2014). "CVS: cvs.openbsd.org: xenocara" . openbsd-cvs (lista de correo) . Consultado el 26 de mayo de 2016 .
- ^ "Xorg ahora puede ejecutarse sin privilegios en OpenBSD" . Diario de OpenBSD . 22 de febrero de 2014 . Consultado el 26 de mayo de 2016 .
- ^ "Errata de OpenBSD 6.4" . www.openbsd.org . Consultado el 23 de mayo de 2019 .
- ^ Provos, Niels ; Friedl, Markus; Honeyman, Peter (4 de agosto de 2003). Prevención de la escalada de privilegios . 12º Simposio de Seguridad de USENIX . Washington, DC . Consultado el 26 de mayo de 2016 .
- ^ Miller, Robin (11 de diciembre de 2000). "Theo de Raadt responde" . Slashdot . Archivado desde el original el 28 de julio de 2011 . Consultado el 16 de mayo de 2014 .
- ^ "OpenBSD 5.3" . OpenBSD . Consultado el 26 de mayo de 2016 .
- ^ "compromiso () - un nuevo mecanismo de mitigación" . OpenBSD . Consultado el 19 de mayo de 2018 .
- ^ "desvelar - desvelar partes de una vista restringida del sistema de archivos" . Páginas de manual de OpenBSD . Consultado el 15 de mayo de 2020 .
enlaces externos
- Técnicas de mitigación de exploits: una actualización después de 10 años
- El correo electrónico de Theo de Raadt sobre la programación segura: sobre la aceptación de strlcpy / strlcat por parte de la industria