hacktricks/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md

6.1 KiB

Namespace de Tempo

Aprenda hacking AWS do zero ao avançado com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Informações Básicas

O namespace de tempo no Linux permite deslocamentos por namespace nos relógios monótono e de tempo de inicialização do sistema. É comumente usado em contêineres Linux para alterar a data/hora dentro de um contêiner e ajustar os relógios após a restauração de um ponto de verificação ou snapshot.

Laboratório:

Criar diferentes Namespaces

CLI

sudo unshare -T [--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 namespace de montagem tenha uma visão precisa e isolada das informações de processo específicas daquele namespace.

Erro: bash: fork: Não é possível alocar memória

Quando o unshare é executado sem a opção -f, um erro é encontrado devido à forma como o Linux lida com os novos namespaces de PID (Process ID). Os detalhes-chave e a solução são descritos abaixo:

  1. Explicação do Problema:
  • O kernel do 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 filhos o fazem.
  • Executar %unshare -p /bin/bash% inicia /bin/bash no mesmo processo que unshare. Consequentemente, /bin/bash e seus processos filhos estão no namespace PID original.
  • O primeiro processo filho do /bin/bash no novo namespace se torna o PID 1. Quando esse processo sai, ele aciona a limpeza do namespace se não houver outros processos, pois o PID 1 tem o papel especial de adotar processos órfãos. O kernel do Linux então desabilitará a alocação de PID nesse namespace.
  1. Consequência:
  • A saída do PID 1 em um novo namespace leva à limpeza da flag PIDNS_HASH_ADDING. Isso resulta na função alloc_pid falhando ao alocar um novo PID ao criar um novo processo, produzindo o erro "Cannot allocate memory".
  1. Solução:
  • O problema pode ser resolvido usando a opção -f com o unshare. Essa opção faz com que o unshare bifurque um novo processo após criar o novo namespace de PID.
  • Executar %unshare -fp /bin/bash% garante que o comando unshare se torne o PID 1 no novo namespace. /bin/bash e seus processos filhos são então seguramente contidos dentro desse novo namespace, evitando a saída prematura do PID 1 e permitindo a alocação normal de PID.

Ao garantir que o unshare seja executado com a flag -f, o novo namespace de PID é mantido corretamente, permitindo que /bin/bash e seus sub-processos operem sem encontrar o erro de alocação de memória.

Docker

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Verifique em qual namespace está o seu processo

ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr  4 21:16 /proc/self/ns/time -> 'time:[4026531834]'

Encontrar todos os namespaces de Tempo

{% code overflow="wrap" %}

sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name time -exec ls -l  {} \; 2>/dev/null | grep <ns-number>

Entrar dentro de um namespace de Tempo

nsenter -T TARGET_PID --pid /bin/bash

Também, você só pode entrar em outro namespace de processo se for root. E você não pode entrar em outro namespace sem um descritor apontando para ele (como /proc/self/ns/net).

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks: