caminho do arquivo vDSO no kernel do Android x86

0

Estou trabalhando na pesquisa da minha escola sobre o Dirty CoW ( se você não sabe o que é e acha que a implementação pode ser relevante para o meu problema, veja P.S. ). Eu encontrei algumas soluções (ou seja, link ) que usam o Dirty CoW para injetar algum código shell em vDSO. O que está no link é para o desktop Linux, mas também existem soluções para o Android (basicamente idênticas, exceto por algumas alterações).

Estou tentando analisar as soluções existentes e cheguei a um problema: onde está o vDSO armazenado no Android?

As páginas de manual ( link ) dizem que você pode localizar o arquivo usando

find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'

Ao executar um comando similar no meu Ubuntu 64bits ( find / -name '*vdso*' -o -name '*gate*.*so' ), as seguintes linhas estão presentes na saída:

/lib/modules/4.13.0-32-generic/vdso
/lib/modules/4.13.0-32-generic/vdso/vdsox32.so
/lib/modules/4.13.0-32-generic/vdso/vdso32.so
/lib/modules/4.13.0-32-generic/vdso/vdso64.so
/lib/modules/4.13.0-21-generic/vdso
/lib/modules/4.13.0-21-generic/vdso/vdsox32.so
/lib/modules/4.13.0-21-generic/vdso/vdso32.so
/lib/modules/4.13.0-21-generic/vdso/vdso64.so

E usando objdump e hexdump em um deles eu posso ver que é o único, que é mapeado na memória (eu escrevi um programa, que o encontra e o coloca em um arquivo). / p>

No entanto, quando eu corro

adb root
adb shell find -name '*vdso*' -o -name '*gate*.so*'

no meu Android 4.4-r4 x86, a única saída é /proc/sys/vm/vdso_enabled (e o conteúdo do arquivo é 1 ).

Eu sei que há vDSO na memória dos processos, escrevi um programa de dumping executado pelo ADB para isso também. E eu também ajustei o exploit Dirty CoW para injetar meu shellcode no vDSO. Eu posso ver que o shellcode está no vDSO de um aplicativo que eu escrevi e também do programa de dumping que mencionei anteriormente. Meu shellcode está presente apenas no vDSO até que eu reinicie o dispositivo.

Como o vDSO funciona no Android? Existe um arquivo onde é armazenado? Não parece, porque se estivesse lá, o código injetado estaria lá também após a reinicialização. Mas como o shellcode se propaga para os outros processos?

Estou muito grato por suas respostas.

PS: O Dirty CoW é uma vulnerabilidade do kernel do Linux que permite gravar em arquivos somente leitura (ou qualquer coisa que você possa mapear em sua memória) causando uma condição de corrida de dois segmentos - o primeiro um tem um loop onde está escrevendo qualquer texto na memória (seja em / proc/self/mem ou usando ptrace usando mmap para encontrar o lugar certo) e o outro está dizendo ao sistema (também em um loop) que o mesma parte da memória não é mais necessária (usando madvise(MADV_DONTNEED) ).

    
por Topper Harley 15.02.2018 / 13:44

1 resposta

0

O vDSO não é armazenado em um arquivo separado no disco, é parte do kernel e é mapeado no espaço de endereço de cada processo pelo kernel. Os arquivos .so que você encontrou são usados apenas para fins de depuração. O comando find na documentação é dado como um exemplo ao construir o kernel, para encontrar o vDSO gerado na árvore de construção do kernel; não há exigência de que o .so s separado esteja presente em /lib/modules ou em qualquer outro lugar.

O shellcode injetado pelo exploit no qual você está trabalhando se propaga porque existe uma única cópia do vDSO na memória, então qualquer gravação bem sucedida aparece no mapeamento de todos os processos atuais e futuros do vDSO ...

    
por 15.02.2018 / 14:18