From: Tulio A M Mendes Date: Tue, 9 Jun 2026 07:30:07 +0000 (-0300) Subject: docs: add urgent security status checklist X-Git-Url: https://projects.tadryanom.me/?a=commitdiff_plain;h=55138c8935b115c51412db1320f72959db8f02c5;p=AdrOS.git docs: add urgent security status checklist Add an updated security status document replacing the outdated phase 2-5 checklist as the immediate planning reference. The document classifies each previously listed item as implemented, partial, or still pending based on direct source inspection, and highlights the urgent remaining work around AIO validation, /proc hardening, futex robustness, fixed virtual addresses, tmpfs hardening, socket copyout review, and kernel RNG quality. --- diff --git a/docs/URGENT_SECURITY_STATUS_2026-06-09.md b/docs/URGENT_SECURITY_STATUS_2026-06-09.md new file mode 100644 index 00000000..d9f3438c --- /dev/null +++ b/docs/URGENT_SECURITY_STATUS_2026-06-09.md @@ -0,0 +1,371 @@ +# Urgent Security Status - 2026-06-09 + +## Objetivo + +Este documento substitui a checklist antiga de fases 2-5 como referência operacional do estado atual do AdrOS. + +A lista anterior ficou parcialmente desatualizada: vários itens já foram implementados, alguns ficaram parcialmente resolvidos e ainda restam gaps reais que merecem ataque prioritário. + +Este documento foi construído com base em verificação direta do código-fonte atual. + +## Resumo Executivo + +### Já implementado + +- SOCK_RAW privilege check +- rumpuser_free alignment handling +- VFS permission checks principais +- execve com verificação de bit executável +- O_NOFOLLOW retornando -ELOOP +- truncate/ftruncate sem fallback permissivo +- fb0_mmap respeitando prot e NX +- mkstemp com retry em colisão +- fcntl varargs em ulibc +- fcntl/openat varargs em newlib/libgloss +- scanf com suporte a field width +- grande parte da infraestrutura de UID/GID no kernel +- SHM com uid/gid/mode básicos e NX por default +- path_resolve_user/copy_user_cstr retornando ENAMETOOLONG em caminhos importantes + +### Parcialmente implementado + +- AIO validation +- /proc access control +- SHM permissions completas +- futex robusto +- tmpfs locking/quotas/overflow hardening +- overlayfs wrapper lifetime +- socket copy_to_user hardening +- POSIX access() estrito +- infraestrutura UID completa de userspace/sessão +- padronização total de ENAMETOOLONG + +### Ainda pendente de verdade + +- remover fixed VAs (KVA_PHYS_MAP / VIRTIO_VRING_VA) +- futex robusto com locking e shared keying correto +- /proc hardening completo +- AIO mode/mount validation completa +- tmpfs quotas e proteção explícita contra overflow no growth path +- CSPRNG real +- getlogin()/who/utmp reais +- revisão final dos copyouts de socket + +## Classificação Atual por Item + +## Fase 2 - Isolamento e Políticas de Segurança + +### H1: AIO fd Mode e Read-Only Mount Validation +Status: PARCIAL + +Evidência atual: +- `src/kernel/syscall.c`: `syscall_aio_rw_impl()` valida ponteiros, tamanho e usa bounce buffer. + +O que falta: +- rejeitar `aio_read` em fd `O_WRONLY` +- rejeitar `aio_write` em fd `O_RDONLY` +- rejeitar escrita em mount `MS_RDONLY` +- idealmente reutilizar a mesma política usada por `read/write/pread/pwrite` + +Prioridade recomendada: ALTA + +### H2: /proc Access Control +Status: PARCIAL + +Evidência atual: +- `src/kernel/procfs.c`: existe `proc_access_check(pid)` +- `/proc//status`, `/proc//maps`, `/proc//cmdline` usam esse check + +O que falta: +- proteger `/proc/dmesg` +- proteger `/proc/cmdline` +- implementar hidepid ou equivalente +- redigir endereços em `/proc//maps` para não-root +- revisar lifetime/snapshot dos dados lidos + +Prioridade recomendada: ALTA + +### H3: SHM Permissões Completas +Status: PARCIAL + +Evidência atual: +- `src/kernel/shm.c` contém `uid`, `gid`, `mode` +- `shm_perm_check()` já usa owner/group/other +- `IPC_STAT`, `IPC_SET`, `IPC_RMID` fazem checagens +- mapeamento aplica `VMM_FLAG_NX` + +O que falta: +- attach read-only no estilo `SHM_RDONLY` +- revisar completude da modelagem SysV/POSIX +- checar se faltam casos de permissão e compatibilidade fina + +Prioridade recomendada: MÉDIA + +### H4: SOCK_RAW Privilege Check +Status: IMPLEMENTADO + +Evidência atual: +- `src/kernel/socket.c`: `SOCK_RAW` exige `current_process->euid == 0` + +Prioridade recomendada: FECHADO + +### H5: Futex Robusto com Spinlock e Shared Memory Keying +Status: PARCIAL + +Evidência atual: +- `src/kernel/syscall.c`: waiters registram `addr`, `addr_space`, `proc` +- isso evita parte do aliasing entre address spaces diferentes + +O que falta: +- spinlock protegendo a tabela global +- chaveamento shared por backing físico ou inode+offset +- coordenação mais robusta entre wait/wake e scheduler +- revisão SMP da tabela e wakeup paths + +Prioridade recomendada: ALTA + +### H6: Remover Fixed VAs +Status: PENDENTE + +Evidência atual: +- `src/hal/x86/mm.c`: ainda usa `KVA_PHYS_MAP` +- `src/drivers/virtio_blk.c`: ainda usa `VIRTIO_VRING_VA 0xC0340000U` + +O que falta: +- alocador de VA kernel para MMIO / DMA / mapeamentos temporários +- remoção de VAs fixas locais +- revisão de colisões potenciais com outros dispositivos + +Prioridade recomendada: ALTA + +### H7: Tmpfs Locking, Quotas e Overflow Validation +Status: PARCIAL + +Evidência atual: +- `src/kernel/tmpfs.c`: existe `g_tmpfs_lock` +- várias operações usam spinlock + +O que falta: +- quota global +- validação explícita de overflow no crescimento de `new_cap *= 2` +- revisar metadados `uid/gid/mode` e consistência completa + +Prioridade recomendada: ALTA + +### H8: rumpuser_free Alignment Handling +Status: IMPLEMENTADO + +Evidência atual: +- `src/rump/rumpuser_adros.c`: aligned allocations guardam magic + raw pointer +- `rumpuser_free()` recupera o ponteiro bruto antes do `kfree` + +Prioridade recomendada: FECHADO + +## Fase 3 - Polimento de VFS e Userspace + +### M1: VFS Permissions / execve Bit Check +Status: IMPLEMENTADO + +Evidência atual: +- `src/kernel/fs.c`: `vfs_check_permission()` usa uid/gid/euid/egid +- `src/kernel/syscall.c`: `execve` verifica execute permission com `vfs_check_permission(node, 1)` + +Prioridade recomendada: FECHADO + +### M2: POSIX access() Completo +Status: PARCIAL + +Evidência atual: +- `src/kernel/syscall.c`: `F_OK/R_OK/W_OK/X_OK` já são tratados + +O que falta: +- usar uid/gid reais, não efetivos, para aderência POSIX estrita + +Prioridade recomendada: MÉDIA + +### M3: O_NOFOLLOW -ELOOP Return +Status: IMPLEMENTADO + +Evidência atual: +- `src/kernel/syscall.c`: final symlink com `O_NOFOLLOW` retorna `-ELOOP` + +Prioridade recomendada: FECHADO + +### M4: Truncate Fallback Remoção +Status: IMPLEMENTADO + +Evidência atual: +- `src/kernel/fs.c`: `vfs_truncate()` e `vfs_truncate_node()` retornam `-ENOSYS` sem backend + +Prioridade recomendada: FECHADO + +### M5: Socket copy_to_user Ignored Failures +Status: PARCIAL + +Evidência atual: +- `src/kernel/syscall.c`: vários caminhos de socket já verificam `copy_to_user` +- `recv`, `recvfrom`, `recvmsg`, `getsockname`, `getpeername`, `accept` foram endurecidos parcialmente + +Risco remanescente: +- alguns paths parecem usar condição invertida com `user_range_ok(...) == 0` antes do `copy_to_user` +- isso precisa revisão manual e correção pontual + +Prioridade recomendada: ALTA + +### M6: Overlayfs Wrapper Lifetime/Refcount +Status: PARCIAL + +Evidência atual: +- `src/kernel/overlayfs.c`: wrapper nodes têm `refcount` +- `overlay_wrap_close()` decrementa e libera + +O que falta: +- revisão de ownership/lifetime em todos os caminhos de uso +- confirmar ausência de wrappers órfãos ou double-free/UAF em cenários complexos + +Prioridade recomendada: MÉDIA + +### M7: fb0_mmap Respeitar prot e NX +Status: IMPLEMENTADO + +Evidência atual: +- `src/drivers/vbe.c`: rejeita `PROT_EXEC`, aplica `VMM_FLAG_NX`, respeita `prot` + +Prioridade recomendada: FECHADO + +### M8: CSPRNG Implementation +Status: PENDENTE + +Evidência atual: +- `src/kernel/devfs.c`: `/dev/random` e `/dev/urandom` usam PRNG simples, não criptográfico +- `src/kernel/kaslr.c`: usa xorshift32 seeded from TSC + +O que falta: +- fonte real de entropia +- CSPRNG central de kernel +- consumidores do sistema apontando para essa fonte + +Prioridade recomendada: ALTA + +### M9: mkstemp Retry Multiple Names +Status: IMPLEMENTADO + +Evidência atual: +- `user/ulibc/src/stdlib.c`: tenta até 100 vezes em caso de `EEXIST` + +Prioridade recomendada: FECHADO + +### M10: fcntl Varargs em ulibc +Status: IMPLEMENTADO + +Evidência atual: +- `user/ulibc/src/unistd.c`: vararg só é lido para comandos que precisam + +Prioridade recomendada: FECHADO + +### M11: newlib libgloss Varargs +Status: IMPLEMENTADO + +Evidência atual: +- `newlib/libgloss/adros/posix_stubs.c`: `fcntl` e `openat` já fazem leitura condicional + +Prioridade recomendada: FECHADO + +### M12: scanf Field Width e Buffer Size +Status: IMPLEMENTADO + +Evidência atual: +- `user/ulibc/src/stdio.c`: `scanf`, `sscanf` e `fscanf` tratam field width explícita + +Prioridade recomendada: FECHADO + +## Fase 4 - Infraestrutura UID + +### UID Infrastructure Completa +Status: PARCIAL + +Evidência atual: +- kernel já possui `getuid/getgid/geteuid/getegid` +- kernel já possui `setuid/setgid/seteuid/setegid/setreuid/setregid` +- fork/clone herdam `uid/gid/euid/egid/suid/sgid` +- job control, sessão e pgrp já existem no kernel + +O que falta: +- `/etc/passwd` real +- autenticação/login real +- integração com utmp/wtmp +- `getlogin()` real +- `who` real +- stubs de passwd/group ainda são hardcoded em partes do userspace/newlib + +Prioridade recomendada: MÉDIA + +## Fase 5 - Low Priority + +### L1: Path Truncation - ENAMETOOLONG +Status: PARCIAL AVANÇADO + +Evidência atual: +- `src/kernel/syscall.c`: `copy_user_cstr()` retorna `-ENAMETOOLONG` +- `src/kernel/syscall.c`: `path_resolve_user()` retorna `-ENAMETOOLONG` + +O que falta: +- padronizar o mesmo comportamento em todos os helpers de path em `fs.c` +- alguns caminhos ainda retornam `-EINVAL` ou operam com truncamento em buffers fixos + +Prioridade recomendada: MÉDIA-BAIXA + +### L2: getlogin/who Session/TTY/utmp +Status: PENDENTE + +Evidência atual: +- `user/ulibc/src/unistd.c`: `getlogin()` retorna fallback fixo +- `user/cmds/who/who.c`: saída fixa placeholder +- `user/ulibc/src/utmp.c`: implementação stub + +Prioridade recomendada: BAIXA + +## Lista Urgente Recomendada + +## Prioridade 1 - Atacar já + +- H1: AIO validation completa +- H2: /proc hardening completo +- H5: futex robusto +- H6: remover fixed VAs +- H7: tmpfs quotas + overflow hardening +- M5: revisão final dos socket copyouts +- M8: CSPRNG real + +## Prioridade 2 - Em seguida + +- H3: SHM permissões/comportamento completos +- M2: access() com real IDs +- M6: overlayfs wrapper lifetime +- Fase 4 restante de userspace/login/passwd +- L1: padronização total de ENAMETOOLONG + +## Prioridade 3 - Baixa + +- L2: getlogin/who/utmp reais + +## Conclusão + +A checklist antiga não deve mais ser usada como retrato fiel do estado atual do projeto. + +O estado real hoje é: + +- muitos itens relevantes já foram corrigidos +- alguns itens centrais ainda estão parciais +- os gaps urgentes se concentram em isolamento, concorrência e política de segurança: + - AIO policy + - /proc hardening + - futex robusto + - fixed VA removal + - tmpfs hardening + - CSPRNG + - revisão final dos copyouts de socket + +## Status do documento + +Documento urgente criado para substituir a checklist desatualizada como referência de planejamento imediato.