flawopen.com/Teardowns/cve-2023-2640-ubuntu-overlayfs-privilege-escalation
CVE-2023-2640: LPE no OverlayFS Ubuntu
CVE-2023-2640 contorna permissões do OverlayFS em alguns kernels Ubuntu. Confira a variante do kernel e aplique a correção.
Imagine um prédio em que um funcionário verifica se alguém pode colocar um selo oficial em um documento. Um atalho local deveria ignorar verificações apenas para etiquetas de manutenção do prédio. Uma mudança posterior fez todas as solicitações de selo passarem por esse atalho, inclusive os selos de segurança restritos. A correção restaura a verificação normal de permissões no user namespace do filesystem montado.
Conceitos Centrais e Termos
OverlayFS- OverlayFS é um filesystem de união Linux que apresenta arquivos de uma camada inferior e grava alterações em uma camada superior.
Extended attribute (xattr)- Atributo estendido (xattr) é um metadado associado a um objeto do filesystem. Módulos de segurança Linux e recursos de arquivo usam namespaces xattr específicos.
ovl_do_setxattr()- Helper do OverlayFS que grava um xattr em um objeto da camada superior. O wrapper afetado usava amplamente uma função VFS sem verificação de permissões.
Copy-up- Operação do OverlayFS que cria uma cópia na camada superior quando uma gravação exige uma cópia gravável do objeto da camada inferior.
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-863
Análise de Causa Raiz
O registro CVE do Ubuntu informa que a configuração vulnerável exige tanto o commit upstream c914c0e27eb0 quanto o patch SAUCE do Ubuntu “Skip permission checking for trusted.overlayfs.* xattrs”. O patch SAUCE mudou os wrappers de xattr do OverlayFS para usar funções VFS _noperm, com a intenção de ignorar verificações apenas para metadados internos trusted.overlayfs.*. Após a mudança upstream nos wrappers, o helper passou a ser usado também para outros xattrs; assim, um usuário local sem privilégios podia definir atributos estendidos privilegiados em arquivos montados e fazê-los chegar aos arquivos da camada superior sem as verificações adequadas. A correção da Canonical reverte o caminho amplo sem permissões e chama vfs_setxattr() com o user namespace da montagem superior. É uma elevação local de privilégios específica do kernel Ubuntu; a exposição depende da versão, da variante do kernel e das políticas de namespace e montagem.
Fluxo de Ataque Passo a Paso
Configuração específica do kernel Ubuntu
O kernel precisa conter c914c0e27eb0 e o patch SAUCE do Ubuntu que ignora verificações para xattrs trusted.overlayfs.*. O número da versão upstream, sozinho, não comprova exposição.
Usuário local alcança o caminho de xattr
Um usuário local sem privilégios precisa acessar o caminho OverlayFS afetado conforme as políticas de namespace e montagem do host. O Ubuntu classifica o ataque como local.
Bypass de permissões alcança outros xattrs
O wrapper alterado direcionou atualizações xattr a helpers _noperm, destinados a metadados internos do OverlayFS. A mudança upstream fez outros xattrs também poderem escapar das verificações adequadas.
Atributo privilegiado chega à camada superior
O Ubuntu informa que atributos estendidos privilegiados podiam ser definidos em arquivos montados e copiados para arquivos superiores sem as verificações necessárias, possibilitando elevação local. Nem todo kernel ou contêiner é afetado da mesma forma.
Código-Fonte: Vulnerável vs. Seguro
O caminho SAUCE afetado chamava __vfs_setxattr_noperm() para todos os xattrs depois que uma mudança upstream ampliou seu alcance. A correção usa vfs_setxattr() com o user namespace da montagem superior, restaurando as verificações VFS normais. Este é um trecho focado do patch Canonical; a saída de depuração ao redor foi omitida.
Trecho de origem: fs/overlayfs/overlayfs.h
/* Contexto do patch canônico do Ubuntu antes de reverter a alteração SAUCE. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
int err;
inode_lock(inode);
err = __vfs_setxattr_noperm(&init_user_ns, dentry, name,
value, size, flags);
inode_unlock(inode);
return err;
}
/* Correção canônica do Ubuntu: restaure o wrapper VFS que verifica permissões. */
static inline int ovl_do_setxattr(struct ovl_fs *ofs, struct dentry *dentry,
const char *name, const void *value,
size_t size, int flags)
{
int err = vfs_setxattr(ovl_upper_mnt_userns(ofs), dentry, name,
value, size, flags);
return err;
}
Lista de Verificação de Segurança para Engenharia
- ✓Confira o rastreador CVE do Ubuntu para a versão, variante do kernel e pacote instalados; o problema depende de uma combinação específica de alterações Ubuntu e upstream.
- ✓Instale o pacote de kernel corrigido publicado para a versão e variante Ubuntu afetadas; reinicie e confirme qual kernel está em execução.
- ✓Se a atualização precisar esperar e a carga permitir, avalie a mitigação temporária documentada pelo Ubuntu para restringir a criação de user namespaces não privilegiados; teste o impacto em aplicativos e contêineres.
- ✓Nos wrappers xattr do OverlayFS, use APIs VFS com verificação de permissões e o user namespace correto da montagem para atributos controlados pelo usuário; reserve helpers sem verificação para metadados internos estritamente justificados.