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