Time Namespace

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

Basic Information

Linux의 μ‹œκ°„ λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” μ‹œμŠ€ν…œ 단쑰 및 λΆ€νŒ… μ‹œκ°„ μ‹œκ³„μ— λŒ€ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ³„ μ˜€ν”„μ…‹μ„ ν—ˆμš©ν•©λ‹ˆλ‹€. μ΄λŠ” Linux μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ»¨ν…Œμ΄λ„ˆ λ‚΄μ˜ λ‚ μ§œ/μ‹œκ°„μ„ λ³€κ²½ν•˜κ³  체크포인트 λ˜λŠ” μŠ€λƒ…μƒ·μ—μ„œ λ³΅μ›ν•œ ν›„ μ‹œκ³„λ₯Ό μ‘°μ •ν•˜λŠ” 데 일반적으둜 μ‚¬μš©λ©λ‹ˆλ‹€.

Lab:

Create different Namespaces

CLI

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

μƒˆλ‘œμš΄ /proc 파일 μ‹œμŠ€ν…œ μΈμŠ€ν„΄μŠ€λ₯Ό λ§ˆμš΄νŠΈν•˜λ©΄ --mount-proc λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— νŠΉμ •ν•œ ν”„λ‘œμ„ΈμŠ€ 정보에 λŒ€ν•œ μ •ν™•ν•˜κ³  격리된 λ·°λ₯Ό 갖도둝 보μž₯ν•©λ‹ˆλ‹€.

였λ₯˜: bash: fork: λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€

unshareκ°€ -f μ˜΅μ…˜ 없이 싀행될 λ•Œ, Linuxκ°€ μƒˆλ‘œμš΄ PID(ν”„λ‘œμ„ΈμŠ€ ID) λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식 λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ£Όμš” 세뢀사항과 해결책은 μ•„λž˜μ— μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€:

  1. 문제 μ„€λͺ…:
  • Linux 컀널은 ν”„λ‘œμ„ΈμŠ€κ°€ unshare μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 생성할 수 μžˆλ„λ‘ ν—ˆμš©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μƒˆλ‘œμš΄ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€(이λ₯Ό β€œunshare” ν”„λ‘œμ„ΈμŠ€λΌκ³  함)λŠ” μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°€μ§€ μ•ŠμœΌλ©°, 였직 κ·Έ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ§Œ λ“€μ–΄κ°‘λ‹ˆλ‹€.
  • %unshare -p /bin/bash%λ₯Ό μ‹€ν–‰ν•˜λ©΄ /bin/bashκ°€ unshare와 λ™μΌν•œ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹œμž‘λ©λ‹ˆλ‹€. 결과적으둜 /bin/bash와 κ·Έ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” μ›λž˜ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆμŠ΅λ‹ˆλ‹€.
  • μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ /bin/bash의 첫 번째 μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” PID 1이 λ©λ‹ˆλ‹€. 이 ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λ©΄, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ 없을 경우 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ 정리가 νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€. PID 1은 κ³ μ•„ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž…μ–‘ν•˜λŠ” νŠΉλ³„ν•œ 역할을 κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. 그러면 Linux 컀널은 ν•΄λ‹Ή λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ PID 할당을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
  1. κ²°κ³Ό:
  • μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ PID 1의 μ’…λ£ŒλŠ” PIDNS_HASH_ADDING ν”Œλž˜κ·Έμ˜ 정리λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€. 이둜 인해 μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 λ•Œ alloc_pid ν•¨μˆ˜κ°€ μƒˆλ‘œμš΄ PIDλ₯Ό ν• λ‹Ήν•˜λŠ” 데 μ‹€νŒ¨ν•˜μ—¬ β€œλ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€β€ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.
  1. ν•΄κ²°μ±…:
  • 이 λ¬Έμ œλŠ” unshare와 ν•¨κ»˜ -f μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜΅μ…˜μ€ unshareκ°€ μƒˆλ‘œμš΄ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μƒμ„±ν•œ ν›„ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό ν¬ν¬ν•˜λ„λ‘ λ§Œλ“­λ‹ˆλ‹€.
  • %unshare -fp /bin/bash%λ₯Ό μ‹€ν–‰ν•˜λ©΄ unshare λͺ…λ Ή μžμ²΄κ°€ μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ PID 1이 λ©λ‹ˆλ‹€. /bin/bash와 κ·Έ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” 이 μƒˆλ‘œμš΄ λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ μ•ˆμ „ν•˜κ²Œ ν¬ν•¨λ˜μ–΄ PID 1의 μ‘°κΈ° μ’…λ£Œλ₯Ό λ°©μ§€ν•˜κ³  정상적인 PID 할당을 ν—ˆμš©ν•©λ‹ˆλ‹€.

