ASA-2019-00086 – Linux: Potencial use-after-free via kvm_ioctl_create_device()


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00086

Identificador(es)

ASA-2019-00086, CVE-2019-6974

Título

Potencial use-after-free via kvm_ioctl_create_device()

Fabricante(s)

The Linux foundation

Produto(s)

Linux

Versão(ões) afetada(s)

Desconhecida

Versão(ões) corrigida(s)

Linux kernel com o seguinte commit:

kvm: fix kvm_ioctl_create_device() reference counting (CVE-2019-6974)
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cfa39381173d5f969daf43582c95ad679189cbc9

Linux kernel 4.20.8
Linux kernel 4.19.21
Linux kernel 4.14.99
Linux kernel 4.9.156

Prova de conceito

Sim

Descrição

Uma vulnerabilidade de use-after-free foi encontrada na maneira como o hypervisor KVM do kernel do Linux implementa sua API de controle de dispositivo. Ao criar um dispositivo por meio de kvm_ioctl_create_device(), o dispositivo mantém uma referência a um objeto de VM, posteriormente essa referência é transferida para a tabela do descritor de arquivos do chamador. Se esse descritor de arquivo fosse fechado, a contagem de referência para o objeto da VM poderia se tornar zero, possivelmente levando a um problema de use-after-free. Um usuário/processo poderia usar essa falha para travar a VM guest, resultando em um problema de negação de serviço ou, potencialmente, obter acesso privilegiado a um sistema.

Detalhes técnicos

kvm_ioctl_create_device() contém o seguinte código:

dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;

dev->ops = ops;
dev->kvm = kvm;

mutex_lock(&kvm->lock);
ret = ops->create(dev, cd->type);
if (ret < 0) { mutex_unlock(&kvm->lock);
kfree(dev);
return ret;
}
list_add(&dev->vm_node, &kvm->devices);
mutex_unlock(&kvm->lock);

if (ops->init)
ops->init(dev);

ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC);
if (ret < 0) { mutex_lock(&kvm->lock);
list_del(&dev->vm_node);
mutex_unlock(&kvm->lock);
ops->destroy(dev);
return ret;
}

kvm_get_kvm(kvm);
cd->fd = ret;

Esse código:

1. cria um dispositivo que contém uma referência ao objeto da VM (com uma referência emprestada, o refcount da VM ainda não foi atacado)
2. inicializa o dispositivo
3. transfere a referência para o dispositivo para a tabela de descritores de arquivos do chamador
4. chama kvm_get_kvm() para transformar a referência emprestada na VM em uma referência real

A transferência de propriedade na etapa 3 não deve acontecer antes que a referência à VM se torne uma referência adequada, não solicitada, o que ocorre somente na etapa 4. Após a etapa 3, um atacante pode fechar o descritor de arquivo e descartar a referência emprestada, que pode fazer com que a referência do objeto kvm caia para zero.

Créditos

Jann Horn (Google Project Zero)

Referência(s)

kvm: fix kvm_ioctl_create_device() reference counting (CVE-2019-6974)
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cfa39381173d5f969daf43582c95ad679189cbc9

Bug 1671913 (CVE-2019-6974) – CVE-2019-6974 Kernel: KVM: potential use-after-free via kvm_ioctl_create_device()
https://bugzilla.redhat.com/show_bug.cgi?id=1671913

ChangeLog-4.20.8
https://cdn.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.20.8

ChangeLog-4.19.21
https://cdn.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.21

ChangeLog-4.14.99
https://cdn.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.14.99

ChangeLog-4.9.156
https://cdn.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.9.156

CVE-2019-6974
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6974

CVE-2019-6974
https://nvd.nist.gov/vuln/detail/CVE-2019-6974

Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.

Última modificação: 5 março 2019

Não somos responsáveis por qualquer perda de dados, corrupção de dispositivos ou qualquer outro tipo de problema devido ao uso de qualquer informação mencionada em nossos alertas de segurança.