Namespace UTS
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
Um namespace UTS (UNIX Time-Sharing System) é um recurso do kernel Linux que fornece isolamento de dois identificadores do sistema: o hostname e o NIS (Network Information Service) nome de domínio. Esse isolamento permite que cada namespace UTS tenha seu próprio hostname independente e nome de domínio NIS, o que é particularmente útil em cenários de containerização onde cada container deve aparecer como um sistema separado com seu próprio hostname.
Como funciona:
- Quando um novo namespace UTS é criado, ele começa com uma cópia do hostname e do nome de domínio NIS do seu namespace pai. Isso significa que, na criação, o novo namespace compartilha os mesmos identificadores que seu namespace pai. No entanto, quaisquer alterações subsequentes no hostname ou no nome de domínio NIS dentro do namespace não afetarão outros namespaces.
- Processos dentro de um namespace UTS podem alterar o hostname e o nome de domínio NIS usando as chamadas de sistema
sethostname()esetdomainname(), respectivamente. Essas alterações são locais ao namespace e não afetam outros namespaces ou o sistema host. - Processos podem mover-se entre namespaces usando a chamada de sistema
setns()ou criar novos namespaces usando as chamadas de sistemaunshare()ouclone()com a flagCLONE_NEWUTS. Quando um processo se move para um novo namespace ou cria um, ele começará a usar o hostname e o nome de domínio NIS associados a esse namespace.
Laboratório:
Criar diferentes Namespaces
CLI
sudo unshare -u [--mount-proc] /bin/bash
Ao montar uma nova instância do sistema de arquivos /proc usando o parâmetro --mount-proc, você garante que o novo mount namespace tenha uma visão precisa e isolada das informações de processos específicas desse namespace.
Error: bash: fork: Cannot allocate memory
Quando unshare é executado sem a opção -f, ocorre um erro devido à forma como o Linux lida com novos namespaces de PID (Process ID). Os detalhes principais e a solução estão descritos abaixo:
- Explicação do problema:
- O kernel Linux permite que um processo crie novos namespaces usando a chamada de sistema
unshare. No entanto, o processo que inicia a criação de um novo namespace de PID (referido como o processo “unshare”) não entra no novo namespace; apenas seus processos-filho entram. - Executar %unshare -p /bin/bash% inicia
/bin/bashno mesmo processo queunshare. Consequentemente,/bin/bashe seus processos-filho ficam no namespace de PID original. - O primeiro processo-filho de
/bin/bashno novo namespace torna-se PID 1. Quando esse processo sai, ele aciona a limpeza do namespace se não houver outros processos, já que o PID 1 tem o papel especial de adotar processos órfãos. O kernel Linux então desativará a alocação de PIDs nesse namespace.
- Consequência:
- A saída do PID 1 em um novo namespace leva à limpeza da flag
PIDNS_HASH_ADDING. Isso faz com que a funçãoalloc_pidfalhe ao alocar um novo PID ao criar um processo, produzindo o erro “Cannot allocate memory”.
- Solução:
- O problema pode ser resolvido usando a opção
-fcomunshare. Essa opção faz com queunsharefaça fork de um novo processo após criar o novo namespace de PID. - Executar %unshare -fp /bin/bash% garante que o próprio comando
unsharese torne PID 1 no novo namespace./bin/bashe seus processos-filho ficam então contidos com segurança nesse novo namespace, evitando a saída prematura do PID 1 e permitindo a alocação normal de PIDs.
Garantindo que unshare seja executado com a flag -f, o novo namespace de PID é mantido corretamente, permitindo que /bin/bash e seus subprocessos operem sem encontrar o erro de alocação de memória.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Verificar em qual namespace está o seu processo
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Encontrar todos os namespaces UTS
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Entrar em um UTS namespace
nsenter -u TARGET_PID --pid /bin/bash
Abusar do compartilhamento UTS do host
Se um container for iniciado com --uts=host, ele entra no host UTS namespace em vez de obter um isolado. Com capacidades como --cap-add SYS_ADMIN, código no container pode alterar o hostname/NIS do host via sethostname()/setdomainname():
docker run --rm -it --uts=host --cap-add SYS_ADMIN alpine sh -c "hostname hacked-host && exec sh"
# Hostname on the host will immediately change to "hacked-host"
Alterar o nome do host pode adulterar logs/alertas, confundir a descoberta do cluster ou quebrar configurações TLS/SSH que fixam o nome do host.
Detectar contêineres que compartilham o UTS com o host
docker ps -aq | xargs -r docker inspect --format '{{.Id}} UTSMode={{.HostConfig.UTSMode}}'
# Shows "host" when the container uses the host UTS namespace
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


