Principal · ParanoidBSD

Um sistema operacional em que a autoridade é detida, não presumida

Quase toda invasão funciona do mesmo jeito: um programa alcança algo em que nunca deveria tocar. O ParanoidBSD é um sistema operacional construído para que ele não consiga. Cada programa recebe só o que precisa, e todo o resto não é apenas proibido — está fora de alcance. Construído sobre o HardenedBSD, reescrito em C++ moderno, com o original guardado ao lado para que cada mudança possa ser conferida contra ele.

LinguagemC / C++23
BaseHardenedBSD 15-STABLE
Área de trabalhoKDE Plasma 6
Último enviohá pouco
Estrelas—
Estrutura do repositório
pbsd/Módulos de C++23 — núcleo do kernel, portes de userland, UDA, BIFROST, compositor, tema
hbsd/Código do HardenedBSD 15-STABLE — o original, mantido como especificação
kde/Plasma 6, KWin e frameworks para a fase do desktop
tools/Inventário, passagens determinísticas de reescrita, porte por agentes, utilitários de Clang
docs/Especificações, modelo de segurança, estado da migração, procedência
scripts/Script condutor do Subsistema do Windows para Linux (WSL), watchdog, console de progresso
Em português claro

O que isto é, em um minuto

O problema

Um sistema operacional fica embaixo de tudo o mais que uma organização roda. A maioria é feita sobre décadas de código antigo e deixa qualquer programa pedir qualquer coisa — o sistema decide depois se permite. É por isso que uma falha em algo inofensivo, como o código que desenha uma fonte na tela, pode terminar em senhas roubadas.

A solução

O ParanoidBSD muda o que um programa consegue pedir, de saída. Em vez de checar a permissão depois do pedido, entrega a cada programa uma lista curta do que ele pode tocar e não lhe dá jeito nenhum de nomear o resto. Uma falha em uma parte deixa de ser um caminho para as outras.

Para quem é

Fornecedores de defesa e de governo a quem agora se pede software escrito em linguagens mais seguras. Equipamentos que ficam anos em campo e não dá para corrigir rápido — controladores de fábrica, máquinas médicas, hardware de concessionárias. Professores e pesquisadores que querem um sistema operacional de verdade, pequeno o bastante para ler de ponta a ponta.

A segurança não deveria começar na camada de aplicação. Deveria começar no sistema operacional que está embaixo dela. O resto desta página é a engenharia: o que foi mudado, como foi conferido e o que ainda não está pronto.
O problema

Autoridade ambiente é o bug que não dá para corrigir

Em um Unix convencional, um processo não detém o direito de abrir /etc/master.passwd. Ele simplesmente pede, e o kernel decide depois, com base em quem o processo diz ser. Todo processo consegue nomear todo recurso do sistema. O espaço de nomes é global e ambiente; a verificação é um acréscimo tardio.

É por isso que um único bug de parsing em um renderizador de fontes pode virar roubo de credenciais. O renderizador nunca precisou do arquivo de senhas — mas nada na arquitetura o impediu de pedir.

O HardenedBSD já faz trabalho sério aqui: a Aleatorização do Layout do Espaço de Endereçamento (ASLR), que carrega o programa em um lugar diferente a cada vez, para que o atacante não consiga adivinhar onde está o quê; a Integridade de Fluxo de Controle (CFI), que impede que o programa seja desviado para código que ele nunca foi feito para executar; e, ao lado delas, mitigações derivadas do PaX, SafeStack e alocadores de memória endurecidos. O PBSD mantém tudo isso e muda o formato da pergunta que está por baixo — de “este processo tem permissão?” para “este processo detém um descritor para aquilo?”

Dois jeitos de responder a uma chamada de 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.

Formato ilustrativo da diferença, não uma listagem literal das chamadas que um programa faz ao kernel — a sua Interface de Programação de Aplicações, ou API. O modelo autoritativo está em docs/.

Dois modelos de autoridade lado a lado: sob autoridade ambiente o processo alcança sockets, exec e ptrace e só tem o arquivo de senhas negado depois de pedir; sob o núcleo de descritores só o recurso para o qual ele detém um descritor pode sequer ser nomeado
role para ver o diagrama inteiro →
Onde a verificação acontece. À esquerda, o pedido sempre viaja e é julgado depois. À direita, três das quatro operações não têm nome com que pedir, então não há o que negar.
Interativo

