Existuje nějaká výhoda při vytváření dočasného souboru opatrnějším způsobem
Dočasné soubory se obvykle vytvářejí v dočasném adresáři (například /tmp
), kde mají všichni ostatní uživatelé a procesy přístup pro čtení a zápis (nové soubory tam může vytvořit jakýkoli jiný skript). Skript by si proto měl dávat pozor na vytváření souborů, jako je použití se správnými oprávněními (např. pouze pro čtení pro vlastníka, viz:help umask
) a název souboru by neměl být snadno uhodnutelný (ideálně náhodný). V opačném případě, pokud názvy souborů nejsou jedinečné, může to způsobit konflikt se stejným skriptem spuštěným vícekrát (např. race condition) nebo by některý útočník mohl unést některé citlivé informace (např. když jsou oprávnění příliš otevřená a název souboru lze snadno uhodnout) nebo vytvořit /nahrazení souboru vlastní verzí kódu (jako je nahrazení příkazů nebo SQL dotazů v závislosti na tom, co se ukládá).
K vytvoření dočasného adresáře můžete použít následující postup:
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
nebo dočasný soubor:
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
Je však stále předvídatelný a nepovažuje se za bezpečný.
Podle man mktemp
, můžeme číst:
Tradičně mnoho skriptů shellu bere název programu s pid jako příponu a používá ji jako dočasný název souboru. Tento druh schématu pojmenování je předvídatelný a pro útočníka je snadné vyhrát závodní podmínky.
Pro jistotu se tedy doporučuje použít mktemp
příkaz k vytvoření jedinečného dočasného souboru nebo adresáře (-d
).
mktemp(1)
manuálová stránka to vysvětluje docela dobře:
Tradičně mnoho skriptů shellu bere název programu s pid jako příponu a používá ji jako dočasný název souboru. Tento druh schématu pojmenování je předvídatelný a závodní podmínky, které vytváří, je pro útočníka snadné vyhrát. Bezpečnějším, i když stále horším přístupem je vytvořit dočasný adresář pomocí stejného schématu pojmenování. I když to umožňuje zaručit, že dočasný soubor nebude podvrácen, stále to umožňuje jednoduchý útok typu odmítnutí služby. Z těchto důvodů se doporučuje místo toho použít mktemp.
Ve skriptu vyvolám mktemp něco jako
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
který vytvoří dočasný adresář, ve kterém mohu pracovat, a ve kterém mohu bezpečně pojmenovat skutečné soubory tak, aby byly čitelné a užitečné.
mktemp
není standardní, ale existuje na mnoha platformách. "X" se obecně převedou na nějakou náhodnost a více bude pravděpodobně náhodnějších; nicméně některé systémy (např. busybox ash) omezují tuto náhodnost výrazněji než jiné
Mimochodem, bezpečné vytváření dočasných souborů je důležité nejen pro skriptování shellu. Proto má python tempfile, perl má File::Temp, ruby má Tempfile atd…
Možná se budete chtít podívat na mktemp
Obslužný program mktemp vezme danou šablonu názvu souboru a přepíše její část, aby vytvořil jedinečný název souboru. Šablona může být libovolný název_souboru s určitým počtem připojených 'X', například/tmp/tfile.XXXXXXXXXX. Koncová 'X' jsou nahrazena kombinací aktuálního čísla procesu a náhodných písmen.
Další podrobnosti:man mktemp
Ano, použijte mktemp.
Vytvoří dočasný soubor ve složce, která je určena pro ukládání dočasných souborů, a zaručí vám jedinečný název. Vypíše název tohoto souboru:
> mktemp
/tmp/tmp.xx4mM3ePQY
>