Time Namespace

Support HackTricks

Basic Information

Namespace ya wakati katika Linux inaruhusu offsets za per-namespace kwa saa za mfumo wa monotonic na boot-time. Inatumika sana katika kontena za Linux kubadilisha tarehe/saa ndani ya kontena na kurekebisha saa baada ya kurejesha kutoka kwa checkpoint au snapshot.

Lab:

Create different Namespaces

CLI

sudo unshare -T [--mount-proc] /bin/bash

Kwa kuunganisha mfano mpya wa mfumo wa /proc ikiwa unatumia param --mount-proc, unahakikisha kwamba nafasi mpya ya kuunganisha ina mtazamo sahihi na uliojitegemea wa taarifa za mchakato maalum kwa nafasi hiyo.

Hitilafu: bash: fork: Haiwezekani kugawa kumbukumbu

Wakati unshare inatekelezwa bila chaguo la -f, hitilafu inakutana kutokana na jinsi Linux inavyoshughulikia nafasi mpya za PID (Kitambulisho cha Mchakato). Maelezo muhimu na suluhisho yameelezwa hapa chini:

  1. Maelezo ya Tatizo:

  • Kernel ya Linux inaruhusu mchakato kuunda nafasi mpya kwa kutumia wito wa mfumo wa unshare. Hata hivyo, mchakato unaoanzisha uundaji wa nafasi mpya ya PID (inayojulikana kama mchakato wa "unshare") hauingii katika nafasi mpya; ni watoto wake tu wanaingia.

  • Kuendesha %unshare -p /bin/bash% kunaanzisha /bin/bash katika mchakato sawa na unshare. Kwa hivyo, /bin/bash na watoto wake wako katika nafasi ya awali ya PID.

  • Mchakato wa kwanza wa mtoto wa /bin/bash katika nafasi mpya unakuwa PID 1. Wakati mchakato huu unapoondoka, unasababisha usafishaji wa nafasi hiyo ikiwa hakuna mchakato mwingine, kwani PID 1 ina jukumu maalum la kupokea mchakato wa yatima. Kernel ya Linux itazima kisha ugawaji wa PID katika nafasi hiyo.

  1. Matokeo:

  • Kuondoka kwa PID 1 katika nafasi mpya kunasababisha kusafishwa kwa bendera ya PIDNS_HASH_ADDING. Hii inasababisha kazi ya alloc_pid kushindwa kugawa PID mpya wakati wa kuunda mchakato mpya, ikitoa hitilafu ya "Haiwezekani kugawa kumbukumbu".

  1. Suluhisho:

  • Tatizo linaweza kutatuliwa kwa kutumia chaguo la -f pamoja na unshare. Chaguo hili linafanya unshare kuunda mchakato mpya baada ya kuunda nafasi mpya ya PID.

  • Kutekeleza %unshare -fp /bin/bash% kunahakikisha kwamba amri ya unshare yenyewe inakuwa PID 1 katika nafasi mpya. /bin/bash na watoto wake wanakuwa salama ndani ya nafasi hii mpya, kuzuia kuondoka mapema kwa PID 1 na kuruhusu ugawaji wa kawaida wa PID.

Kwa kuhakikisha kwamba unshare inatekelezwa na bendera ya -f, nafasi mpya ya PID inatunzwa ipasavyo, ikiruhusu /bin/bash na mchakato wake wa chini kufanya kazi bila kukutana na hitilafu ya kugawa kumbukumbu.

Docker

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

Angalia ni namespace ipi mchakato wako uko ndani

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

Pata majina yote ya Time

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>

Ingia ndani ya Time namespace

nsenter -T TARGET_PID --pid /bin/bash
Support HackTricks

mbinu za hacking kwa kuwasilisha PRs kwa** HackTricks na HackTricks Cloud repos za github.

Last updated