fbpx

Android – Binder Driver Use-After-Free

Android – Binder Driver Use-After-Free

O seguinte problema existe no ramo android-msm-wahoo-4.4-pie de https://android.googlesource.com/kernel/msm (e possivelmente em outros):

Há um uso após a liberação do membro de espera na estrutura binder_thread no driver do fichário em /drivers/android/binder.c.

Conforme descrito no commit upstream:
“Binder_poll () passa a fila de espera thread> espera
pode ser dormido para o trabalho. Quando um encadeamento que usa
o epoll sai explicitamente usando BINDER_THREAD_EXIT,
a fila de espera é liberada, mas nunca é removida
da estrutura de dados epoll correspondente. Quando
o processo é encerrado posteriormente, a limpeza do epoll
O código tenta acessar a lista de espera, o que resulta em
um uso após livre “.

A seguinte prova de conceito mostrará a falha do UAF em uma compilação do kernel com o KASAN (do relatório de erros 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);
        }

Esse 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 no 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 vulneráveis com base na revisão do código-fonte são (referindo-se às versões 8.x, a menos que indicado de outra forma):

1) Pixel 2 with Android 9 and Android 10 preview (https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-wahoo-4.4-q-preview-6/)
2) Huawei P20
3) Xiaomi Redmi 5A
4) Xiaomi Redmi Note 5
5) Xiaomi A1
6) Oppo A3
7) Moto Z3
8) Oreo LG phones (run same kernel according to website)
9) Samsung S7, S8, S9 

* Temos evidências de que esse bug está sendo usado na natureza. Portanto, esse bug está sujeito a um prazo de divulgação de 7 dias. Após 7 dias ou um patch foi disponibilizado amplamente (o que ocorrer primeiro), o relatório de bug ficará visível ao público. *

Confirmado que essa prova de conceito funciona no Pixel 2 com o build walleye_kasan-userdebug 10 QP1A.191105.0035899767, causando um acidente na KASAN. Prova do código do conceito C e new.out em anexo. Saída do console KASAN conectada.

Recebi informações técnicas da TAG e de terceiros sobre uma exploração do Android atribuída ao grupo NSO. Esses detalhes incluíam fatos sobre a metodologia de bugs e exploração, incluindo, entre outros:
* É uma escalação de privilégios do kernel usando uma vulnerabilidade livre de uso posterior, acessível de dentro da sandbox do Chrome.
* O bug estava sendo usado ou vendido pelo NSO Group.
* Funciona nos pixels 1 e 2, mas não nos pixels 3 e 3a.
* Foi corrigido no kernel do Linux> = 4.14 sem um CVE.
* CONFIG_DEBUG_LIST quebra o primitivo.
* CONFIG_ARM64_UAO dificulta a exploração.
* A vulnerabilidade é explorável nos processos de renderização do Chrome no domínio SELinux do ‘isolated_app’ do Android, levando-nos a suspeitar do Binder como o componente vulnerável.
* A exploração requer pouca ou nenhuma personalização por dispositivo.
* Uma lista de dispositivos afetados e não afetados, suas versões e muito mais. Uma lista não exaustiva está disponível na descrição deste problema.

Usando esses detalhes, determinei que o bug usado é quase certamente o deste relatório, pois excluí outros candidatos em potencial comparando patches. Uma explicação mais detalhada desse bug e a metodologia para identificá-lo serão escritas em um próximo post do blog quando eu encontrar o tempo.

Atualmente, não temos uma amostra da exploração. Sem amostras, não conseguimos confirmar a linha do tempo nem a carga útil.

O bug é uma vulnerabilidade de escalação de privilégios local que permite o comprometimento total de um dispositivo vulnerável. Se a exploração for entregue pela Web, ela só precisará ser emparelhada com uma exploração do renderizador, pois essa vulnerabilidade pode ser acessada através da sandbox.

Anexei uma prova de conceito de exploração local para demonstrar como esse bug pode ser usado para obter leitura / gravação arbitrária do kernel quando executado localmente. Requer apenas a execução não confiável do código do aplicativo para explorar o CVE-2019-2215. Também anexei uma captura de tela (success.png) do POC em execução em um Pixel 2, executando o Android 10 com nível de patch de segurança em 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 requer, por si só, a instalação de um aplicativo mal-intencionado para possível exploração. Quaisquer outros vetores, como o navegador da web, exigem encadeamento com uma exploração adicional. Notificamos os parceiros do Android e o patch está disponível no Kernel comum do Android. Os dispositivos Pixel 3 e 3a não são vulneráveis, enquanto os dispositivos Pixel 1 e 2 receberão atualizações para esse problema como parte da atualização de outubro “.

Prova de conceito:
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47463.zip

11 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

[email protected]

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900
[email protected]

Copyright © Linux Force Security  - Desde 2011.