ASA-2020-00038 – Linux kernel: Corrupção de memória devido à falta de validação do campo sk_family no subsistema vhost


For the English version of this alert, click here.

Allele Security Alert

ASA-2020-00038

Identificador(es)

ASA-2020-00038, CVE-2020-10942

Título

Corrupção de memória devido à falta de validação do campo sk_family no subsistema vhost

Fabricante(s)

Linux foundation

Produto(s)

Linux kernel

Versão(ões) afetada(s)

Linux kernel versões anteriores a 5.5.8
Linux kernel versões anteriores a 5.4.24
Linux kernel versões anteriores a 4.9.216
Linux kernel versões anteriores a 4.19.108
Linux kernel versões anteriores a 4.14.173

Linux kernel versões desde o seguinte commit:

vhost_net: a kernel-level virtio server
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a4d5c94e959359ece6d6b55045c3f046677f55c

Versão(ões) corrigida(s)

Linux kernel versão 5.5.8
Linux kernel versão 5.4.24
Linux kernel versão 4.9.216
Linux kernel versão 4.19.108
Linux kernel versão 4.14.173

Linux kernel versões desde o seguinte commit:

vhost: Check docket sk_family instead of call getname
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=42d84c8490f9f0931786f1623191fcab397c3d64

Prova de Conceito

Sim

Descrição

No kernel do Linux, get_raw_socket() em drivers/vhost/net.c carece de validação do campo sk_family, o que pode permitir que atacantes acionem a corrupção da stack do kernel por meio de chamadas de sistema.

Detalhes técnicos

Não há garantia de que o getname use o parâmetro sockaddr_ll além do seu tamanho. Isso não deve ultrapassar MAX_ADDR_LEN, mas syzbot descobriu que ax25_getname grava mais (72 bytes, o tamanho de full_sockaddr_ax25, versus 20 + 32 bytes de sockaddr_ll + MAX_ADDR_LEN no syzbot repro).

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index e158159671fa..18e205eeb9af 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -1414,10 +1414,6 @@ static int vhost_net_release(struct inode *inode, struct file *f)

static struct socket *get_raw_socket(int fd)
{
-    struct {
-        struct sockaddr_ll sa;
-        char buf[MAX_ADDR_LEN];
-    } uaddr;
     int r;
     struct socket *sock = sockfd_lookup(fd, &r);

@@ -1430,11 +1426,7 @@ static struct socket *get_raw_socket(int fd)
         goto err;
     }

-    r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0);
-    if (r < 0)
-        goto err;
-
-     if (uaddr.sa.sll_family != AF_PACKET) {
+     if (sock->sk->sk_family != AF_PACKET) {
         r = -EPFNOSUPPORT;
         goto err;
}

Créditos

syzkaller

Referência(s)

vhost: Check docket sk_family instead of call getname
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=42d84c8490f9f0931786f1623191fcab397c3d64

vhost: Check docket sk_family instead of call getname
https://github.com/torvalds/linux/commit/42d84c8490f9f0931786f1623191fcab397c3d64

vhost_net: a kernel-level virtio server
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a4d5c94e959359ece6d6b55045c3f046677f55c

vhost_net: a kernel-level virtio server
https://github.com/torvalds/linux/commit/3a4d5c94e959359ece6d6b55045c3f046677f55c

Linux 5.5.8
https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.5.8

Linux 5.4.24
https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.4.24

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

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

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

Re: kernel panic: stack is corrupted in vhost_net_ioctl
https://lkml.org/lkml/2020/2/15/125

repro.c
https://syzkaller.appspot.com/x/repro.c?x=1135fa31e00000

CVE-2020-10942
https://access.redhat.com/security/cve/CVE-2020-10942

CVE-2020-10942
https://security-tracker.debian.org/tracker/CVE-2020-10942

CVE-2020-10942 in Ubuntu
https://people.canonical.com/~ubuntu-security/cve/CVE-2020-10942.html

CVE-2020-10942 | SUSE
https://www.suse.com/security/cve/CVE-2020-10942

CVE-2020-10942
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10942

CVE-2020-10942
https://nvd.nist.gov/vuln/detail/CVE-2020-10942

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

Última modificação: 25 março 2020

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.