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)
).