Chyba zabezpečení přetečení vyrovnávací paměti

Obsah

V tomto tutoriálu budeme hovořit o přetečení vyrovnávací paměti (Přetečení zásobníku), což je selhání, které existuje již dlouhou dobu, nastane, pokud data zkopírovaná v oblasti paměti (která byla dříve vyhrazena) nejsou správně zkontrolována, je možné, že aplikace funguje správně, pokud uživatel vkládá data pomocí adekvátní velikost, ale pokud vyhradíme paměť na 15 znaků a uživatel vloží 20, ovlivní to další paměťovou oblast, která může, ale nemusí být vyhrazena.

To může náš program zablokovat, ale také to může být mnohem horší, uživatel se zlými úmysly může této chyby využít a ovlivnit provoz aplikace nebo spustit libovolný kód na počítači (normálně tento kód otevře interpret příkazů ). Také pokud program běží se zvýšenými oprávněními, máme vážnou bezpečnostní chybu. Dalším útokem, který může změnit provoz aplikace nebo vložit kód, je XSS.

PoznámkaPopravy, které uvidíte v tomto kurzu, byly provedeny v 32bitovém operačním systému Ubuntu 16.04.

Podívejme se na Jednoduchý příklad kódu C, který je vůči tomuto útoku zranitelný, při spuštění programu musíme předat parametr, aplikaci očekávejte, že obdržíte řetězec ne delší než 15 znaků, pokud je to očekávaný řetězec, bude to úspěšný přístup, pokud ne, bude „odepřen“. Kód je následující:

 #include #include #define heslo „Test“ neplatný test (char * str) {char buffer [15]; int n = 0; strcpy (buffer, str); if (strcmp (buffer, heslo) == 0) {n = 1; } if (n) {printf ("Úspěch \ n"); exit (0); } else {printf ("Přístup odepřen \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Aplikace vyžaduje parametr \ n"); exit (-1); } test (argv [1]); }
Program je pojmenován podle přetečení. ca ke kompilaci bylo použito následující:
 gcc overflow.c -o overflow -fno -stack -protector
Poslední část: -fno-stack-protector Používá se k tomu, aby kompilátor nedal ochranu, a můžeme ukázat příklad. Pokud uživatel zadá správná data, což je řetězec o maximálně 15 znacích, program funguje dobře, pokud zadáme nesprávné „heslo“, zobrazí se nám Přístup odepřen, a pokud dáme "Test"Postaví nás." Úspěch. Podívejme se na zachycení provádějící program 2krát, jednou s nesprávným přístupem a druhý se správným řetězcem:

Vidíme, že vše funguje správně. Ale co když vložíme horní řetězec, uvidíme, co se stane:

Spustili jsme program s 20 písmeny A, a ukazuje nám Úspěch. V této aplikaci nemáme nic, jednoduše aplikaci ukončíme, ale vstoupili jsme do omezené oblasti bez znalosti hesla. Pokud nahradíme následující funkci:

 strcpy (buffer, str);
Podle následujícího:
 strncpy (buffer, str, 15);
Y spustíme kód s 20 písmeny A, máme následující výstup:

Můžete také vidět, že je využíváme strcmp, místo toho bychom měli použít strncmp, takže také kontrolujeme velikost. Řídili jsme, že lze zkopírovat pouze maximálně 15 znaků, takže to neovlivní náš program, pokud vloží více. Pokud po zobrazení zprávy Úspěch provedeme systémový příkaz (v tomto případě kdo jsem), získáváme informace:

Nahoře nejsme root, ale pokud to spustíme pomocí sudo, dostaneme následující:

Jediná věc, kterou jsme přidali, je řádek v kódu, který jsme viděli výše, pod řádkem kódu:

 printf ("Úspěch \ n");
Vložili jsme:
 systém („whoami“);
Abych trochu porozuměl tomu, co se stalo, upravím program tak, aby zobrazoval 2 proměnné, které máme (vyrovnávací paměť Y n) ať už je to správné nebo ne, a níže je výstup, nejprve vložíme řetězec, který bude považován za správný („Test”), Pak nesprávný, který nepřesahuje délku a nakonec 20 písmen A.:

Vidíme, že při prvním provedení to stojí za to 1 Proměnná n, protože předaný řetěz je správný, ve druhém to stojí za to 0, protože je to špatně, ale v tom posledním to stojí za to 1094795585, což přeskočí podmínku, kterou jsme dali pokud (n)„Bude to pravda, pokud se n liší od 0. Není to dobrý stav, i když by nemusel selhat, pokud by byl zbytek kódu správný. Pokud dáme 16 písmen A. jako parametr uvidíme, že hodnota proměnné n to je 65:

Pokud se podíváme na kód ASCII, číslo 65 odpovídá písmenu NA, viděli jsme, že jsme omylem zasáhli do paměti proměnné n, že do proměnné přešlo další písmeno, které jsme předali jako parametr n. Měli bychom paměť následovně:

Pokud překročíme rámec znaků, může nám to poslat zprávu o narušení segmentu (pokud odstraníme výstup (0) co máme v pokud (n)), můžeme to vidět na následujícím obrázku:

Toto varování je způsobeno pokusem o přístup k oblasti paměti, která je mimo limity té, kterou aplikace přiřazuje operační systém. Pokud bychom příklad zkompilovali následovně:

 gcc overflow.c -o overflow -fstack -protector
Nebo jen odstranit -fno-stack-protector Z kompilace, kterou jsme viděli poprvé, a spustíme kód s přetečením, získáme následující výsledek:

Extra ochrana, kterou nám poskytuje gcc.

PoznámkaPokud bychom chtěli spustit kód (shellcode) museli bychom přepsat zpáteční adresu adresou našeho shellcode, je poněkud složitější než příklad viděný v tutoriálu, a proto vyžaduje více práce.

Pokud se někomu podaří využít této zranitelnosti, může vám způsobit mnoho škod. Vyhněte se tomuto typu selhání a to, že škodlivý uživatel toho může využít, je velmi snadné, správně programovat, musíte dobře znát používaný programovací jazyk, vědět, jaké funkce používat a co nepoužívat, otestovat aplikaci No, nejen se správnými údaji, musí také správně fungovat, když pracujeme s nepředvídanými daty.

Další útoky, které můžete zkontrolovat a být si jich vědomi, aby vás neovlivnily nebo minimalizovaly rizika, jsou: DoS a Brute Force. A nezapomeňte zkontrolovat zranitelnost na stránce CVE.

Líbil se vám tento návod a pomohl mu?Autora můžete odměnit stisknutím tohoto tlačítka, čímž mu dáte kladný bod
wave wave wave wave wave