ASA-2018-00023 – Apple XNU: Buffer overflows em cliente NFS no macOS


For the English version of this alert, click here.

Allele Security Alert

ASA-2018-00023

Identificador(es)

ASA-2018-00023, CVE-2018-4259, CVE-2018-4286, CVE-2018-4287, CVE-2018-4288, CVE-2018-4291

Título

Buffer overflows em cliente NFS no macOS

Fabricante(s)

Apple

Produto(s)

macOS

Versão(ões) afetada(s)

macOS versão 10.13.5 e anterior

Versão(ões) corrigida(s)

macOS 10.13.6

Prova de conceito

Desconhecido

Descrição

Este alerta aborda somente duas de várias vulnerabilidades corrigidas pela Apple.

A primeira vulnerabilidade está na macro nfsm_chain_get_fh() e a segunda vulnerabilidade na macro nfsm_chain_get_opaque().

A primeira vulnerabilidade existe porque a macro nfsm_chain_get_fh() não leva em consideração o tamanho da mensagem e então copia diretamente seu conteúdo para um buffer alocado dinamicamente.

Código vulnerável:

File: bsd/nfs/nfsm_subs.h
---
...
623 #define nfsm_chain_get_fh(E, NMC, VERS, FHP) \
624 do { \
625 if ((VERS) != NFS_VER2) \
626 nfsm_chain_get_32((E), (NMC), (FHP)->fh_len); \
627 else \
628 (FHP)->fh_len = NFSX_V2FH;\
629 nfsm_chain_get_opaque((E), (NMC), (uint32_t)(FHP)->fh_len, (FHP)->fh_data);\
630 if (E) \
631 (FHP)->fh_len = 0;\
632 } while (0)
...
---

A macro nfsm_chain_get_fh() chama nfsm_chain-get_32() para ler o comprimento da mensagem em ‘NMC’ e armazena esse valor em ‘(FHP)->fh_len’ que é usado posteriormente na macro nfsm_chain_get_opaque() na linha 629. A macro nfsm_chain_get_opaque() então ler ‘(FHP)->fh_len’ bytes da mensagem e armazena em ‘(FHP)->fh_data’. Como não há validação do valor de ‘(FHP)->fh_len’, é permitido escrever mais bytes do que a variável de destino suporta. O buffer de destino é alocado em nfs_socket.c na linha 1401.

A segunda vulnerabilidade é um integer overflow na macro nfsm_chain_get_opaque(). Esta macro chama a macro nfsm_rndup() para arredondar a variável ‘LEN’ até o próximo valor múltiplo de 4. Isto permite o resultado ser maior do que a variável pode suportar porque não há validação contra integer overflows.

Código vulnerável:

File:bsd/nfs/nfsm_subs.h
---
...
597 #define nfsm_chain_get_opaque(E, NMC, LEN, PTR) \
598   do { \
599    uint32_t rndlen; \
600    if (E) break; \
601    rndlen = nfsm_rndup(LEN); \
602    if ((NMC)->nmc_left >= rndlen) { \
603      u_char *__tmpptr = (u_char*)(NMC)->nmc_ptr; \
604      (NMC)->nmc_left -= rndlen; \
605      (NMC)->nmc_ptr += rndlen; \
606      bcopy(__tmpptr, (PTR), (LEN)); \
607    } else { \
608      (E) = nfsm_chain_get_opaque_f((NMC), (LEN), (u_char*)(PTR)); \
609    } \
610  } while (0)
...
---

Se a variável ‘LEN’ armazena um valor muito grande, quando nfsm_rndup() arredondar ‘LEN’ até o próximo valor múltiplo de 4,  o valor irá transbordar e a variável ‘rndlen’ pode conter o valor 0. Isto permite burlar a validação na linha 602 e porque a chamada para bcopy() usa o valor de ‘LEN’ e não ‘rndlen’, o valor muito grande atribuído a ‘LEN’ será usado como a quantidade de bytes a ser escrito na chamada a função bcopy() na linha 606. Isto resulta em transbordo de buffer porque é possível escrever mais bytes do que a variável de destino pode suportar.

Referência(s)

Semmle Discovers Six Critical Vulnerabilities Affecting Macs, iPhones, and iPads
https://semmle.com/news/apple-xnu-kernel-icmp-nfs-vulnerabilities

Kernel RCE caused by buffer overflows in macOS NFS client (CVE-2018-4259, CVE-2018-4286, CVE-2018-4287, CVE-2018-4288, CVE-2018-4291)
https://lgtm.com/blog/apple_xnu_nfs_vfsops_CVE-2018-4259

APPLE-SA-2018-10-30-2 macOS Mojave 10.14.1, Security Update 2018-001 High Sierra, Security Update 2018-005 Sierra
https://lists.apple.com/archives/security-announce/2018/Oct/msg00003.html

CVE-2018-4259
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-4259

CVE-2018-4259
https://nvd.nist.gov/vuln/detail/CVE-2018-4259

CVE-2018-4286
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-4286

CVE-2018-4286
https://nvd.nist.gov/vuln/detail/CVE-2018-4286

CVE-2018-4287
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-4287

CVE-2018-4287
https://nvd.nist.gov/vuln/detail/CVE-2018-4287

CVE-2018-4288
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-4288

CVE-2018-4288
https://nvd.nist.gov/vuln/detail/CVE-2018-4288

CVE-2018-4291
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-4291

CVE-2018-4291
https://nvd.nist.gov/vuln/detail/CVE-2018-4291

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

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