Acompanhe uma chamada de sistema atravessando o núcleo

Dê alguns descritores ao processo, escolha algo para ele tentar e alterne entre os dois modelos de autoridade. O veredito e o raciocínio são calculados ao vivo no seu navegador — este é um modelo didático do projeto, não um emulador de kernel.

Núcleo de capacidades — monitor de referência

O processo tenta…

Rastro

Descritores detidos pelo processo

Veredito

Aguardando tentativa
Escolha uma operação para passá-la pelo monitor.
Alcançáveis
0
Negadas
0

“Alcançáveis” conta quantas das operações listadas este processo conseguiria executar sob o modelo atual. Sob autoridade ambiente, o alcance é decidido pela identidade; sob o núcleo, pelos descritores que ele de fato detém.

Um modelo didático do projeto de segurança do PBSD, escrito para esta página. O núcleo de verdade fica em pbsd/; a especificação está em docs/specs/.
O porte

Quatro etapas, e um modelo que nunca certifica a si mesmo

Portar à mão o userland e o kernel de um Berkeley Software Distribution (BSD) para C++23 é uma década de trabalho. Portar pedindo a um modelo de linguagem que reescreva os arquivos é um jeito rápido de produzir lixo plausível. O PBSD não faz nem uma coisa nem outra.

O pipeline de porte do ParanoidBSD: inventário, passagens determinísticas, loop de agentes e um controle de verificação, com os arquivos rejeitados voltando para o loop
role para ver o diagrama inteiro →
Como um arquivo vira um arquivo portado. O caminho vermelho tracejado é a parte que importa — o trabalho que não passa na verificação volta para o loop em vez de contar como progresso.
Etapa 1

Inventário

tools/inventory_c_sources.py e clang_cxx23_port.py pontuam cada arquivo C por dificuldade e escrevem c_inventory.csv. Nada sobre o escopo é chutado.

Etapa 2

Passagens determinísticas

run_todo_passes.py aplica reescritas mecânicas seguras nos níveis 0–4. Nenhum modelo envolvido. Tudo o que uma passagem recusa é registrado em refusals.jsonl em vez de ser forçado.

Etapa 3

Loop de agentes

pbsd.py preenche os arquivos deixados como esboço e os recusados com DeepSeek Flash escalando para Pro no esforço de raciocínio máximo — 48 workers Flash e 24 Pro por padrão. É isto que o Kickstarter financia.

Etapa 4

Controle de verificação

Compilação, ASan, UBSan, execução diferencial e comparação no nível da Representação Intermediária (IR) do compilador. Um arquivo que só compila fica não verificado. As falhas vão parar em agent_port_failures.jsonl.

O daemon do BSD mostrado duas vezes: à esquerda o mascote vermelho original, à direita a mesma figura desenhada como um wireframe ciano, com um sinal de igual entre os dois
O projeto em uma imagem. Mesmo daemon, mesma forma, reconstruído em outra representação — e o sinal de igual é a parte que precisa ser conquistada, arquivo por arquivo, pela verificação diferencial. BSD Daemon © Marshall Kirk McKusick.
O que “igual” tem que significar

Um porte é uma afirmação de equivalência

Dizer que um arquivo foi portado é dizer que o novo se comporta como o antigo. Isso é uma afirmação, e afirmações precisam de evidência. Uma reescrita em C++23 que compila é um wireframe de aparência plausível; ainda não é o mesmo daemon.

Por isso o sinal de igual é o controle. A execução diferencial roda os dois e compara o comportamento observável. A comparação de IR confere se os dois significam a mesma coisa para o compilador. Até que uma das duas passe, o arquivo continua em aberto no registro de migração e não conta como progresso — por mais pronto que pareça.

A regra que torna isso defensável: o modelo não certifica a si mesmo. Ele propõe; as ferramentas determinísticas dispõem. Todo ponto inegociável do repositório existe para manter essa fronteira intacta — o que também explica por que o porte não fica simplesmente mais rápido só gastando mais em inferência.
Pontos inegociáveis

Regras que o repositório de fato cumpre

