mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/docker-security/na
This commit is contained in:
parent
08b52bb5fd
commit
d4aaf7dc9c
@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
## Osnovne Informacije
|
## Osnovne Informacije
|
||||||
|
|
||||||
Vremenski namespac u Linuxu omogućava offsete po namespacima za sistemske monotone i boot-time satove. Često se koristi u Linux kontejnerima za promenu datuma/vremena unutar kontejnera i podešavanje satova nakon vraćanja iz tačke preuzimanja ili snimka.
|
Vremenski namespace u Linuxu omogućava offsete po namespace-u za sistemske monotone i boot-time satove. Često se koristi u Linux kontejnerima za promenu datuma/vremena unutar kontejnera i podešavanje satova nakon vraćanja iz tačke preuzimanja ili snimka.
|
||||||
|
|
||||||
## Laboratorija:
|
## Laboratorija:
|
||||||
|
|
||||||
### Kreirajte različite Namespacove
|
### Kreirajte različite Namespac-e
|
||||||
|
|
||||||
#### CLI
|
#### CLI
|
||||||
```bash
|
```bash
|
||||||
@ -20,13 +20,13 @@ Montiranjem nove instance `/proc` datotečnog sistema ako koristite parametar `-
|
|||||||
|
|
||||||
<summary>Greška: bash: fork: Ne može da dodeli memoriju</summary>
|
<summary>Greška: bash: fork: Ne može da dodeli memoriju</summary>
|
||||||
|
|
||||||
Kada se `unshare` izvrši bez opcije `-f`, dolazi do greške zbog načina na koji Linux upravlja novim PID (ID procesa) namespace-ima. Ključni detalji i rešenje su navedeni u nastavku:
|
Kada se `unshare` izvrši bez opcije `-f`, dolazi do greške zbog načina na koji Linux upravlja novim PID (Process ID) namespace-ima. Ključni detalji i rešenje su navedeni u nastavku:
|
||||||
|
|
||||||
1. **Objašnjenje problema**:
|
1. **Objašnjenje problema**:
|
||||||
|
|
||||||
- Linux kernel omogućava procesu da kreira nove namespace-e koristeći `unshare` sistemski poziv. Međutim, proces koji inicira kreiranje novog PID namespace-a (poznat kao "unshare" proces) ne ulazi u novi namespace; samo njegovi podprocesi to čine.
|
- Linux kernel omogućava procesu da kreira nove namespace-e koristeći `unshare` sistemski poziv. Međutim, proces koji inicira kreiranje novog PID namespace-a (poznat kao "unshare" proces) ne ulazi u novi namespace; samo njegovi podprocesi to čine.
|
||||||
- Pokretanjem `%unshare -p /bin/bash%` pokreće se `/bin/bash` u istom procesu kao `unshare`. Kao rezultat, `/bin/bash` i njegovi podprocesi su u originalnom PID namespace-u.
|
- Pokretanjem `%unshare -p /bin/bash%` pokreće se `/bin/bash` u istom procesu kao `unshare`. Kao rezultat, `/bin/bash` i njegovi podprocesi su u originalnom PID namespace-u.
|
||||||
- Prvi podproces `/bin/bash` u novom namespace-u postaje PID 1. Kada ovaj proces izađe, pokreće čišćenje namespace-a ako nema drugih procesa, jer PID 1 ima posebnu ulogu usvajanja siročadi. Linux kernel će tada onemogućiti dodelu PID-a u tom namespace-u.
|
- Prvi podproces `/bin/bash` u novom namespace-u postaje PID 1. Kada ovaj proces izađe, pokreće čišćenje namespace-a ako nema drugih procesa, jer PID 1 ima posebnu ulogu usvajanja siročadi procesa. Linux kernel će tada onemogućiti dodelu PID-a u tom namespace-u.
|
||||||
|
|
||||||
2. **Posledica**:
|
2. **Posledica**:
|
||||||
|
|
||||||
@ -34,9 +34,9 @@ Kada se `unshare` izvrši bez opcije `-f`, dolazi do greške zbog načina na koj
|
|||||||
|
|
||||||
3. **Rešenje**:
|
3. **Rešenje**:
|
||||||
- Problem se može rešiti korišćenjem `-f` opcije sa `unshare`. Ova opcija čini da `unshare` fork-uje novi proces nakon kreiranja novog PID namespace-a.
|
- Problem se može rešiti korišćenjem `-f` opcije sa `unshare`. Ova opcija čini da `unshare` fork-uje novi proces nakon kreiranja novog PID namespace-a.
|
||||||
- Izvršavanje `%unshare -fp /bin/bash%` osigurava da sam `unshare` komanda postane PID 1 u novom namespace-u. `/bin/bash` i njegovi podprocesi su tada sigurno sadržani unutar ovog novog namespace-a, sprečavajući prevremeni izlazak PID 1 i omogućavajući normalnu dodelu PID-a.
|
- Izvršavanje `%unshare -fp /bin/bash%` osigurava da `unshare` komanda sama postane PID 1 u novom namespace-u. `/bin/bash` i njegovi podprocesi su tada sigurno sadržani unutar ovog novog namespace-a, sprečavajući prevremeni izlazak PID 1 i omogućavajući normalnu dodelu PID-a.
|
||||||
|
|
||||||
Osiguravanjem da `unshare` radi sa `-f` oznakom, novi PID namespace se ispravno održava, omogućavajući `/bin/bash` i njegovim podprocesima da funkcionišu bez susretanja greške u dodeli memorije.
|
Osiguravanjem da `unshare` radi sa `-f` oznakom, novi PID namespace se ispravno održava, omogućavajući `/bin/bash` i njegove podprocese da funkcionišu bez susretanja greške u dodeli memorije.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@ -59,4 +59,83 @@ sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2>/dev/null |
|
|||||||
```bash
|
```bash
|
||||||
nsenter -T TARGET_PID --pid /bin/bash
|
nsenter -T TARGET_PID --pid /bin/bash
|
||||||
```
|
```
|
||||||
|
## Manipulacija vremenskim pomeranjima
|
||||||
|
|
||||||
|
Počevši od Linux-a 5.6, dva sata mogu biti virtualizovana po vremenskom imenu:
|
||||||
|
|
||||||
|
* `CLOCK_MONOTONIC`
|
||||||
|
* `CLOCK_BOOTTIME`
|
||||||
|
|
||||||
|
Njihovi delti po imenu su izloženi (i mogu se modifikovati) kroz datoteku `/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
|
||||||
|
```
|
||||||
|
Datoteka sadrži dve linije – po jednu za svaki sat – sa pomerajem u **nanosekundama**. Procesi koji imaju **CAP_SYS_TIME** _u vremenskom imenskom prostoru_ mogu promeniti vrednost:
|
||||||
|
```
|
||||||
|
# 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
|
||||||
|
```
|
||||||
|
Ako vam je potrebno da se zidni sat (`CLOCK_REALTIME`) takođe menja, i dalje se morate osloniti na klasične mehanizme (`date`, `hwclock`, `chronyd`, …); **nije** imenski prostoran.
|
||||||
|
|
||||||
|
|
||||||
|
### `unshare(1)` pomoćne zastavice (util-linux ≥ 2.38)
|
||||||
|
```
|
||||||
|
sudo unshare -T \
|
||||||
|
--monotonic="+24h" \
|
||||||
|
--boottime="+7d" \
|
||||||
|
--mount-proc \
|
||||||
|
bash
|
||||||
|
```
|
||||||
|
Duge opcije automatski upisuju odabrane delte u `timens_offsets` odmah nakon što je prostor imena kreiran, čime se štedi ručni `echo`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## OCI i podrška za runtime
|
||||||
|
|
||||||
|
* **OCI Runtime Specification v1.1** (Nov 2023) je dodao posvećen tip `time` prostora imena i polje `linux.timeOffsets` kako bi kontejnerski motori mogli da traže virtualizaciju vremena na prenosiv način.
|
||||||
|
* **runc >= 1.2.0** implementira taj deo specifikacije. Minimalni fragment `config.json` izgleda ovako:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"linux": {
|
||||||
|
"namespaces": [
|
||||||
|
{"type": "time"}
|
||||||
|
],
|
||||||
|
"timeOffsets": {
|
||||||
|
"monotonic": 86400,
|
||||||
|
"boottime": 600
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Zatim pokrenite kontejner sa `runc run <id>`.
|
||||||
|
|
||||||
|
> NAPOMENA: runc **1.2.6** (Feb 2025) je ispravio grešku "exec into container with private timens" koja je mogla dovesti do zastoja i potencijalnog DoS-a. Uverite se da ste na ≥ 1.2.6 u produkciji.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bezbednosna razmatranja
|
||||||
|
|
||||||
|
1. **Zahtevana sposobnost** – Procesu je potrebna **CAP_SYS_TIME** unutar svog korisničkog/vremenskog prostora imena da bi promenio ofsete. Odbacivanje te sposobnosti u kontejneru (podrazumevano u Docker-u i Kubernetes-u) sprečava manipulaciju.
|
||||||
|
2. **Bez promena na zidu sata** – Pošto je `CLOCK_REALTIME` deljen sa hostom, napadači ne mogu da lažiraju trajanje sertifikata, isteke JWT-a itd. samo putem timens-a.
|
||||||
|
3. **Izbegavanje logova / detekcije** – Softver koji se oslanja na `CLOCK_MONOTONIC` (npr. limitatori brzine zasnovani na vremenu rada) može biti zbunjen ako korisnik prostora imena prilagodi ofset. Preferirajte `CLOCK_REALTIME` za vremenske oznake relevantne za bezbednost.
|
||||||
|
4. **Površina napada na kernel** – Čak i sa uklonjenim `CAP_SYS_TIME`, kernel kod ostaje dostupan; održavajte host ažuriranim. Linux 5.6 → 5.12 je primio više ispravki grešaka vezanih za timens (NULL-deref, problemi sa potpisivanjem).
|
||||||
|
|
||||||
|
### Lista za učvršćivanje
|
||||||
|
|
||||||
|
* Odbacite `CAP_SYS_TIME` u podrazumevanom profilu vašeg kontejnerskog runtime-a.
|
||||||
|
* Održavajte runtime-ove ažuriranim (runc ≥ 1.2.6, crun ≥ 1.12).
|
||||||
|
* Zaključajte util-linux ≥ 2.38 ako se oslanjate na `--monotonic/--boottime` pomoćne alate.
|
||||||
|
* Revizija softvera unutar kontejnera koji čita **uptime** ili **CLOCK_MONOTONIC** za logiku kritičnu za bezbednost.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
* man7.org – Stranica sa priručnikom za vremenske prostore imena: <https://man7.org/linux/man-pages/man7/time_namespaces.7.html>
|
||||||
|
* OCI blog – "OCI v1.1: novi vremenski i RDT prostori imena" (15. novembar 2023): <https://opencontainers.org/blog/2023/11/15/oci-spec-v1.1>
|
||||||
|
|
||||||
{{#include ../../../../banners/hacktricks-training.md}}
|
{{#include ../../../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user