Uma correção importante foi incluída nos primeiros pull requests para o ciclo do kernel Linux 6.15, visando resolver uma falha de segurança que comprometia a eficácia da randomização de cache. A falha, descoberta por engenheiros do Google, afetava a função kvmalloc
e resultava no uso da mesma semente de randomização, tornando a proteção CONFIG_RANDOM_KMALLOC_CACHES
ineficaz.
A funcionalidade CONFIG_RANDOM_KMALLOC_CACHES
foi projetada para criar múltiplas cópias de caches SLAB e selecionar aleatoriamente uma delas com base no endereço do código, dificultando a exploração de vulnerabilidades de memória. No entanto, a falha fazia com que a mesma semente aleatória fosse sempre utilizada, comprometendo a aleatoriedade da seleção.
“Isso é problemático porque __kmalloc_node
usará o endereço de retorno como semente para derivar o cache aleatório a ser usado. Como todas as chamadas para kvmalloc_node
usarão a mesma semente quando o tamanho for grande, a proteção se torna completamente inútil,” explicam os comentários no código do Google.
Gong Ruiqi, da Huawei, que desenvolveu a solução para o problema, explicou:
“Isso significa literalmente que todo kmalloc
invocado via kvmalloc
usaria a mesma semente para randomização de cache (CONFIG_RANDOM_KMALLOC_CACHES), o que torna essa proteção não funcional.
A causa raiz desse problema, na minha opinião, é que usar RET_IP
sozinho não consegue identificar o local de alocação real no caso de kmalloc
ser chamado dentro de wrappers não in-line ou funções auxiliares. E acredito que pode haver casos semelhantes em outras funções. No entanto, não pensei em nenhuma boa solução para isso. Então, por enquanto, vamos resolver este caso específico primeiro.
Para __kvmalloc_node_noprof
, substitua __kmalloc_node_noprof
e chame __do_kmalloc_node
diretamente, para que RET_IP
possa pegar o endereço de retorno de kvmalloc
e diferenciar cada invocação de kvmalloc
.”
Com as atualizações SLAB pendentes para a janela de mesclagem do Linux 6.15, essa falha será corrigida e, presumivelmente, será retroportada para kernels estáveis existentes para resolver essa proteção de segurança ineficaz.
Links relevantes:
- Para mais detalhes sobre a correção, consulte o patch no Patchwork do kernel Linux.