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

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 on line 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
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-4259

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

CVE-2018-4286
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-4286

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

CVE-2018-4287
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-4287


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

Última modificação: 9 de novembro de 2018