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