Proyecto principal · ParanoidBSD

Un sistema operativo donde la autoridad se tiene, no se presupone

Casi todas las intrusiones funcionan igual: un programa alcanza algo que nunca debió tocar. ParanoidBSD es un sistema operativo construido para que no pueda. A cada programa se le entrega solo lo que necesita, y todo lo demás no está simplemente prohibido — está fuera de su alcance. Construido sobre HardenedBSD, reescrito en C++ moderno, con el original guardado al lado para poder contrastar cada cambio.

LenguajeC / C++23
BaseHardenedBSD 15-STABLE
EscritorioKDE Plasma 6
Último envíohace poco
Estrellas—
Estructura del repositorio
pbsd/Módulos de C++23 — núcleo del kernel, ports del espacio de usuario, UDA, BIFROST, compositor, tema
hbsd/Código fuente de HardenedBSD 15-STABLE — el original, conservado como especificación
kde/Plasma 6, KWin y frameworks para la fase de escritorio
tools/Inventario, pasadas deterministas de reescritura, port con agentes, utilidades de Clang
docs/Especificaciones, modelo de seguridad, estado de la migración, procedencia
scripts/Script motor del Subsistema de Windows para Linux (WSL), vigilante, consola de progreso
En lenguaje llano

Qué es esto, en un minuto

El problema

Un sistema operativo está debajo de todo lo demás que ejecuta una organización. Casi todos se apoyan en décadas de código antiguo y dejan que cualquier programa pida cualquier cosa — el sistema decide después si se lo permite. Por eso un solo fallo en algo inofensivo, como el código que dibuja una fuente en pantalla, puede acabar en contraseñas robadas.

La solución

ParanoidBSD cambia lo que un programa puede pedir de entrada. En vez de comprobar el permiso después de la petición, entrega a cada programa una lista corta de cosas que puede tocar y no le da forma de nombrar ninguna otra. Un fallo en una parte deja de ser un camino hacia el resto.

Para quién es

Proveedores de defensa y de gobierno a los que ya se les pide software escrito en lenguajes más seguros. Equipos que pasan años sobre el terreno y no se pueden parchear deprisa — controladores industriales, máquinas médicas, equipos de servicios públicos. Docentes e investigadores que quieren un sistema operativo de verdad lo bastante pequeño para leerlo de punta a punta.

La seguridad no debería empezar en la capa de aplicación. Debería empezar en el sistema operativo que hay debajo. El resto de esta página es la ingeniería: qué se cambió, cómo se comprobó y qué no está hecho todavía.
El problema

La autoridad ambiental es el fallo que no se puede parchear

En un Unix convencional, un proceso no posee el derecho a abrir /etc/master.passwd. Simplemente lo pide, y el kernel decide después, según quién dice ser el proceso. Todo proceso puede nombrar todos los recursos del sistema. El espacio de nombres es global y ambiental; la comprobación es un añadido tardío.

Por eso un solo fallo de análisis en un renderizador de fuentes puede convertirse en un robo de credenciales. El renderizador nunca necesitó el archivo de contraseñas — pero nada en la arquitectura le impedía pedirlo.

HardenedBSD ya hace un trabajo serio aquí: aleatorización del espacio de direcciones (ASLR), que carga el programa en un sitio distinto cada vez para que un atacante no pueda adivinar dónde está nada; integridad del flujo de control (CFI), que impide desviar un programa hacia código que nunca fue hecho para ejecutar; y junto a ellas mitigaciones derivadas de PaX, SafeStack y asignadores de memoria endurecidos. PBSD conserva todo eso y cambia la forma de la pregunta que hay debajo — de “¿este proceso tiene permiso?” a “¿este proceso posee un descriptor para eso?”

Dos maneras de responder a una misma llamada al sistema

// Ambient authority — the traditional path
int fd = open("/etc/master.passwd", O_RDONLY);
// kernel walks a global namespace, then
// checks uid/gid/MAC after the fact

// Handle nucleus — the PBSD path
auto f = dir_handle.open("master.passwd", Rights::Read);
// there is no global namespace to walk.
// no handle, no name, no operation.

Forma ilustrativa de la diferencia, no un listado literal de las llamadas que un programa hace al kernel — su interfaz de programación de aplicaciones, o API. El modelo de referencia está en docs/.

Dos modelos de autoridad comparados lado a lado: con autoridad ambiental el proceso alcanza sockets, exec y ptrace y solo se le niega el archivo de contraseñas después de pedirlo; con el núcleo de descriptores solo puede nombrarse el recurso para el que posee un descriptor
desplaza para ver el diagrama completo →
Dónde ocurre la comprobación. A la izquierda la petición siempre viaja y se juzga después. A la derecha, tres de las cuatro operaciones no tienen nombre con el que pedir, así que no hay nada que negar.
Interactivo

