"... what else memory-related hardening mechanism are in OpenBSD that can be turned on and it is not enabled by default?
Even options would be useful if we have to re-compile the kernel [or programs I use], if minimal source code modification is needed.".
O que eu desenterrei até agora:
Sempre atualize para a última versão estável do Kernel. Consulte também o link . Leia referências como página de recursos de segurança do OpenBSD da Wikipédia .
Recursos de segurança relacionados à memória do OpenBSD:
-
Randomização do layout do espaço de endereço (ASLR): definindo o sysctl vm.randomize_mmap para 1 (deve estar ativado por padrão, mas está desativado no DragonflyBSD e aparentemente não implementado no FreeBSD).
-
Use timingsafe_bcmp (3) e timingsafe_memcmp (3) em vez de bcmp (3) ou memcmp (3 ).
-
Use a variante explicit_bzero (3) em vez de bzero (3) para limpar a memória sensível (como variáveis de senha) .
-
Position Independent Executables (PIE): Link com -pie ou - pic-executable
Crie um executável independente de posição. Atualmente, isso é apenas suportado em plataformas ELF . Os executáveis independentes de posição são semelhantes às bibliotecas compartilhadas, pois são realocados pelo vinculador dinâmico para o endereço virtual que o SO escolhe para eles (o que pode variar entre as chamadas). Como os executáveis normais dinamicamente vinculados, eles podem ser executados e os símbolos definidos no executável não podem ser substituídos por bibliotecas compartilhadas.
-
Randomized mmap (2) : não use MAP_FIXED. Verifique com o mquery.
-
Substitua aleatório (): rand (3) , aleatório (3) e rand48 (3) , etc Substituído por arc4random (3) do BSD .
-
Considere usar reallocarray (3) e recallocarray (3) e freezero (3) para dados confidenciais em vez de malloc (3), calloc (3) ou realloc (3).
-
Proteção contra quebra de pilha (SSP): GCC + Propolice (SSP) ativado por padrão para criar todas as bibliotecas e aplicativos.
-
KERN_STACKGAPRANDOM ( kern.stackgap_random ) Define o intervalo do valor aleatório adicionado ao ponteiro da pilha em cada execução do programa. O valor aleatório é adicionado para tornar a exploração do estouro de buffer um pouco mais difícil. Quanto maior o número, mais difícil é forçar a força adicional, mas também significa maior desperdício de memória. Padrão: 262144 .
-
Use o novo strlcpy (3) e strlcat (3) em vez de strcpy (3), strcat (3 ), strncpy (3) ou strncat (3) - permite cópias seguras de cadeias de caracteres.
-
Use a função strtonum (3) em vez da família atoi (3) e strtol (3) de interfaces.
-
Política W ^ X : uma página pode ser gravável ou executável, mas não ambas. Daí W ^ X. A idéia é criar um segmento .rodata apenas com o atributo PROT_READ, portanto, ele perde o atributo PROT_EXEC.