Pojďme sledovat tok důvěrných dat. V této analýze se rozumí, že cokoli může udělat Alice, může také root. K datům může mít přístup také externí pozorovatel „o úroveň výš“ (např. s fyzickým přístupem ke sledování na diskové sběrnici nebo v hypervizoru, pokud kód běží na virtuálním počítači).
Nejprve se data načtou ze souboru. Za předpokladu, že pouze Alice má oprávnění ke čtení souboru a soubor není jinak prozrazen, může pouze Alice volat cat /home/alice/fav_food.txt
úspěšně. Data jsou pak v paměti cat
proces, kde k němu má přístup pouze tento proces. Data jsou přenášena potrubím z cat
příkaz volajícímu shellu; data na potrubí mohou vidět pouze dva zúčastněné procesy. Data jsou pak v paměti procesu shellu, opět soukromá pro tento proces.
V určitém okamžiku data skončí v prostředí shellu. V závislosti na shellu se to může stát, když je export
nebo pouze tehdy, když shell spustí externí program. V tomto okamžiku budou data argumentem execve
systémové volání. Po tomto volání budou data v prostředí podřízeného procesu.
Prostředí procesu je stejně soukromé jako zbytek paměti tohoto procesu (z mm->env_start
na mm->env_end
v paměťové mapě procesu). Souvisí se zásobníkem počátečního vlákna. Existuje však speciální mechanismus, který umožňuje ostatním procesům zobrazit kopii prostředí:environ
soubor v procesu /proc
adresář (/proc/$pid/environ
). Tento soubor je čitelný pouze pro jeho vlastníka, kterým je uživatel spouštějící proces (u privilegovaného procesu je to efektivní UID). (Všimněte si, že argumenty příkazového řádku v /proc/$pid/cmdline
, na druhou stranu jsou čitelné pro všechny.) Můžete auditovat zdrojový kód jádra a ověřit, že je to jediný způsob, jak uniknout prostředí procesu.
Existuje další potenciální zdroj úniku prostředí:během execve
volání. execve
systémové volání přímo neprosakuje prostředí. Existuje však obecný mechanismus auditu, který dokáže zaznamenat argumenty každého systémového volání, včetně execve
. Pokud je tedy auditování povoleno, může být prostředí odesláno prostřednictvím mechanismu auditu a skončit v souboru protokolu. Na slušně nakonfigurovaném systému má k souboru protokolu přístup pouze administrátor (v mé výchozí instalaci Debianu je to /var/log/audit/audit.log
, lze číst pouze rootem a zapisovat do auditd
démon běžící jako root).
Lhal jsem výše:napsal jsem, že paměť procesu nemůže číst jiný proces. To ve skutečnosti není pravda:stejně jako všechny Uniice, Linux implementuje ptrace
systémové volání. Toto systémové volání umožňuje procesu prozkoumat paměť a dokonce spustit kód v kontextu jiného procesu. To umožňuje existenci debuggerů. Pouze Alice může vysledovat Aliciny procesy. Navíc, pokud je proces privilegovaný (setuid nebo setgid), může jej sledovat pouze root.
Závěr:Prostředí procesu je dostupné pouze uživateli (euid), na kterém běží proces .
Všimněte si, že předpokládám, že neexistuje žádný jiný proces, který by mohl uniknout data. V normální instalaci Linuxu neexistuje žádný kořenový program setuid, který by mohl odhalit prostředí procesu. (U některých starších unices ps
byl setuid kořenový program, který analyzoval část paměti jádra; některé varianty by ochotně zobrazily prostředí procesu všem a všem. V systému Linux ps
není privilegovaný a získává svá data z /proc
jako všichni ostatní.
(Všimněte si, že to platí pro přiměřeně aktuální verze Linuxu. Myslím, že před velmi dlouhou dobou, v dobách jádra 1.x, bylo prostředí světově čitelné.)
Původně jsem chtěl říct "ne". Hodnoty proměnných prostředí jsou na uživatele a žádný jiný uživatel nemůže číst ani zapisovat do prostředí jiného uživatele. vars. Na SO je však zajímavá drobnost, která naznačuje, že root je schopen tuto informaci alespoň přečíst pomocí /proc/<pid>/environ
. Doposud jsem o tomto rozhraní specifickém pro Linux nevěděl.
https://stackoverflow.com/a/532284/643314
Díky tomu to vypadá, že toto rozhraní je pro ostatní uživatele stále nečitelné, i když jsou ve stejných skupinách. Oprávnění jsou nastavena na 400 pro soubor prostředí a /proc zabraňuje chmod v jeho ovlivnění. Mám podezření, že bezpečnostní doména pro oddělení proměnných prostředí mezi uživateli je stále nedotčená a nelze ji obejít běžnými prostředky.
Navzdory Gillesově teoreticky správné odpovědi:Do proměnných prostředí bych nevkládal tajemství.
- Proměnné prostředí jsou obvykle definovány v horní části stromu procesu (např. prostřednictvím
$HOME/.profile
). - Uživatelé nezacházejí s obsahem prostředí jako s tajemstvím.
Stačí, aby jeden proces zaprotokoloval proměnné prostředí do celosvětově čitelného souboru:env >> env-traces.txt
nebo podobné. Nemůžete to ovládat.