Nenhum arquivo está pronto até passar na verificação diferencial ou de IR
Compilar e nada mais é tratado como não verificado. Um arquivo portado precisa ou produzir comportamento observável idêntico ao original do HardenedBSD sob execução diferencial, ou bater no nível de IR. Os arquivos que não passam em nenhuma das duas continuam em aberto no registro de migração e não entram nos números de progresso.
Porte com fidelidade — não “conserte” bugs do original em silêncio
A árvore do HardenedBSD é a especificação de comportamento. Se o original tem um defeito, o porte o reproduz, porque um teste diferencial não consegue distinguir uma correção de uma regressão. As melhorias vêm depois, registradas à parte, para que a mudança fique visível e revisável em vez de enterrada dentro de uma tradução.
Ferramentas determinísticas primeiro; os modelos preenchem só o que sobra
As reescritas mecânicas são aplicadas por scripts que se comportam de forma idêntica a cada execução. Os modelos são usados exclusivamente no resíduo — entradas de inventário deixadas como esboço e arquivos que as passagens determinísticas recusaram. Isso mantém a maior parte do porte reproduzível e auditável, e confina a saída dos modelos às partes que um humano teria de escrever à mão de qualquer jeito.
O C++ de kernel é independente: -fno-exceptions -fno-rtti
O núcleo do kernel não pode depender de um runtime C++ hospedado. Sem exceções, sem Informação de Tipo em Tempo de Execução (RTTI), sem caminhos da biblioteca padrão que alocam no heap na entrada do kernel. As restrições estão escritas em docs/specs/KERNEL_CXX_ABI.md para que um colaborador saiba o que é permitido em contexto de kernel sem ter de adivinhar.
Todo módulo precisa de uma entrada de procedência antes de contar como pronto
docs/PROVENANCE.md registra de onde veio cada módulo e sob qual licença. É isso que torna a declaração de licenciamento abaixo verificável em vez de aspiracional — você pode conferir, módulo a módulo, qual código deriva do HardenedBSD e qual é trabalho novo do PBSD.
Licenciamento

Duas licenças, honestamente separadas

O código novo do PBSD — o núcleo, os módulos C++23, as ferramentas — é oferecido sob os termos padrão da Imortek: a Licença Pública Geral Affero do GNU (AGPL-3.0+), grátis para uso pessoal, entidades beneficentes, educação e organizações com menos de 50.000 dólares australianos (AUD) por ano, com uma licença comercial em faixas acima disso.

O código derivado do HardenedBSD permanece sob a licença BSD original. Não pode ser relicenciado, e a Imortek não pretende fazê-lo. docs/PROVENANCE.md é o registro de qual é qual.

Termos completos de licenciamento →
AGPL-3.0+ e comercial

Trabalho novo do PBSD

pbsd/, tools/, scripts/, o núcleo de capacidades, UDA, BIFROST, compositor e tema.

BSD (inalterada)

Derivado do HardenedBSD

hbsd/ e todo arquivo portado que vem dela. Termos originais, atribuição original.

Para quem é

Um sistema operacional mais difícil de invadir

A maioria das invasões explora o mesmo tipo de erro: um programa alcançando memória que ele nunca deveria tocar. O ParanoidBSD reconstrói um sistema confiável em uma linguagem que torna esse erro muito mais difícil, e entrega a cada programa só o acesso de que ele realmente precisa.

01

Fornecedores de defesa e governo

Os compradores começam a exigir software escrito em linguagens que barram classes inteiras de ataque. Começar do zero custa uma década. Aqui, em vez disso, um sistema já comprovado é transportado, e fica um registro escrito de cada arquivo alterado e de como essa alteração foi conferida.

02

Equipamentos que ficam anos em campo

Controladores de fábrica, máquinas médicas, equipamentos de concessionárias. Quando aparece uma falha, muitas vezes não dá simplesmente para mandar uma atualização. Isto limita até onde um invasor chega depois de entrar, porque nenhum programa consegue alcançar além do que lhe foi entregue.

03

Universidades e pesquisadores de segurança

Um sistema operacional de verdade, pequeno o bastante para ser lido de ponta a ponta, com o original ao lado para comparar. Útil para ensinar e para testar ideias em algo que realmente roda.

Reconhece a sua situação aqui? Isto está aberto para teste beta agora, e as pessoas para quem ele é construído são aquelas cujo retorno de fato o muda. Seja um testador beta →
Kickstarter no ar · encerra em 12 de novembro de 2026

O porte depende de computação que ele não tem

As passagens determinísticas são de graça. O loop de agentes que preenche o resíduo — e as execuções de verificação que o controlam — não são. É isso o que está sendo pedido.