ASA-2018-00048 – Linux kernel: Mapeamento de uid / gid quebrado para namespaces de usuário aninhados com > 5 intervalos


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 kernel

Produto(s)

Linux kernel

Versão(ões) afetada(s)

Linux kernel versões desde 4.15

Versão(ões) corrigida(s)

Linux kernel 4.18.19

Linux kernel 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.

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 do 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

userns: also map extents in the reverse map to kernel IDs

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d2f007dbe7e4c9583eea6eb04d60001e85c6f1bd

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: 18 de novembro de 2018