ASA-2019-00085 – Linux: Vazamento de memória não inicializada em kvm_inject_page_fault()


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00085

Identificador(es)

ASA-2019-00085, CVE-2019-7222

Título

Vazamento de memória não inicializada em kvm_inject_page_fault()

Fabricante(s)

The Linux foundation

Produto(s)

Linux

Versão(ões) afetada(s)

Desconhecido

Versão(ões) corrigida(s)

Linux kernel com o seguinte commit:

KVM: x86: work around leak of uninitialized stack contents (CVE-2019-7222)
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=353c0956a618a07ba4bbe7ad00ff29fe70e8412a

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

Prova de conceito

Desconhecido

Descrição

Foi encontrado um problema de vazamento de informações na maneira como o hypervisor KVM do kernel Linux tratava as exceções de falha de página enquanto emulava instruções como VMXON, VMCLEAR, VMPTRLD e VMWRITE com o endereço de memória como um operando. Ocorre se o operando for um endereço MMIO, pois o objeto de exceção retornado contém conteúdo da memória da stack não inicializada. Um usuário convidado/processo poderia usar essa falha para vazar o conteúdo da memória da stack do host para um convidado.

Detalhes técnicos

Um número de funções no KVM passa uma estrutura x86_exception não inicializada para kvm_read_guest_virt() e aciona uma exceção de pagefault usando esta estrutura se kvm_read_guest_virt() retornar um valor de erro:

struct x86_exception e;

...
if (kvm_read_guest_virt(vcpu, gva, vmpointer, sizeof(*vmpointer), &e)) {
kvm_inject_page_fault(vcpu, &e);
return 1;
}

No entanto, kvm_read_guest_virt() pode retornar um erro sem inicializar a estrutura de exceção quando ela está sendo chamada em um endereço usado para MMIO:

static int kvm_read_guest_virt_helper(gva_t addr, void *val, unsigned int bytes,
struct kvm_vcpu *vcpu, u32 access,
struct x86_exception *exception)
{
void *data = val;
int r = X86EMUL_CONTINUE;

while (bytes) {
....
ret = kvm_vcpu_read_guest_page(vcpu, gpa >> PAGE_SHIFT, data,
offset, toread);
if (ret < 0) {
r = X86EMUL_IO_NEEDED;
goto out;
}

....
}
out:
return r;
}

Nesse caso, kvm_inject_page_fault() vaza memória de stack não inicializada para o convidado como parte da cr2 e o código de erro. Um código de erro inválido pode levar a uma falha na entrada VM, portanto, um atacante somente convidado precisa ter cuidado ao escolher um destino de vazamento válido.

Créditos

Felix Wilhelm (Google Project Zero)

Referência(s)

Issue 1759: KVM: uninitialized memory leak in kvm_inject_page_fault
https://bugs.chromium.org/p/project-zero/issues/detail?id=1759&desc=2

KVM: x86: work around leak of uninitialized stack contents (CVE-2019-7222)
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=353c0956a618a07ba4bbe7ad00ff29fe70e8412a

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-7222
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-7222

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

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

Última modificação: 19 fevereiro 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.