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