ASA-2018-00048 – Linux: 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 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

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: 31 janeiro 2019