it-swarm-pt.tech

Como ocultar símbolos do kernel na imagem do kernel do Linux? Recompliação?

Por que ocultar símbolos do kernel?

Cotação

Qualquer pessoa com conhecimento básico de exploração de kernel sabe o quão importante é a coleta de informações para uma exploração confiável. Essa proteção oculta os símbolos do kernel de vários lugares que um invasor pode usar durante a coleta de informações no estágio de pré-exploração. ... Esta opção também evita o vazamento de endereços do kernel através de várias entradas/proc.

Vazamento de ponteiro de classes de bug/kernel

Alguns lugares são óbvios. /proc/kallsyms pode ser restringido através do sysctl kernel.kptr_restrict=2. Acesso à pasta /boot pode ser restringido através de permissões de arquivo linux ao root apenas e com o apparmor pode ser oculto do root. AppArmor FullSystemPolicy ( apparmor-profile-everything ) Também outros lugares como /lib/modules, system.map e o diretório de origem do kernel.

Para fazer uma pergunta muito específica, ignore outros lugares onde os símbolos do kernel possam vazar. Se quiser enumerá-los, faça sua própria pergunta, aguarde até que eu faça ou adicione um comentário.

Minha pergunta muito específica é sobre o seguinte Quote :

O kernel [...] não é pré-compilado por alguma distribuição

Isso ocorre porque os símbolos do kernel podem ser extraídos da imagem do kernel . Existem ferramentas de código aberto para isso.

(Essa citação é sobre grsecurity, mas estou perguntando sobre não-grsecurity, ou seja, o kernel regular do kernel.org aqui.)

Imagens de kernel de repositórios públicos, como packages.debian.org, são bem conhecidas pelos atacantes. Os invasores podem simplesmente codificar os endereços dos símbolos e, assim, contrariar esforços como kernel.kptr_restrict=2.

Para evitar vazamentos de ponteiro do kernel, a imagem do kernel não pode estar em um estado conhecido público. Precisa ser único, privado, tanto quanto eu entenda. É preciso compilar o kernel sozinho.

Compilações reproduzíveis são um esforço incrível de aumentar a segurança de todos. Entretanto, nesse caso, as construções reproduzíveis resultariam novamente em um kernel com endereços de símbolos bem previsíveis pelos atacantes, porque o kernel do Debian linux já é reproduzível, principalmente reproduzível ou no futuro totalmente reproduzível (eu não acompanhei o desenvolvimento em questão. aquele).

Como ocultar símbolos do kernel da imagem do kernel do linux (vmlinux) de um invasor? Como garantir que meu kernel possua símbolos exclusivos? Existe um parâmetro de inicialização do kernel para isso? Ou é possível, de alguma forma, fornecer ao kernel um arquivo aleatório para que ele possa randomizar seus símbolos? Ou existe alguma maneira de recompilar o kernel de uma maneira que tenha endereços de símbolos exclusivos?

5
adrelanos

O layout de um kernel pré-compilado de distribuição é público. O KASLR tenta alterar o deslocamento base do kernel, alterando todos os endereços por um deslocamento secreto. Infelizmente, o vazamento de um único símbolo permitirá que o restante seja calculado. Como o KASLR não é tão seguro quanto parece, isso é um problema. O perigo de desvio do KASLR através de infoleaks pode ser reduzido apenas ligeiramente, configurando o sysctl kernel.dmesg_restrict=1 Para mitigar vazamentos de printk() . Mesmo assim, o KASLR é um recurso de segurança tão ruim que você não pode usá-lo para ocultar essas informações de maneira confiável dos atacantes locais.

Compilar um kernel manualmente garantirá que você estará usando deslocamentos de símbolos exclusivos. É necessário definir o sysctl kernel.kptr_restrict=2 E restringir o acesso à própria imagem do kernel, bem como aos arquivos relacionados, como o mapa e os módulos carregáveis. Você pode fazer ataques com base no conhecimento da estrutura do kernel um pouco mais difícil se você usar o plug-in RANDSTRUCT da grsecurity, agora no upstream.

1
forest