hacktricks/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
2023-06-06 18:56:34 +00:00

5.8 KiB

Namespace de Tempo

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Informações Básicas

O namespace de tempo permite deslocamentos por namespace para os relógios monotônicos e de tempo de inicialização do sistema. O namespace de tempo é adequado para uso em contêineres Linux para permitir que a data/hora seja alterada dentro de um contêiner e para ajustar os relógios dentro de um contêiner 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 daquele namespace.

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

Se você executar a linha anterior sem -f, você receberá esse erro.
O erro é causado pelo processo PID 1 sair no novo namespace.

Depois que o bash começa a ser executado, ele bifurca vários novos sub-processos para fazer algumas coisas. Se você executar o unshare sem -f, o bash terá o mesmo pid que o processo "unshare" atual. O processo "unshare" atual chama o sistema de chamada unshare, cria um novo namespace de pid, mas o processo "unshare" atual não está no novo namespace de pid. É o comportamento desejado do kernel do Linux: o processo A cria um novo namespace, o próprio processo A não será colocado no novo namespace, apenas os sub-processos do processo A serão colocados no novo namespace. Então, quando você executa:

unshare -p /bin/bash

O processo unshare executará /bin/bash, e /bin/bash criará vários sub-processos, o primeiro sub-processo do bash se tornará o PID 1 do novo namespace, e o subprocesso sairá após concluir seu trabalho. Então, o PID 1 do novo namespace sairá.

O processo PID 1 tem uma função especial: ele deve se tornar o processo pai de todos os processos órfãos. Se o processo PID 1 no namespace raiz sair, o kernel entrará em pânico. Se o processo PID 1 em um sub-namespace sair, o kernel Linux chamará a função disable_pid_allocation, que limpará a flag PIDNS_HASH_ADDING nesse namespace. Quando o kernel Linux cria um novo processo, ele chama a função alloc_pid para alocar um PID em um namespace, e se a flag PIDNS_HASH_ADDING não estiver definida, a função alloc_pid retornará um erro -ENOMEM. É por isso que você recebeu o erro "Cannot allocate memory".

Você pode resolver esse problema usando a opção '-f':

unshare -fp /bin/bash

Se você executar o comando unshare com a opção '-f', o unshare irá criar um novo processo após criar o novo namespace pid. E executará /bin/bash no novo processo. O novo processo será o pid 1 do novo namespace pid. Em seguida, o bash também criará vários sub-processos para realizar algumas tarefas. Como o próprio bash é o pid 1 do novo namespace pid, seus sub-processos podem ser encerrados sem nenhum problema.

Traduzido de https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory

Docker

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

Verificar em qual namespace está o seu processo

Para verificar em qual namespace está o seu processo, você pode executar o seguinte comando:

ls -l /proc/$$/ns/

Onde $$ é o PID do seu processo.

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

Encontre 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>

Entrando em um namespace de tempo

{% endcode %}

nsenter -T TARGET_PID --pid /bin/bash

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