Contents

O que é uma vulnerabilidade Use-After-Free (UAF)?

O termo “Use-After-Free” (“UAF”) refere-se a uma vulnerabilidade prevalecente de corrupção de memória que continua a ser um perigo considerável para várias formas de software, desde sistemas operativos a aplicações. Esta grave falha de segurança surge quando uma aplicação tenta recuperar informações de uma localização de memória que foi previamente libertada, levando à designação “use-after-free”.

As vulnerabilidades de entrada não validada (UAF) podem resultar na exploração de software ou mesmo no comprometimento de todo um sistema. Compreender a natureza deste tipo de vulnerabilidade, as suas causas e as medidas para a mitigar são cruciais para garantir a segurança das aplicações de software.

O que é a vulnerabilidade Use-After-Free (UAF)?

/pt/images/memory-allocation-diagram.jpg

Antes de nos aprofundarmos nos meandros da vulnerabilidade Use-After-Free, é prudente familiarizarmo-nos primeiro com certos princípios fundamentais que regem a gestão da memória. Quando um programa é iniciado, tanto os seus dados como as suas instruções são carregados para o espaço de memória.

A gestão da memória refere-se à administração metódica da atribuição e desalocação de espaço de armazenamento na memória de um computador, especificamente com o objetivo de otimizar a retenção dos dados do programa e do código executável. Existem geralmente duas regiões primárias nas quais esses dados residem, conhecidas como pilha e heap.

A alocação de memória estática refere-se ao processo de reservar uma quantidade fixa de espaço de memória para um programa em tempo de compilação, enquanto a alocação de memória dinâmica envolve a alocação de espaço de memória durante o tempo de execução usando funções como malloc(), calloc() ou realloc(). Quando os programadores não gerem corretamente a atribuição e a desalocação de memória dinâmica, podem criar condições que permitam a ocorrência de uma vulnerabilidade Use-After-Free (UAF). Essas vulnerabilidades são consideradas uma forma de exploração de heap, exigindo uma compreensão abrangente da manipulação de ponteiros na programação.

O termo “Use-After-Free” (“UAF”) refere-se a uma categoria particular de vulnerabilidades de corrupção de memória que surgem quando um programa tenta aceder a um objeto que já foi libertado pelo sistema, resultando em vários resultados adversos como falhas, fugas de memória, escalada de privilégio (“EOP”) ou mesmo execução arbitrária de código. Para entender o mecanismo subjacente ao UAF e sua exploração, é importante explorar como essa situação surge em primeira instância.

Como é explorado o Use-After-Free (UAF)?

/pt/images/uaf-demo.jpg

O termo “Use-After-Free” (UAF) refere-se a um tipo de memória

 #include <stdio.h>
#include <stdlib.h>

int main() {
    int *All Things N = malloc(sizeof(int));
    *All Things N = 69420;
    printf("Value: %d\n", *All Things N);
    free(All Things N);
    printf("Value?: %d\n", *All Things N);
    return 0;
}
 

Consegue identificar a potencial vulnerabilidade neste trecho de código? Parece que o ponteiro “All Things N” está a ser desalocado com a função “free()”, mas posteriormente invocado com a função “printf()”. Tal inconsistência na gestão da memória pode levar a um comportamento imprevisível do programa, permitindo potencialmente a exploração de escalada de privilégios ou fuga de memória.

Como mitigar o Use-After-Free?

A ocorrência da vulnerabilidade Use-After-Free (UAF) no software é frequentemente atribuída a erros no programa

A adoção de determinadas abordagens recomendadas pode ajudar a mitigar potenciais problemas de corrupção de memória no software, tais como:

Utilizar linguagens de programação seguras em termos de memória, como a Rust, que incorpora salvaguardas inerentes contra o primal

É defendida não só a utilização de uma linguagem de programação segura em termos de memória, mas também a adesão a práticas óptimas, como a atribuição de um valor nulo a um ponteiro depois de este ter sido libertado, de modo a evitar qualquer possibilidade de introdução de uma vulnerabilidade Use-After-Free.

A implementação de técnicas como a OTA (One Time Allocation) e uma política rigorosa de ciclo de vida de objectos pode ajudar a mitigar o risco de um atacante explorar o CVE-2019-8634, impedindo o acesso a objectos de memória libertada. No entanto, deve ter-se em atenção que estas implementações podem resultar num aumento da sobrecarga de memória e desempenho.

Exemplos do mundo real da vulnerabilidade Use-After-Free (UAF)

A descoberta e exploração da vulnerabilidade Use-After-Free (UAF) numa série de contextos do mundo real, incluindo navegadores Web, kernels Android e aplicações comuns, sublinha

A divulgação de vulnerabilidades de entrada não validadas nos navegadores Internet conduziu a casos em que agentes maliciosos executaram código arbitrário, violaram a confidencialidade do utilizador e levaram a cabo ataques de execução remota de código. Um desses casos é o CVE-2021-38008, que capitalizou uma falha de entrada não validada no Google Chrome, permitindo que os adversários executassem remotamente código arbitrário no sistema visado.

A descoberta de várias vulnerabilidades UAF (Unauthorized Access Flaw) nos sistemas operativos Windows/Linux/Android permitiu aos atacantes adquirir privilégios elevados, contornar protocolos de segurança e manter a persistência em sistemas comprometidos. Um número significativo de tais vulnerabilidades UAF continua a ser identificado nos kernels dos sistemas operativos, mesmo atualmente.Recentemente, foi lançada uma versão pública do CVE-2023-3269, que representa mais uma instância de uma vulnerabilidade UAF no kernel do Linux, levando à escalada de privilégios. A presença do CVE-2022-23270, que diz respeito a uma vulnerabilidade UAF no kernel do Windows, reforça ainda mais esta preocupação.

As aplicações de software enfrentam vulnerabilidades conhecidas como Uncontrolled Application Flow (UAF), que podem ser exploradas por atacantes para comprometer o comportamento do programa, resultando em acesso não autorizado ou modificação de dados sensíveis, execução não intencional de códigos maliciosos, falhas no sistema e até mesmo escalonamento de privilégios. Uma vasta gama de programas de software permanece suscetível a tais ataques devido à implementação de práticas de codificação inseguras e técnicas de gestão de memória insuficientes.

Para saber mais sobre as vulnerabilidades Use-After-Free em aplicações do mundo real, pode consultar a página da lista oficial MITRE CVE e ordenar por palavra-chave Use-After-Free.

A alocação eficiente de memória ajuda a tornar o software seguro

Uma estratégia de alocação de memória criteriosa e meticulosamente planeada pode proteger eficazmente as aplicações de serem susceptíveis a falhas elementares de corrupção de memória.

As entidades mencionadas anteriormente, como UAF, TOCTOU, condições de corrida e BOF, estão entre as vulnerabilidades de memória mais comuns que podem ser exploradas. Compreender a gestão da memória da plataforma em que o programa opera pode ajudar a mitigar estes problemas, fornecendo informações sobre a forma como o sistema operativo distribui o programa na sua memória. Este conhecimento permite aos programadores criar software que não só funciona de forma optimizada, mas também segura.

Um ponto de partida adequado para obter uma apreciação da gestão da memória num ambiente Linux, que serve como plataforma operacional globalmente predominante para servidores.