Time-of-check to time of-use- Time-of-check to time-of-use

Ve vývoji softwaru , time-of-šek na čas-of-use ( TOCTOU , TOCTTOU nebo TOC / TOU ) je třída softwarových chyb způsobených spor zahrnující kontrolu stavu na část systému (jako je bezpečnostní pověření) a použití výsledků této kontroly.

Závodní podmínky TOCTOU jsou v Unixu běžné mezi operacemi na souborovém systému , ale mohou nastat v jiných kontextech, včetně lokálních soketů a nesprávného používání databázových transakcí . Na počátku devadesátých let měl poštovní obslužný program BSD 4.3 UNIX kvůli dočasným souborům zneužitelný závod, protože tuto mktemp()funkci používal . Rané verze OpenSSH měly zneužitelnou konkurenci pro sokety domény Unix . Zůstávají problémem moderních systémů; od roku 2019, je TOCTOU spor v Docker umožňuje root přístup k souborovému systému hostitelské platformy.

Příklady

V Unixu má následující kód C při použití v setuidprogramu chybu TOCTOU:

if (access("file", W_OK) != 0) {
    exit(1);
}

fd = open("file", O_WRONLY);
write(fd, buffer, sizeof(buffer));

Zde je přístup určen ke kontrole, zda by skutečnému uživateli, který provedl setuidprogram, normálně bylo povoleno zapisovat soubor (tj. accessKontroluje skutečné ID uživatele, nikoli efektivní ID uživatele ).

Tato rasa je náchylná k útoku:

Oběť Útočník
if (access("file", W_OK) != 0) {
    exit(1);
}

fd = open("file", O_WRONLY);
// Actually writing over /etc/passwd
write(fd, buffer, sizeof(buffer));
// 
//
// After the access check
symlink("/etc/passwd", "file");
// Before the open, "file" points to the password database
//
//

V tomto případě může útočník zneužít spor mezi accessa opena přimět setuidoběť k přepsání záznamu v databázi systémových hesel. Rasy TOCTOU lze použít k eskalaci privilegií a získání přístupu správce ke stroji.

Přestože tento sled událostí vyžaduje přesné načasování, je možné, aby útočník takové podmínky zařídil bez větších obtíží.

Důsledkem je, že aplikace nemohou předpokládat, že stav spravovaný operačním systémem (v tomto případě obor názvů systému souborů) se mezi systémovými voláními nezmění.

Spolehlivě načasujte TOCTOU

Využití závodních podmínek TOCTOU vyžaduje přesné načasování, aby se zajistilo, že se operace útočníka správně prokládají s operacemi oběti. Ve výše uvedeném příkladu musí útočník provést symlinksystémové volání přesně mezi accessa open. U nejobecnějšího útoku musí být útočníkovi naplánováno provedení po každé operaci oběti, známé také jako „jednostupňové“ oběti.

V případě poštovního nástroje BSD 4.3 a mktemp () může útočník jednoduše spouštět poštovní nástroj v jednom procesu a dál hádat dočasná jména souborů a v dalším procesu vytvářet symbolické odkazy. Útok může obvykle uspět za méně než jednu minutu.

Techniky pro jednostupňové obětování programu zahrnují bludiště systému souborů a útoky na algoritmickou složitost. V obou případech útočník manipuluje se stavem OS, aby řídil plánování oběti.

Bludiště souborového systému přinutí oběť přečíst položku adresáře, která není v mezipaměti operačního systému, a OS uvede oběť do režimu spánku, zatímco čte adresář z disku. Algoritmické složité útoky nutí oběť utratit celé své plánovací kvantum v rámci jednoho systémového volání procházejícího hashovací tabulkou jádra s názvy souborů uložených v mezipaměti. Útočník vytvoří velmi velký počet souborů se jmény, které mají hodnotu hash na stejnou hodnotu jako soubor, který oběť vyhledá.

Prevence TOCTOU

Navzdory koncepční jednoduchosti je těžké se závodním podmínkám TOCTOU vyhnout a odstranit je. Jednou z obecných technik je použití předběžného prověřování chyb namísto filozofie EAFP-„Je snazší požádat o odpuštění než o povolení“ než o LBYL-„podívejte se, než skočíte“-v tomto případě neexistuje kontrola, a selhání uložení předpokladů je signalizováno vrácením chyby.

V kontextu závodních podmínek souborového systému TOCTOU je zásadní výzvou zajistit, aby mezi dvěma systémovými voláními nebylo možné změnit souborový systém. V roce 2004 byl zveřejněn výsledek nemožnosti, který ukazuje, že neexistovala žádná přenosná, deterministická technika, jak se vyhnout závodním podmínkám TOCTOU.

Od tohoto nemožného výsledku vědci navrhli knihovny pro sledování deskriptorů souborů a zajištění správnosti.

Alternativní řešení navržené ve výzkumné komunitě je, aby systémy UNIX přijímaly transakce v systému souborů nebo jádře OS. Transakce poskytují abstrakci řízení souběžnosti pro OS a lze ji použít k prevenci závodů TOCTOU. I když žádné produkční jádro UNIX dosud nepřijalo transakce, byly pro Linux vyvinuty prototypy výzkumu konceptu konceptu, včetně souborového systému Valor a jádra TxOS. Microsoft Windows přidal transakce do svého systému souborů NTFS , ale Microsoft od jejich používání nedoporučuje a uvedl, že mohou být v budoucí verzi systému Windows odstraněny.

Zamykání souborů je běžnou technikou prevence závodních podmínek pro jeden soubor, ale nerozšiřuje se do prostoru jmen systému souborů a dalších metadat, ani zamykání nefunguje dobře u síťových souborových systémů a nemůže zabránit závodním podmínkám TOCTOU.

U binárních souborů setuid je možným řešením použít seteuid()systémové volání ke změně efektivního uživatele a poté provést open(). Rozdíly setuid()mezi operačními systémy mohou být problematické.

Viz také

Reference

Další čtení