unshareκ°€ -f ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•¨μœΌλ‘œμ¨ μƒˆλ‘œμš΄ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μ˜¬λ°”λ₯΄κ²Œ μœ μ§€λ˜λ©°, /bin/bash와 κ·Έ ν•˜μœ„ ν”„λ‘œμ„ΈμŠ€κ°€ λ©”λͺ¨λ¦¬ ν• λ‹Ή 였λ₯˜ 없이 μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Docker

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

ν”„λ‘œμ„ΈμŠ€κ°€ μ–΄λ–€ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆλŠ”μ§€ ν™•μΈν•˜κΈ°

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

λͺ¨λ“  μ‹œκ°„ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ°ΎκΈ°

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>

Time λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ“€μ–΄κ°€κΈ°

nsenter -T TARGET_PID --pid /bin/bash

μ‹œκ°„ μ˜€ν”„μ…‹ μ‘°μž‘

Linux 5.6λΆ€ν„°, 두 개의 μ‹œκ³„λ₯Ό μ‹œκ°„ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ³„λ‘œ 가상화할 수 μžˆμŠ΅λ‹ˆλ‹€:

  • CLOCK_MONOTONIC
  • CLOCK_BOOTTIME

κ·Έλ“€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ³„ λΈνƒ€λŠ” /proc/<PID>/timens_offsets νŒŒμΌμ„ 톡해 λ…ΈμΆœλ˜λ©° (μˆ˜μ •ν•  수 있음):

$ sudo unshare -Tr --mount-proc bash   # -T creates a new timens, -r drops capabilities
$ cat /proc/$$/timens_offsets
monotonic 0
boottime  0

νŒŒμΌμ—λŠ” λ‚˜λ…Έμ΄ˆ λ‹¨μœ„μ˜ μ˜€ν”„μ…‹μ΄ μžˆλŠ” μ‹œκ³„λ‹Ή ν•œ 쀄이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. CAP_SYS_TIME _μ‹œκ°„ λ„€μž„μŠ€νŽ˜μ΄μŠ€_λ₯Ό λ³΄μœ ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

# advance CLOCK_MONOTONIC by two days (172 800 s)
echo "monotonic 172800000000000" > /proc/$$/timens_offsets
# verify
$ cat /proc/$$/uptime   # first column uses CLOCK_MONOTONIC
172801.37  13.57

λ²½μ‹œκ³„(CLOCK_REALTIME)도 λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우 μ—¬μ „νžˆ 고전적인 λ©”μ»€λ‹ˆμ¦˜(date, hwclock, chronyd, …)에 μ˜μ‘΄ν•΄μ•Ό ν•©λ‹ˆλ‹€; μ΄λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

unshare(1) 헬퍼 ν”Œλž˜κ·Έ (util-linux β‰₯ 2.38)

sudo unshare -T \
--monotonic="+24h"  \
--boottime="+7d"    \
--mount-proc         \
bash

κΈ΄ μ˜΅μ…˜μ€ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μƒμ„±λœ 직후 μ„ νƒν•œ 델타λ₯Ό timens_offsets에 μžλ™μœΌλ‘œ κΈ°λ‘ν•˜μ—¬ μˆ˜λ™ echoλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.


OCI 및 λŸ°νƒ€μž„ 지원

  • OCI λŸ°νƒ€μž„ 사양 v1.1 (2023λ…„ 11μ›”)은 μ»¨ν…Œμ΄λ„ˆ 엔진이 νœ΄λŒ€ κ°€λŠ₯ν•œ λ°©μ‹μœΌλ‘œ μ‹œκ°„ 가상화λ₯Ό μš”μ²­ν•  수 μžˆλ„λ‘ μ „μš© time λ„€μž„μŠ€νŽ˜μ΄μŠ€ μœ ν˜•κ³Ό linux.timeOffsets ν•„λ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
  • runc >= 1.2.0은 μ‚¬μ–‘μ˜ ν•΄λ‹Ή 뢀뢄을 κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ΅œμ†Œν•œμ˜ config.json 쑰각은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:
{
"linux": {
"namespaces": [
{"type": "time"}
],
"timeOffsets": {
"monotonic": 86400,
"boottime": 600
}
}
}