Sigue una llamada al sistema a través del núcleo

Dale al proceso algunos descriptores, elige algo que intente hacer y cambia entre los dos modelos de autoridad. El veredicto y el razonamiento se calculan en vivo en tu navegador — esto es un modelo didáctico del diseño, no un emulador de kernel.

Núcleo de capacidades — monitor de referencia

El proceso intenta…

Traza

Descriptores que posee el proceso

Veredicto

A la espera de un intento
Elige una operación para pasarla por el monitor.
Alcanzable
0
Denegado
0

“Alcanzable” cuenta cuántas de las operaciones listadas podría llegar a hacer este proceso bajo el modelo actual. Con autoridad ambiental, la alcanzabilidad la decide la identidad; con el núcleo, los descriptores que realmente posee.

Un modelo pedagógico del diseño de seguridad de PBSD, escrito para esta página. El núcleo real está en pbsd/; la especificación está en docs/specs/.
El port

Cuatro etapas, y un modelo que nunca se certifica a sí mismo

Portar a mano el espacio de usuario y el kernel de una Distribución de Software de Berkeley (BSD) a C++23 es una década de trabajo. Portarlo pidiéndole a un modelo de lenguaje que reescriba archivos es una forma rápida de producir basura verosímil. PBSD no hace ninguna de las dos cosas.

La cadena de port de ParanoidBSD: inventario, pasadas deterministas, bucle con agentes y un control de verificación, con los archivos rechazados volviendo al bucle
desplaza para ver el diagrama completo →
Cómo un archivo pasa a ser un archivo portado. El camino rojo discontinuo es la parte que importa — el trabajo que no pasa la verificación vuelve al bucle en lugar de contar como progreso.
Etapa 1

Inventario

tools/inventory_c_sources.py y clang_cxx23_port.py puntúan cada archivo C por dificultad y escriben c_inventory.csv. Nada se da por supuesto sobre el alcance.

Etapa 2

Pasadas deterministas

run_todo_passes.py aplica reescrituras mecánicas seguras en los niveles 0–4. Sin modelo de por medio. Lo que una pasada rechaza se registra en refusals.jsonl en lugar de forzarlo.

Etapa 3

Bucle con agentes

pbsd.py rellena los archivos sin resolver y los rechazados con DeepSeek Flash, escalando a Pro con el máximo esfuerzo de razonamiento — 48 workers Flash y 24 Pro por defecto. Esto es lo que financia el Kickstarter.

Etapa 4

Control de verificación

Compilación, ASan, UBSan, ejecución diferencial y comparación al nivel de la representación intermedia (IR) del compilador. Un archivo que solo compila está sin verificar. Los fallos van a parar a agent_port_failures.jsonl.

El demonio de BSD mostrado dos veces: a la izquierda la mascota roja original, a la derecha la misma figura dibujada como estructura de alambre cian, con un signo de igualdad entre ambas
El proyecto en una imagen. El mismo demonio, la misma forma, reconstruido en otra representación — y el signo de igualdad es la parte que hay que ganarse, archivo por archivo, mediante verificación diferencial. BSD Daemon © Marshall Kirk McKusick.
Lo que tiene que significar “igual”

Un port es una afirmación de equivalencia

Decir que un archivo está portado es decir que el nuevo se comporta como el viejo. Eso es una afirmación, y las afirmaciones necesitan pruebas. Una reescritura en C++23 que compila es una estructura de alambre de aspecto verosímil; todavía no es el mismo demonio.

Así que el signo de igualdad es el control. La ejecución diferencial ejecuta los dos y compara el comportamiento observable. La comparación de IR comprueba que signifiquen lo mismo para el compilador. Hasta que una de las dos pasa, el archivo sigue abierto en el registro de migración y no cuenta como progreso — por acabado que parezca.

La regla que hace esto defendible: el modelo no se certifica a sí mismo. Él propone; las herramientas deterministas disponen. Todos los innegociables del repositorio existen para mantener intacta esa frontera — que es también la razón por la que el port no se puede acelerar solo gastando más en inferencia.
Innegociables

Reglas que el repositorio cumple de verdad

