For the English version of this alert, click here.
Allele Security Alert
ASA-2018-00048
Identificador(es)
ASA-2018-00048, CVE-2018-18955
Título
Mapeamento de uid/gid quebrado para namespaces de usuário aninhados com > 5 intervalos
Fabricante(s)
Linux foundation
Produto(s)
Linux
Versão(ões) afetada(s)
Linux versões desde 4.15
Versão(ões) corrigida(s)
Linux 4.18.19
Linux 4.19.2
Prova de conceito
Desconhecido
Descrição
No Linux kernel versões desde 4.15, map_write() em kernel/user_namespace.c manipula incorretamente namespaces de usuário aninhados com mais que 5 intervalos UID ou GID. Isto pode permitir um usuário que tem CAP_SYS_ADMIN em um namespace de usuário no qual mapeia pelo menos 6 UIDs ou GIDs burlar acesso de controle fora do namespace.
Detalhes técnicos
commit 6397fac4915a (“userns: bump idmap limits to 340”) aumenta o número de mapeamentos uid/gid possíveis que um namespace pode ter de 5 para 340. Isto é implementado alterando para uma estrutura de dados diferente se o número de mapeamentos excede 5: Em vez de busca linear sobre um array não ordenado da estrutura uid_gid_extent, busca binária sobre um array ordenado da estrutura uid_gid_extent é usada. Porque mapeamentos de ID são consultadas em ambos dicionários (kernel ID para namespaced ID e namespaced ID para kernel ID). Duas cópias do array são criadas, uma por direção, e elas são ordenadas diferentemente.
Em map_write(), primeiro, durante o loop que chama insert_extent(), o membro lower_first de cada estrutura uid_gid_extent contém um ID no namespace do pai. Depois, map_id_range_down() é usada em um loop para substituir esses IDs no namespace pai com IDs do kernel.
O problema é que, quando os dois arrays ordenados são usados, o novo código omite a transformação de ID para o mapeamento kernel->namespaced; somente o mapeamento namespaced->kernel é transformado apropriadamente.
A lógica atual primeiro clona o array das extensões e ordena ambas as cópias, então mapeia os IDs mais baixos do mapeamento de encaminhamento para o mais baixos namespace mas não mapeia os mais baixos IDs do mapeamento reverso.
Isto significa que o código em um namespace de usuário aninhados com > 5 extensões visualizará IDs incorretos. Isto também quebra algumas verificações de acesso, como inode_owner_or_capable() e privileged_wrt_inode_uiggid(), então um processo pode incorretamente aparecer estar apto em relação a um inode.
Para corrigir isto, nós temos que ter certeza que os membros “lower_first” da extensão em ambos arrays são traduzidos; e nós temos que ter certeza que o map inverso é ordenado após a tradução (desde de outro modo a tradução pode quebrar a ordenação).
Créditos
Jann Horn (Google Project Zero)
Referência(s)
Linux: broken uid/gid mapping for nested user namespaces with >5 ranges
https://bugs.chromium.org/p/project-zero/issues/detail?id=1712
Linux kernel: broken uid/gid mapping for nested user namespaces with >5 ranges (CVE-2018-18955; since 4.15; fixed in 4.18.19 and 4.19.2)
https://seclists.org/oss-sec/2018/q4/150
userns: bump idmap limits to 340
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6397fac4915a
CVE-2018-18955
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-18955
CVE-2018-18955
https://nvd.nist.gov/vuln/detail/CVE-2018-18955
Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.
Última modificação: 31 janeiro 2019