그런 λ‹€μŒ runc run <id>둜 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

주의: runc 1.2.6 (2025λ…„ 2μ›”)은 β€œκ°œμΈ timens둜 μ»¨ν…Œμ΄λ„ˆμ— exec” 버그λ₯Ό μˆ˜μ •ν•˜μ—¬ μ •μ§€ 및 잠재적인 DoSλ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜μ—μ„œ β‰₯ 1.2.6을 μ‚¬μš©ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.


λ³΄μ•ˆ 고렀사항

  1. ν•„μˆ˜ κΆŒν•œ – ν”„λ‘œμ„ΈμŠ€λŠ” μ˜€ν”„μ…‹μ„ λ³€κ²½ν•˜κΈ° μœ„ν•΄ μ‚¬μš©μž/μ‹œκ°„ λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œ CAP_SYS_TIME이 ν•„μš”ν•©λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆμ—μ„œ ν•΄λ‹Ή κΆŒν•œμ„ μ œκ±°ν•˜λ©΄ (Docker 및 Kubernetes의 κΈ°λ³Έκ°’) λ³€μ‘°λ₯Ό λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. λ²½μ‹œκ³„ λ³€κ²½ μ—†μŒ – CLOCK_REALTIME이 ν˜ΈμŠ€νŠΈμ™€ 곡유되기 λ•Œλ¬Έμ— κ³΅κ²©μžλŠ” timens만으둜 μΈμ¦μ„œ 수λͺ…, JWT 만료 등을 μŠ€ν‘Έν•‘ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  3. 둜그/탐지 νšŒν”Ό – CLOCK_MONOTONIC에 μ˜μ‘΄ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄(예: 가동 μ‹œκ°„ 기반의 속도 μ œν•œκΈ°)λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ‚¬μš©μžκ°€ μ˜€ν”„μ…‹μ„ μ‘°μ •ν•˜λ©΄ ν˜Όλž€μŠ€λŸ¬μ›Œμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ³΄μ•ˆ κ΄€λ ¨ νƒ€μž„μŠ€νƒ¬ν”„μ—λŠ” CLOCK_REALTIME을 μ„ ν˜Έν•˜μ‹­μ‹œμ˜€.
  4. 컀널 곡격 ν‘œλ©΄ – CAP_SYS_TIME이 μ œκ±°λ˜λ”λΌλ„ 컀널 μ½”λ“œλŠ” μ—¬μ „νžˆ μ ‘κ·Ό κ°€λŠ₯ν•˜λ―€λ‘œ 호슀트λ₯Ό 패치 μƒνƒœλ‘œ μœ μ§€ν•˜μ‹­μ‹œμ˜€. Linux 5.6 β†’ 5.12λŠ” μ—¬λŸ¬ timens 버그 μˆ˜μ •(NULl-deref, λΆ€ν˜Έ 문제)을 λ°›μ•˜μŠ΅λ‹ˆλ‹€.

κ°•ν™” 체크리슀트

  • μ»¨ν…Œμ΄λ„ˆ λŸ°νƒ€μž„ κΈ°λ³Έ ν”„λ‘œν•„μ—μ„œ CAP_SYS_TIME을 μ œκ±°ν•˜μ‹­μ‹œμ˜€.
  • λŸ°νƒ€μž„μ„ μ—…λ°μ΄νŠΈ μƒνƒœλ‘œ μœ μ§€ν•˜μ‹­μ‹œμ˜€ (runc β‰₯ 1.2.6, crun β‰₯ 1.12).
  • --monotonic/--boottime λ„μš°λ―Έμ— μ˜μ‘΄ν•˜λŠ” 경우 util-linux β‰₯ 2.38을 κ³ μ •ν•˜μ‹­μ‹œμ˜€.
  • λ³΄μ•ˆμ— μ€‘μš”ν•œ 논리λ₯Ό μœ„ν•΄ uptime λ˜λŠ” CLOCK_MONOTONIC을 μ½λŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°μ‚¬ν•˜μ‹­μ‹œμ˜€.

μ°Έμ‘°

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°