Como posso desabilitar temporariamente o ASLR (randomização do layout do espaço de endereço)?

Respostas:

75

De acordo com um artigo Qual a eficácia do ASLR nos sistemas Linux? , você pode configurar o ASLR no Linux usando a /proc/sys/kernel/randomize_va_spaceinterface

Os seguintes valores são suportados:

  • 0 - Sem randomização. Tudo estático.
  • 1 - Randomização conservadora. Bibliotecas compartilhadas, pilha mmap(), VDSO e heap são randomizados.
  • 2 - Randomização completa. Além dos elementos listados no ponto anterior, a memória gerenciada brk()também é aleatória.

Então, para desativá-lo, execute

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

e para habilitá-lo novamente, execute

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

Isso não sobreviverá a uma reinicialização, então você precisará configurá-lo sysctl. Adicione um arquivo /etc/sysctl.d/01-disable-aslr.confcontendo:

kernel.randomize_va_space = 0

deve desativar permanentemente isso.

gertvdijk
fonte
11
O que exatamente é "Randomização completa"? Isso inclui o próprio executável? E o que é brk()?
Shuzheng 15/02
26

A /proc/sys/kernel/randomize_va_spaceinterface controla o sistema ASLR.

Se você não deseja uma alteração em todo o sistema, use a ADDR_NO_RANDOMIZE personalidade para desativar temporariamente o ASLR. O controle desse sinalizador de personalidade pode ser feito com setarche sua -Ropção (página de manual ), precedendo um comando.

Acho realmente conveniente abrir um shell completamente novo usando:

setarch `uname -m` -R /bin/bash

Isso abrirá um novo shell Bash para você com o ASLR desativado, incluindo todos os processos filhos (os programas são executados nesse shell).

Apenas exita concha quando terminar.


A propósito, no i386, ulimit -s unlimitedpode "desativar" o ASLR.


EDIT (abril de 2016): ulimit -s unlimitedfoi corrigido e atribuído o CVE-2016-3672 .

youfu
fonte
Pequenos detalhes no espírito do util-linux: em vez de uname -mum também poderia ser usado arch, um binário que essencialmente faz o mesmo.
drumfire
11
@drumfire archnão está disponível como um applet busybox
Youfu
+1 por voltar dois anos depois e adicionar as informações sobre o CVE.
Multisync
3

As formas mais permanentes de desativar o ASLR devem ser mantidas em uma VM por razões óbvias.

para testar a capacidade de sobrescrever os endereços de retorno do quadro da pilha, etc., você precisará compilar sem canários da pilha -fno-stack-protector, enquanto permitir executar código na pilha com a qual você precisa compilar -z execstack, tornando

$ gcc -fno-stack-protector -z execstack -o <my_program> my_code.c
Nova pessoa
fonte
2

Você pode usar apenas sudo sysctl kernel.randomize_va_space=0para desativar temporariamente o ASLR.

lzutao
fonte