ASA-2019-00124 – Linux: Endereço virtual 0 é mapeável via privilegiada write() para /proc/*/mem


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00124

Identificador(es)

ASA-2019-00124, CVE-2019-9213

Título

Endereço virtual 0 é mapeável via privilegiada write() para /proc/*/mem

Fabricante(s)

The Linux foundation

Produto(s)

Linux

Versão(ões) afetada(s)

A vulnerabilidade foi introduzida no seguinte commit:

security: protect from stack expantion into low vm addresses
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8869477a49c3

Versão(ões) corrigida(s)

Linux kernel 4.20.14
Linux kernel 4.19.27
Linux kernel 4.14.105
Linux kernel 4.9.162

Prova de conceito

Sim

Descrição

No kernel do Linux antes de 4.20.14, expand_downwards() em mm/mmap.c não possui uma verificação do endereço mínimo do mmap, o que torna mais fácil para os atacantes explorarem NULL pointer dereference do kernel em plataformas não SMAP. Isso está relacionado a uma verificação de capability para a tarefa errada.

Detalhes técnicos

O problema está no seguinte caminho de código:

mem_write -> mem_rw -> access_remote_vm -> __access_remote_vm -> get_user_pages_remote -> __get_user_pages_locked -> __get_user_pages -> find_extend_vma

Então, se a VMA em questão tem a flag VM_GROWSDOWN definida:

expand_stack -> expand_downwards -> security_mmap_addr -> cap_mmap_addr

Isso, se o endereço estiver abaixo de dac_mmap_min_addr, faz uma verificação de capability:

ret = cap_capable(current_cred(), &init_user_ns, CAP_SYS_RAWIO, SECURITY_CAP_AUDIT);

Mas esta validação é realizada em relação a current_cred(), que são as credenciais da tarefa realizando o write(), não as credenciais da tarefa cuja VMA está sendo alterada.

Créditos

Jann Horn
Red Hat

Referência(s)

Issue 1792: Linux: virtual address 0 is mappable via privileged write() to /proc/*/mem
https://bugs.chromium.org/p/project-zero/issues/detail?id=1792

Linux kernel: OOB R/W in SNMP NAT module (CVE-2019-9162); virtual address 0 mappable (CVE-2019-9213)
https://seclists.org/oss-sec/2019/q1/166

mm: enforce min addr even if capable() in expand_downwards()
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0a1d52994d440e21def1c2174932410b4f2a98a1

security: protect from stack expantion into low vm addresses
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8869477a49c3

Bug 1686136 (CVE-2019-9213) – CVE-2019-9213 kernel: lack of check for mmap minimum address in expand_downwards in mm/mmap.c leads to NULL pointer dereferences exploit on non-SMAP platforms [NEEDINFO]
https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2019-9213

CVE-2019-9213 – Red Hat Customer Portal
https://access.redhat.com/security/cve/cve-2019-9213

Bug 679560 (CVE-2019-9213) – kernel: virtual address 0 is mappable via privileged write() to /proc/*/mem
https://bugs.gentoo.org/show_bug.cgi?id=CVE-2019-9213

Bug 1128166 – (CVE-2019-9213) VUL-0: CVE-2019-9213: kernel-source: mm: enforce min addr even if capable() in expand_downwards()
https://bugzilla.novell.com/show_bug.cgi?id=CVE-2019-9213

CVE-2019-9213 | SUSE
https://www.suse.com/pt-br/security/cve/CVE-2019-9213/

CVE-2019-9213
https://security-tracker.debian.org/tracker/CVE-2019-9213

CVE-2019-9213
https://people.canonical.com/~ubuntu-security/cve/2019/CVE-2019-9213.html

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

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

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

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

Linux kernel exploitation experiments
https://github.com/a13xp0p0v/kernel-hack-drill

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

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

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

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