FreeBSD: Execução Remota de Código no Kernel via Estouro de Buffer na Pilha em kgssapi.ko (CVE-2026-4747)

✍️ OpenClawRadar📅 Publicado: April 2, 2026🔗 Source
FreeBSD: Execução Remota de Código no Kernel via Estouro de Buffer na Pilha em kgssapi.ko (CVE-2026-4747)
Ad

Detalhes da Vulnerabilidade

A vulnerabilidade existe em sys/rpc/rpcsec_gss/svc_rpcsec_gss.c dentro da função svc_rpc_gss_validate(). Um buffer de pilha de 128 bytes (rpchdr[]) é usado para reconstruir cabeçalhos RPC para verificação de assinatura GSS-API. Após escrever 32 bytes de campos fixos do cabeçalho RPC, a função copia todo o corpo da credencial RPCSEC_GSS (oa_length bytes) no espaço restante sem verificação de limites.

static bool_t svc_rpc_gss_validate(...) {
    int32_t rpchdr[128 / sizeof(int32_t)]; // 128 bytes na pilha
    // ...
    if (oa->oa_length) {
        // BUG: Sem verificação de limites em oa_length!
        // Após 32 bytes de cabeçalho, restam apenas 96 bytes em rpchdr.
        // Se oa_length > 96, isso transborda além de rpchdr
        memcpy((caddr_t)buf, oa->oa_base, oa->oa_length);
    }
}

Superfície de Ataque e Impacto

O módulo vulnerável kgssapi.ko implementa autenticação RPCSEC_GSS para o subsistema RPC do kernel do FreeBSD. O daemon do servidor NFS (nfsd) ouvindo na porta 2049/TCP processa pacotes RPC no contexto do kernel e usa este módulo quando a autenticação RPCSEC_GSS está habilitada. A exploração bem-sucedida resulta em execução remota de código no kernel com privilégios de root (shell reverso uid 0).

Ad

Versões Afetadas

  • FreeBSD 13.5 (<p11)
  • FreeBSD 14.3 (<p10)
  • FreeBSD 14.4 (<p1)
  • FreeBSD 15.0 (<p5)

A Correção

O patch para FreeBSD 14.4-RELEASE-p1 adiciona uma verificação de limites antes da cópia:

if (oa->oa_length > sizeof(rpchdr) - 8 * BYTES_PER_XDR_UNIT) {
    rpc_gss_log_debug("auth length %d exceeds maximum", oa->oa_length);
    client->cl_state = CLIENT_STALE;
    return (FALSE);
}

Análise do Layout da Pilha

Pela desmontagem da função, o array rpchdr está em [rbp-0xc0]. O memcpy escreve em rpchdr + 32 = [rbp-0xa0]. Com um identificador de contexto de 16 bytes no corpo da credencial, o endereço de retorno cai no byte 200 do corpo da credencial, permitindo o controle do fluxo de execução.

📖 Leia a fonte completa: HN AI Agents

Ad

👀 See Also