Ningún archivo está hecho hasta que pasa la verificación diferencial o de IR
Que solo compile se trata como no verificado. Un archivo portado tiene que producir un comportamiento observable idéntico al original de HardenedBSD bajo ejecución diferencial, o coincidir a nivel de IR. Los archivos que no pasan ninguna de las dos siguen abiertos en el registro de migración y no se cuentan en las cifras de progreso.
Portar con fidelidad — no “arreglar” en silencio los fallos del original
El árbol de HardenedBSD es la especificación de comportamiento. Si el original tiene un defecto, el port lo reproduce, porque una prueba diferencial no puede distinguir un arreglo de una regresión. Las mejoras se hacen después y se registran aparte, para que el cambio quede visible y revisable en lugar de enterrado dentro de una traducción.
Primero las herramientas deterministas; los modelos rellenan solo lo que queda
Las reescrituras mecánicas las aplican scripts que se comportan igual en cada ejecución. Los modelos se usan exclusivamente sobre el residuo — entradas de inventario sin resolver y archivos que las pasadas deterministas rechazaron. Esto mantiene reproducible y auditable la mayor parte del port, y confina la salida del modelo a las partes que un humano habría tenido que escribir a mano de todos modos.
El C++ del kernel es independiente: -fno-exceptions -fno-rtti
El núcleo del kernel no puede depender de un entorno de ejecución de C++ alojado. Sin excepciones, sin información de tipos en tiempo de ejecución (RTTI), sin rutas de la biblioteca estándar que reserven en el montón al entrar al kernel. Las restricciones están escritas en docs/specs/KERNEL_CXX_ABI.md para que quien colabore pueda saber qué es legal en contexto de kernel sin adivinar.
Cada módulo necesita una entrada de procedencia antes de contar como hecho
docs/PROVENANCE.md registra de dónde salió cada módulo y bajo qué licencia. Esto es lo que hace que la declaración de licencias de abajo sea verificable y no un deseo — puedes comprobar, módulo a módulo, qué código deriva de HardenedBSD y cuál es trabajo nuevo de PBSD.
Licencias

Dos licencias, separadas con honestidad

El código nuevo de PBSD — el núcleo, los módulos de C++23, las herramientas — se ofrece bajo los términos estándar de Imortek: la Licencia Pública General Affero de GNU (AGPL-3.0+), gratis para uso personal, entidades benéficas, educación y organizaciones por debajo de 50.000 dólares australianos (AUD) al año, con una licencia comercial por tramos por encima de eso.

El código derivado de HardenedBSD se queda bajo su licencia BSD original. No se puede relicenciar, e Imortek no pretende hacerlo. docs/PROVENANCE.md es el registro de qué es qué.

Términos completos de licencia →
AGPL-3.0+ y comercial

Trabajo nuevo de PBSD

pbsd/, tools/, scripts/, el núcleo de capacidades, UDA, BIFROST, el compositor y el tema.

BSD (sin cambios)

Derivado de HardenedBSD

hbsd/ y todo archivo portado que se remonte a él. Términos originales, atribución original.

Para quién es

Un sistema operativo en el que es más difícil entrar

La mayoría de las intrusiones aprovechan el mismo tipo de error: un programa que llega a memoria que nunca debió tocar. ParanoidBSD reconstruye un sistema de confianza en un lenguaje que hace ese error mucho más difícil, y le da a cada programa solo el acceso que realmente necesita.

01

Proveedores de defensa y de la administración pública

Los compradores empiezan a exigir software construido en lenguajes que cierran clases enteras de ataque. Empezar otra vez desde cero cuesta una década. Esto, en cambio, traslada un sistema ya probado, y guarda un registro escrito de cada archivo que cambió y de cómo se comprobó ese cambio.

02

Equipos que pasan años desplegados

Controladores de fábrica, máquinas médicas, equipos de servicios públicos. Cuando aparece un fallo, muchas veces no se puede sencillamente enviar una actualización. Esto limita hasta dónde llega un intruso una vez está dentro, porque ningún programa puede alcanzar nada más allá de lo que se le entregó.

03

Universidades e investigadores de seguridad

Un sistema operativo real, lo bastante pequeño para leerlo de principio a fin, con el original al lado para comparar. Útil para enseñar y para probar ideas sobre algo que de verdad funciona.

¿Reconoces aquí tu situación? Esto está abierto a pruebas beta ahora, y las personas para las que está hecho son aquellas cuyos comentarios de verdad lo cambian. Hazte probador beta →
Kickstarter en marcha · cierra el 12 de noviembre de 2026

El port depende de un cómputo del que no dispone

Las pasadas deterministas son gratis. El bucle con agentes que rellena el residuo — y las ejecuciones de verificación que lo controlan — no lo son. Eso es todo lo que se pide.