
Prova de conceito de exploit para CVE-2019-2215, uma vulnerabilidade de uso após liberação no driver binder do Android que permite escalonamento local de privilégios em dispositivos vulneráveis.
O seguinte problema existe no branch android-msm-wahoo-4.4-pie do https://android.googlesource.com/kernel/msm (e possivelmente outros):
Há um use-after-free do membro wait na estrutura binder_thread no driver binder em /drivers/android/binder.c.
Conforme descrito no commit upstream: “binder_poll() passa a waitqueue thread->wait que pode ser dormida para trabalho. Quando uma thread que usa epoll sai explicitamente usando BINDER_THREAD_EXIT, a waitqueue é liberada, mas nunca é removida da estrutura de dados epoll correspondente. Quando o processo subsequentemente sai, o código de limpeza epoll tenta acessar a waitlist, o que resulta em um use-after-free.”
A seguinte prova de conceito mostrará a falha UAF em uma compilação de kernel com KASAN (do relatório de bug upstream inicial em https://lore.kernel.org/lkml/[email protected]/): #include <fcntl.h> #include <sys/epoll.h> #include <sys/ioctl.h> #include <unistd.h>
#define BINDER_THREAD_EXIT 0x40046208ul
int main()
{
int fd, epfd;
struct epoll_event event = { .events = EPOLLIN };
fd = open("/dev/binder0", O_RDONLY);
epfd = epoll_create(1000);
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);
ioctl(fd, BINDER_THREAD_EXIT, NULL);
}
Este problema foi corrigido em Dezembro de 2017 no kernel 4.14 LTS [1], no kernel AOSP android 3.18 [2], no kernel AOSP android 4.4 [3], e no kernel AOSP android 4.9 [4], mas o Pixel 2 com o boletim de segurança mais recente ainda é vulnerável com base na revisão do código fonte.
Outros dispositivos que parecem ser vulneráveis com base na revisão do código fonte são (referindo-se a versões 8.x, salvo indicação em contrário):
Temos evidências de que este bug está sendo usado ativamente. Portanto, este bug está sujeito a um prazo de divulgação de 7 dias. Após 7 dias ou quando um patch for amplamente disponibilizado (o que ocorrer primeiro), o relatório do bug se tornará visível ao público.
Confirmado que esta prova de conceito funciona no Pixel 2 com a compilação walleye_kasan-userdebug 10 QP1A.191105.0035899767, causando uma falha KASAN. Código C da prova de conceito e new.out anexados. Saída do console KASAN anexada.
Recebi informações técnicas do TAG e de partes externas sobre um exploit Android atribuído ao grupo NSO. Esses detalhes incluíam fatos sobre o bug e a metodologia do exploit, incluindo, mas não se limitando a:
Usando esses detalhes, determinei que o bug sendo usado é quase certamente o deste relatório, pois descartei outros candidatos potenciais comparando patches. Uma explicação mais detalhada deste bug e da metodologia para identificá-lo será escrita em uma postagem de blog futura quando eu encontrar tempo.
Atualmente não temos uma amostra do exploit. Sem amostras, não conseguimos confirmar nem a linha do tempo nem o payload.
O bug é uma vulnerabilidade de escalada de privilégio local que permite o comprometimento total de um dispositivo vulnerável. Se o exploit for entregue via web, ele só precisa ser emparelhado com um exploit de renderizador, pois esta vulnerabilidade é acessível através do sandbox.
Anexei uma prova de conceito de exploit local para demonstrar como este bug pode ser usado para obter leitura/escrita arbitrária do kernel quando executado localmente. Requer apenas execução de código de aplicativo não confiável para explorar CVE-2019-2215. Também anexei uma captura de tela (success.png) da POC rodando em um Pixel 2, com Android 10 e nível de patch de segurança de setembro de 2019 (google/walleye/walleye:10/QP1A.190711.020/5800535:user/release-keys).
Declaração do fornecedor do Android:
"Este problema é classificado como Alta gravidade no Android e, por si só, requer a instalação de um aplicativo malicioso para exploração potencial. Quaisquer outros vetores, como via navegador da web, exigem encadeamento com um exploit adicional. Notificamos os parceiros Android e o patch está disponível no Android Common Kernel. Os dispositivos Pixel 3 e 3a não são vulneráveis, enquanto os dispositivos Pixel 1 e 2 receberão atualizações para este problema como parte da atualização de outubro."