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

6.1 KiB

Namespace de Tempo

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

Outras formas de apoiar o HackTricks:

Informações Básicas

O namespace de tempo permite offsets por namespace para os relógios monotônicos do sistema e de tempo de inicialização. O namespace de tempo é adequado para o uso em containers Linux, permitindo que a data/hora seja alterada dentro de um container e para ajustar relógios dentro de um container após a restauração de um checkpoint/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 para aquele namespace.

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

Quando unshare é executado sem a opção -f, um erro é encontrado devido à forma como o Linux lida com novos namespaces de PID (Process ID). Os detalhes principais 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 de PID original.
  • O primeiro processo filho de /bin/bash no novo namespace torna-se PID 1. Quando este 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 desativa a alocação de PID naquele namespace.
  1. Consequência:
  • A saída do PID 1 em um novo namespace leva à limpeza da flag PIDNS_HASH_ADDING. Isso resulta na falha da função alloc_pid em alocar um novo PID ao criar um novo processo, produzindo o erro "Não é possível alocar memória".
  1. Solução:
  • O problema pode ser resolvido usando a opção -f com unshare. Esta opção faz com que unshare bifurque um novo processo após criar o novo namespace de PID.
  • Executar %unshare -fp /bin/bash% garante que o próprio comando unshare se torne PID 1 no novo namespace. /bin/bash e seus processos filhos são então contidos com segurança dentro deste novo namespace, prevenindo a saída prematura do PID 1 e permitindo a alocação normal de PID.

Ao garantir que unshare seja executado com a bandeira -f, o novo namespace de PID é corretamente mantido, 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 seu processo está

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>

{% endcode %}

Entrar em 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 no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks: