Reforço
O reforço é aplicado em ficheiros de texto do overlay do build. Para o auditar, basta
lê-los ou compará-los com um diff. Esta página resume cada um.
Linha de arranque do kernel
Todas as entradas do GRUB levam estes parâmetros (o build.sh acrescenta-os a config/grub.cfg):
| Parâmetro | Efeito |
|---|---|
lockdown=confidentiality | Nem o root pode ler a memória do kernel nem carregar nele código não assinado. |
init_on_alloc=1 | A memória é posta a zero ao ser reservada. |
init_on_free=1 | A memória é posta a zero ao ser libertada: menos dados a recuperar num ataque cold boot. |
slab_nomerge | Não mistura caches do alocador do kernel, o que dificulta explorar transbordos de memória. |
page_alloc.shuffle=1 | Distribui aleatoriamente as páginas livres. |
randomize_kstack_offset=on | Deslocamento aleatório da pilha do kernel em cada chamada ao sistema. |
pti=on | Isolamento das tabelas de páginas do kernel (Meltdown). |
mitigations=auto,nosmt | Mitigações de CPU ativas e SMT (hyper-threading) desativado se necessário. |
vsyscall=none | Retira a antiga página vsyscall, de endereço fixo. |
debugfs=off | Sem debugfs. |
apparmor=1 security=apparmor | Ativa o AppArmor como módulo de segurança. |
ipv6.disable=1 | IPv6 completamente desativado. |
sysctl
Ficheiro: /etc/sysctl.d/99-redderos-hardening.conf.
Kernel
| Chave | Valor | Efeito |
|---|---|---|
kernel.kptr_restrict | 2 | Oculta os endereços do kernel, também ao root. |
kernel.dmesg_restrict | 1 | Só o root lê o registo do kernel. |
kernel.printk | 3 3 3 3 | Só erros graves na consola. |
kernel.unprivileged_bpf_disabled | 1 | BPF só para o root. |
net.core.bpf_jit_harden | 2 | Reforça o compilador JIT do BPF. |
kernel.kexec_load_disabled | 1 | Não é possível carregar outro kernel a quente. |
kernel.yama.ptrace_scope | 2 | Só o root pode depurar outros processos. |
kernel.perf_event_paranoid | 3 | Sem perf para utilizadores normais. |
kernel.sysrq | 0 | Teclas mágicas SysRq desativadas. |
kernel.core_pattern | |/bin/false | Nenhum dump de memória chega a ser escrito. |
kernel.unprivileged_userns_clone | 0 | Sem namespaces de utilizador para utilizadores normais. |
dev.tty.ldisc_autoload | 0 | Não carrega disciplinas de linha a pedido. |
vm.unprivileged_userfaultfd | 0 | userfaultfd só para o root. |
vm.swappiness | 0 | Não usar swap (além disso, não há nenhuma). |
Sistema de ficheiros
| Chave | Valor | Efeito |
|---|---|---|
fs.protected_symlinks | 1 | Protege contra armadilhas com ligações simbólicas em /tmp. |
fs.protected_hardlinks | 1 | O mesmo com ligações físicas. |
fs.protected_fifos | 2 | O mesmo com FIFOs. |
fs.protected_regular | 2 | O mesmo com ficheiros normais. |
fs.suid_dumpable | 0 | Os programas setuid não geram dumps. |
Rede
| Chave | Valor | Efeito |
|---|---|---|
net.ipv4.tcp_syncookies | 1 | Resiste a inundações SYN. |
net.ipv4.tcp_rfc1337 | 1 | Proteção TIME-WAIT (RFC 1337). |
net.ipv4.tcp_timestamps | 0 | Sem marcas temporais TCP, que denunciam o relógio. |
net.ipv4.conf.*.rp_filter | 1 | Descarta pacotes com origem falsificada. |
net.ipv4.conf.*.accept_redirects | 0 | Ignora redirecionamentos ICMP. |
net.ipv4.conf.all.secure_redirects | 0 | O mesmo, incluindo os «seguros». |
net.ipv4.conf.all.send_redirects | 0 | Não envia redirecionamentos. |
net.ipv4.conf.all.accept_source_route | 0 | Ignora o encaminhamento pela origem. |
net.ipv4.icmp_echo_ignore_all | 1 | Não responde a ping. |
net.ipv4.ip_forward | 0 | Não reencaminha tráfego. |
O autoteste verifica que cada chave tem o valor esperado (as que não existem no kernel em uso são omitidas, e isso é indicado).
Módulos bloqueados
Ficheiro: /etc/modprobe.d/redderos-blacklist.conf. Cada módulo é substituído por /bin/false, por
isso não pode ser carregado nem à mão.
| Grupo | Módulos |
|---|---|
| Protocolos de rede pouco usados | dccp, sctp, rds, tipc, n-hdlc, ax25, netrom, x25, rose, decnet, econet, af_802154, ipx, appletalk, psnap, p8022 |
| Sistemas de ficheiros pouco usados | cramfs, freevxfs, jffs2, hfs, hfsplus, udf |
| DMA externo e periféricos sem fios | firewire-core, thunderbolt, bluetooth, btusb |
A câmara (uvcvideo) tem uma linha preparada mas comentada: retire o comentário no build para a
desativar por completo.
AppArmor
O Debian e o Ubuntu não carregam perfis do AppArmor em sistemas live. O RedderOS anula essa condição
(/etc/systemd/system/apparmor.service.d/redderos-live.conf) e carrega os perfis de
apparmor-profiles.
Amnésia: systemd e limites
| Ficheiro | Efeito |
|---|---|
systemd/journald.conf.d/redderos.conf | Registos só na RAM (máximo 32 MB), sem reencaminhar para o syslog. |
systemd/coredump.conf.d/redderos.conf | Sem dumps de memória. |
systemd/system.conf.d/redderos.conf | DefaultLimitCORE=0 para tudo o que o systemd arranca. |
security/limits.d/redderos.conf | Limite de dumps a 0 para todos os utilizadores. |
systemd/logind.conf.d/redderos.conf | Ao terminar sessão, não fica vivo nenhum processo do utilizador. |
Além disso, o build mascara os temporizadores do apt, motd-news, e2scrub e fstrim, e
desativa os scripts do sistema live que ativam a swap do disco do computador, os relatórios de
falhas (apport) e o pollinate.
Utilizadores e privilégios
- O
rootestá bloqueado: não é possível iniciar sessão com ele. anon, o utilizador da sessão amnésica, não tem palavra-passe nemsudo. Só a entrada Administrador temporário lhe dásudo, e apenas durante essa sessão.- A única exceção é o
redder-wipe: qualquer utilizador o pode executar como root sem palavra-passe e sem argumentos (/etc/sudoers.d/redderos-wipe). Só apaga a RAM e desliga. - Os utilizadores de perfil são criados na RAM ao abrir o perfil e apagados ao fechá-lo.
umask 077: os ficheiros novos só podem ser lidos pelo seu dono.
Sem administrador, um programa comprometido que seja executado como anon não consegue chegar a root
nem modificar a firewall.
Integridade da ISO
O build gera md5sum.txt e sha256sum.txt com a soma de cada ficheiro da imagem, e um
.sha256 da ISO completa. A assinatura GPG da ISO está pendente.