Las innovaciones de OpenBSD
(openbsd.org)El proyecto OpenBSD desarrolla y mantiene diversos programas e ideas. A continuación, una organización aproximada según el orden de incorporación
Conceptos (Concepts)
- IPSec(4): OpenBSD fue el primer sistema operativo Free en ofrecer una pila IPSec. Incorporado el 20 de febrero de 1997
- INET6(4): Integración completa de IPv6 en OpenBSD 2.7. El desarrollo comenzó el 6 de enero de 1999, y para el primer hackathon del 6 de junio de ese mismo año ya estaba en un estado de funcionamiento casi completo
- Separación de privilegios (Privilege Separation): Implementada por primera vez en OpenSSH en marzo de 2002. Después se aplicó a varios programas como bgpd(8), dhclient(8), smtpd(8) y tmux(1)
- Revocación de privilegios (Privilege Revocation): Aplicación de un método para reducir privilegios mientras se conservan ciertos recursos. Ej.: ping(8), traceroute(8)
- Protector de pila (Stack Protector): Basado en "propolice", desarrollado desde 2001. Activado por defecto en OpenBSD 3.3
- W^X (Write XOR Execute): Aplicado por primera vez en OpenBSD 3.3. Desde OpenBSD 6.0 se impone estrictamente por defecto
- Protección de GOT y PLT: En OpenBSD 3.3 se mejoró ld.so para proteger la GOT (Global Offset Table) y la PLT (Procedure Linkage Table)
- ASLR (Address Space Layout Randomization): OpenBSD 3.4 fue el primero en activarlo por defecto
- Análisis e inspección de gcc-local(1): Introducido por primera vez en OpenBSD 3.4
- Refuerzo de seguridad en malloc(3): Se aplican aleatorización y liberación diferida al asignar memoria. Reimplementado en OpenBSD 4.4
- Ejecutables independientes de posición (PIE): Activados por defecto por primera vez en OpenBSD 5.3. En 7 plataformas de hardware
- Inicialización de memoria basada en aleatoriedad: En OpenBSD 5.3 se agregó la sección ELF
.openbsd.randomdata - Protector de pila por objeto compartido: En OpenBSD 5.3 se aplica una cookie individual del protector de pila a cada objeto compartido
- Static-PIE: Soporte para binarios estáticos independientes de posición en /bin, /sbin y RAM disk. Introducido en OpenBSD 5.7
- Mitigación de ataques SROP: Activada por defecto en OpenBSD 6.0
- Aleatorización del orden de carga de bibliotecas: Activada por defecto en OpenBSD 6.0 y 6.2
- Mejora de lazy-binding para la seguridad W^X en entornos multihilo: Introducida en OpenBSD 5.9
- Refuerzo del diseño de memoria: Aplicado a todos los programas y bibliotecas en OpenBSD 6.1
- Uso del método fork+exec: Refuerza la protección del espacio de direcciones en programas con separación de privilegios
- trapsleds: Aplicación de una técnica de conversión NOP para mitigar ataques ROP (Return-Oriented Programming)
- Reenlazado del kernel al arrancar: Aleatoriza el diseño interno del kernel en cada arranque
- Refuerzo de secuencias de instrucciones en i386/amd64: Mejoras para dificultar ataques ROP
- Adición de la opción MAP_STACK: Evita que en ataques ROP se abuse de memoria distinta de la pila
- RETGUARD: Mecanismo de protección más fuerte que el protector de pila tradicional, introducido desde OpenBSD 6.4
- Adición de la opción MAP_CONCEAL: Evita que información sensible se filtre en core dumps
- Bloqueo de llamadas al sistema desde memoria PROT_WRITE: Introducido en OpenBSD 6.5
- Fijación de la ubicación de las llamadas al sistema: Restringe las llamadas al sistema para que solo puedan ejecutarse desde ubicaciones específicas
- Refuerzo de la protección del espacio de direcciones: Restringe cambios de memoria mediante mmap(2), mprotect(2), etc.
- Reenlazado de sshd al arrancar: Introducido en OpenBSD 7.2
- Soporte para código no legible (xonly): Restringe la lectura de memoria ejecutable
- Protección de llamadas al sistema pinsyscalls(2): Protege registrando de antemano las ubicaciones de llamadas al sistema
- Protección de destinos de salto indirecto (BTI, IBT): Aplicación de funciones de seguridad basadas en hardware
- Adición de la función -fret-clean: Evita que los valores de retorno permanezcan en la pila y bloquea fugas de información. Actualmente solo se aplica en amd64
Funciones (Functions)
- issetugid(2): Función introducida en OpenBSD 2.0 que permite verificar si un proceso tiene un user ID o group ID establecido durante la ejecución
- arc4random(3): Función de generación de números aleatorios, agregada en OpenBSD 2.1
- bcrypt(3): Función para hash de contraseñas. Introducida por primera vez en OpenBSD 2.1
- strlcpy(3), strlcat(3): Funciones para copia y concatenación segura de cadenas. Introducidas en OpenBSD 2.4
- strtonum(3): Función para convertir cadenas en números evitando errores. Introducida en OpenBSD 3.6
- imsg: API de mensajería usada en varios demonios. Agregada a libutil en OpenBSD 4.8
- timingsafe_bcmp(3): Función de comparación de bytes con tiempo de ejecución constante. Introducida en OpenBSD 4.9
- explicit_bzero(3): Función para borrar memoria de forma segura. Agregada en OpenBSD 5.5
- ohash: Implementación de tabla hash. Incluida en libutil en OpenBSD 5.6
- asr: Resolver DNS alternativo. Activado en OpenBSD 5.6
- reallocarray(3): Función que evita overflows al reasignar memoria. Agregada en OpenBSD 5.6
- getentropy(2): Función que proporciona números aleatorios criptográficamente seguros. Introducida en OpenBSD 5.6
- sendsyslog(2): Función para enviar mensajes syslog desde el kernel. Agregada en OpenBSD 5.6
- timingsafe_memcmp(3): Función de comparación de memoria con tiempo de ejecución constante. Introducida en OpenBSD 5.6
- pledge(2): Función que limita system calls para mejorar la seguridad. Agregada en OpenBSD 5.9
- getpwnam_shadow(3), getpwuid_shadow(3): Funciones para consultar datos de contraseñas shadow con fines de refuerzo de seguridad. Introducidas en OpenBSD 5.9
- recallocarray(3): Función que rellena con 0 los datos existentes al redimensionar memoria. Agregada en OpenBSD 6.1
- freezero(3): Función que libera memoria rellenándola con 0. Introducida en OpenBSD 6.2
- unveil(2): Función que restringe el acceso al sistema de archivos. Agregada en OpenBSD 6.4
- malloc_conceal(3), calloc_conceal(3): Proporcionan protección de datos sensibles durante la asignación de memoria. Agregadas en OpenBSD 6.5
- ober: API de ASN.1 Basic Encoding Rules. Movida a libutil en OpenBSD 6.6
Programas y subsistemas (Programs and Subsystems)
- Utilidades relacionadas con YP: ypbind(8), ypset(8), ypcat(1), ypmatch(1), ypwhich(1), además de soporte en libc. Distribuidas por primera vez en NetBSD 0.9
- ypserv(8): Servidor YP introducido en OpenBSD 2.0
- mopd(8): Demonio con soporte para MOP (Maintenance Operations Protocol). Agregado en OpenBSD 2.0
- AnonCVS: Sistema diseñado para permitir acceso anónimo al repositorio de código de OpenBSD
- aucat(1): Utilidad relacionada con el servidor de audio. Agregada en OpenBSD 2.1
- OpenSSH: Herramienta de comunicación segura basada en SSH. Introducida en OpenBSD 2.6
- mg(1): Editor de texto liviano. Incluido en OpenBSD 2.7
- m4(1): Procesador de macros. Ampliado y mantenido desde OpenBSD 2.7 en adelante
- pf(4), pfctl(8), pflogd(8), authpf(8), ftp-proxy(8): Firewall de filtrado de paquetes. Agregado en OpenBSD 3.0
- systrace(4), systrace(1): Herramienta de monitoreo de system calls. Agregada en OpenBSD 3.2, pero sustituida por pledge(2) después de OpenBSD 5.9
- spamd(8): Demonio para filtrado de spam. Introducido en OpenBSD 3.3
- dc(1), bc(1): Utilidades de cálculo. Agregadas en OpenBSD 3.5
- sensorsd(8): Herramienta de monitoreo de sensores de hardware. Incluida en OpenBSD 3.5
- pkg_add(1): Utilidad de gestión de paquetes. Introducida en OpenBSD 3.5
- carp(4): Protocolo de interfaz de red para failover. Agregado en OpenBSD 3.5
- OpenBGPD: Demonio de enrutamiento BGP. Introducido en OpenBSD 3.5
- dhclient(8), dhcpd(8): Cliente y servidor DHCP. Agregados entre OpenBSD 3.5 y 3.6
- hotplugd(8): Demonio de manejo de eventos hotplug. Agregado en OpenBSD 3.6
- OpenNTPD: Demonio NTP (Network Time Protocol). Agregado en OpenBSD 3.6
- dpb(1): Sistema distribuido de construcción de paquetes. Introducido en OpenBSD 3.6
- ospfd(8), ospfctl(8), ospf6d(8): Demonios de enrutamiento OSPF (Open Shortest Path First). Introducidos entre OpenBSD 3.7 y 4.2
- ifstated(8): Herramienta de gestión del estado de interfaces. Agregada en OpenBSD 3.8
- bioctl(8): Herramienta de gestión de dispositivos de bloque y RAID. Incluida en OpenBSD 3.8
- hostapd(8): Herramienta de gestión de puntos de acceso inalámbricos. Introducida en OpenBSD 3.8
- watchdogd(8): Temporizador de vigilancia para garantizar la estabilidad del sistema. Agregado en OpenBSD 3.8
- sdiff(1): Utilidad de comparación de archivos. Introducida en OpenBSD 3.9
- dvmrpd(8), dvmrpctl(8): Soporte para DVMRP (Distance Vector Multicast Routing Protocol). Agregado en OpenBSD 4.0
- ripd(8), ripctl(8): Soporte para RIP (Routing Information Protocol). Incluido en OpenBSD 4.1
- pkg-config(1): Herramienta de configuración de paquetes. Introducida en OpenBSD 4.1
- relayd(8), relayctl(8): Herramientas de relay de tráfico de red. Agregadas en OpenBSD 4.1
- cwm(1): Window manager liviano. Agregado en OpenBSD 4.2
- libtool(1): Herramienta de automatización para construcción de bibliotecas. Incluida en OpenBSD 4.3
- snmpd(8): Demonio SNMP (Simple Network Management Protocol). Agregado en OpenBSD 4.3
- sysmerge(8): Herramienta para fusionar archivos de configuración del sistema. Agregada en OpenBSD 4.4
- ypldap(8): Servidor YP basado en LDAP. Incluido en OpenBSD 4.4
- OpenSMTPD: Servidor SMTP (Simple Mail Transfer Protocol). Introducido en OpenBSD 4.6
- tmux(1): Multiplexor de terminal. Incluido en OpenBSD 4.6
- ldpd(8), ldpctl(8): Soporte para Label Distribution Protocol (LDP). Agregado en OpenBSD 4.6
- mandoc(1): Herramienta de documentación de páginas de manual. Introducida en OpenBSD 4.8
- ldapd(8), ldapctl(8): Servidor LDAP (Lightweight Directory Access Protocol). Agregado en OpenBSD 4.8
- OpenIKED: Implementación del protocolo IKE (Internet Key Exchange). Introducida en OpenBSD 4.8
- iscsid(8), iscsictl(8): Demonios iSCSI. Incluidos en OpenBSD 4.9
- rc.d(8), rc.subr(8): Gestión de scripts de inicialización del sistema. Agregada en OpenBSD 4.9
- npppd(8), npppctl(8): Demonios PPP (Point-to-Point Protocol). Agregados en OpenBSD 5.3
- ldomd(8), ldomctl(8): Herramientas de gestión de LDOM (Logical Domains). Incluidas en OpenBSD 5.3
- sndiod(8): Servidor de audio. Introducido en OpenBSD 5.3
- cu(1): Utilidad de comunicación serial. Agregada en OpenBSD 5.4
- slowcgi(8): Herramienta para manejar solicitudes HTTP lentas. Incluida en OpenBSD 5.4
- signify(1): Herramienta para firmar y verificar archivos. Agregada en OpenBSD 5.5
- LibreSSL: Proyecto derivado de OpenSSL para reforzar la seguridad. Lanzado por primera vez en OpenBSD 5.6
- httpd(8): Servidor web liviano. Incluido en OpenBSD 5.6
- rcctl(8): Utilidad de gestión de servicios rc.d. Agregada en OpenBSD 5.7
- doas(1): Utilidad simple de elevación de privilegios. Introducida en OpenBSD 5.8
- radiusd(8): Implementación de servidor RADIUS. Agregada en OpenBSD 5.8
- eigrpd(8), eigrpctl(8): Soporte para EIGRP (Enhanced Interior Gateway Routing Protocol). Incluido en OpenBSD 5.9
- vmm(4), vmd(8), vmctl(8): Sistema de gestión de máquinas virtuales. Agregado en OpenBSD 5.9
- acme-client(1): Cliente de emisión de certificados usando el protocolo ACME. Introducido en OpenBSD 6.1
- syspatch(8): Herramienta de gestión de parches de seguridad. Agregada en OpenBSD 6.1
- xenodm(1): Versión depurada derivada de XDM. Incluida en OpenBSD 6.1
- unwind(8): Resolver DNS local. Introducido en OpenBSD 6.5
- sysupgrade(8): Herramienta de actualización automática del sistema. Agregada en OpenBSD 6.6
- rpki-client(8): Cliente RPKI (Route Origin Validation). Introducido en OpenBSD 6.7
- resolvd(8): Herramienta para gestionar configuración DNS en entornos de red dinámicos. Agregada en OpenBSD 6.9
- dhcpleased(8): Cliente DHCP mejorado. Incluido en OpenBSD 6.9
Proyectos mantenidos por desarrolladores de OpenBSD fuera de OpenBSD
- sudo: Herramienta que permite a administradores del sistema otorgar a ciertos usuarios permisos limitados para ejecutar comandos. Incluida en OpenBSD 2.7
- femail: Herramienta simple de envío de correo. Comenzó en 2005, y el port de OpenBSD se ofreció el 22 de septiembre de ese mismo año
- midish: Secuenciador y herramienta de procesamiento MIDI. Comenzó en 2003, y el port de OpenBSD se ofreció el 4 de noviembre de 2005
- fdm: Herramienta de filtrado y organización de correo. Comenzó en 2006, y el port de OpenBSD se ofreció el 18 de enero de 2007
- toad: Herramienta de despliegue automático de software para OpenBSD. Comenzó en 2013, y el port de OpenBSD se ofreció el 8 de octubre de ese mismo año
- docbook2mdoc: Herramienta para convertir documentos DocBook al formato de páginas de manual mdoc. Comenzó en 2014, y el port de OpenBSD se ofreció el 3 de abril de ese mismo año
- portroach: Herramienta de seguimiento de actualizaciones de ports desarrollada a partir de un fork de portscout de FreeBSD. Comenzó en 2014, y el port de OpenBSD se ofreció el 5 de septiembre de ese mismo año
- cvs2gitdump: Herramienta para convertir repositorios CVS a Git. Comenzó en 2012, y el port de OpenBSD se ofreció el 1 de agosto de 2016
- Game of Trees: Sistema de control de versiones que puede sustituir a Git. Comenzó en 2017, y el port de OpenBSD se ofreció el 9 de agosto de 2019
1 comentarios
Comentarios de Hacker News
La fundación OpenBSD recaudó unos 380 mil dólares
John Ioannidis falleció hace unas semanas, y casi nadie se dio cuenta
Además del diseño privdrop/privsep de OpenBSD y la adopción de pledge(2)/unveil(2), trabajos recientes de mitigación como mimmutable no están recibiendo atención
En OpenBSD 5.3, Matthew Dempsky implementó memoria de datos aleatorizados
AmigaOS usó ejecutables independientes de la posición (PIE) y ASLR en 1985
Expresan sorpresa de que pledge/unveil no se haya presentado de forma más destacada
Se preguntan si OpenBSD implementó ISO C11 _Thread_local
Cuestionan por qué la página de OpenBSD usa solo HTML básico y no usa estilos ni CSS
Recomiendan <a href="https://why-openbsd.rocks/" rel="nofollow">https://why-openbsd.rocks/</a> como otro gran recurso