Přetečení na zásobníku: Porovnání verzí
Smazaný obsah Přidaný obsah
m →Vizualizace útoku v paměti: Vizualizace by měla odpovídat kódu |
Formulace, opravy chyb |
||
Řádek 1:
'''Přetečení zásobníku''' ({{Vjazyce2|en|'''buffer overflow'''}}) je v [[Informatika (počítačová věda)|informatice]] technika napadení [[Počítačový program|programu]] nebo [[Operační systém|operačního sytému]], která využívá přetečení [[Zásobník (datová struktura)|zásobníku]] ke spuštění libovolného [[Strojový kód|strojového kódu]], například přepsáním návratové adresy pro návrat z podprogramu.
== Příklad útoku ==
=== Zdrojový kód ===
<source lang="c">
void
char buffer[8];
strcpy (buffer, str);
}
int main () {
char *str = "excessive
function (str);
}
Řádek 17 ⟶ 18:
=== Vizualizace útoku v paměti===
*
*
{| class="wikitable" style="width:30em; text-align:center; white-space:nowrap;"
!
! colspan="8" style="background:#ddf;" |
! colspan="2" style="background:#fdd;" | SP
! hodnota
| colspan="8" | žádný obsah
| colspan="
|
! HEX
| 00 || 00 || 00 || 00 || 00 || 00 || 00 || 00
| style="background:#fdd;" | 1E
| style="background:#fdd;" | E7 |}
Pokud zapíšeme na zásobník řetězec delší než 8 bajtů, dojde k přetečení vyhrazeného bufferu (zde ve formě lokální proměnné, která je umístěna na zásobníku). Zapisovaný řetězec "excessive" je dle zvyklostí zakončen znakem <code>\0</code> (tj. binárně nula). Po jeho zápisu do proměnné ''buffer'' bude situace v paměti vypadat tak, jak je znázorněno v následující tabulce:
{| class="wikitable" style="width:30em; text-align:center; white-space:nowrap;"
!
! colspan="8" style="background:#ddf;" |
! colspan="2" style="background:#fdd;" | SP
! hodnota
| colspan="
|
! HEX
| 65 || 78 || 63 || 65 || 73 || 73 || 69 || 76
| style="background:#fdd;" | 65
| style="background:#fdd;" | 00 |}
== Obrana proti útoku ==
Obrana proti přetečení zásobníku je možná několika způsoby:
=== Z pohledu programátora ===
* pokud to není nutné nepoužívat jazyky, které používají přímý přístup k paměti (typicky C, C++)
Řádek 66 ⟶ 63:
* používání tříd a funkcí, které manipulují s pamětí bezpečně
* použití automatizovaných nástrojů v součinnosti s kompilátorem
====Fungování automatických nástrojů====▼
Většina automatických nástrojů, které se snaží tomuto způsobu zneužití zabránit používají tzv. kanárky (pojmenováno podle kanárků, kteří se používali v dolech na odhalení nebezpečných plynů). Jedná se o specifická data, která se umístí do paměti za nadefinované proměnné. Ve chvíli, kdy dojde k přetečení zásobníku, tak je přepsána i hodnota kanárka a přetečení je odhaleno. Kanárků se používá několik druhů - statický, náhodný nebo také XOR. ▼
* '''Statický kanárek''' je snadný na implementaci, ale neposkytuje příliš efektivní ochranu, neboť ve chvíli, kdy je hodnota kanárka vyzrazena, může útočník upravit vstupní data, tak aby nezměnili hodnotu kanárka a přetečení zůstane neodhaleno. ▼
* '''Náhodý kanárek''' je podobný a jeho účinnost je závislá na kvalitě generátoru náhodných čísel. ▼
* '''XOR kanárek''' je hodnota, která je výsledkem operace XOR nad náhodnou hodnotou kanárka a výsledkem funkce nad nadefinovanými proměnnými. Tím přidává další úroveň složitosti do případného útoku, protože je třeba zjistit jak náhodnou hodnotu, tak funkci, tak odpovídající vstupní hodnoty funkce (tedy obsah andefinovaných proměnných). ▼
Mimo využití kanárků tyto nástroje také přeskupují pozice proměnných v paměti tak, aby struktury náchylné na přetečení byly na začátku paměťového prostoru. Tato změna způsobí jednak to, že přepsáním dalších proměnných dojde pravděpodobně k chybě v programu, takže přetečení bude odhaleno. A také proto, že se zvětší šance, že vstupní data nebudou dostatečně dlouhá na přetečení mimo vyhrazený prostor. ▼
▲Většina automatických nástrojů, které se snaží tomuto způsobu zneužití zabránit, používají tzv. kanárky (pojmenováno podle kanárků, kteří se používali v dolech na odhalení nebezpečných plynů). Jedná se o specifická data, která se umístí do paměti za nadefinované proměnné. Ve chvíli, kdy dojde k přetečení zásobníku,
Pro většinu C/C++ funkcí existuje ekvivalentní ''"n" funkce''[http://stackoverflow.com/questions/1253053/cs-bad-functions-vs-their-good-alternatives], v případě <code>strcpy</code> i ''"l" funkce''. ''"n" funkce'' kontrolují délku stringu, ''"l" funkce'' ho ořežou a doplní ''\0''. ▼
▲
▲
▲
▲
==== Použití bezpečnějších ekvivalentů funkcí ====
▲Pro většinu C/C++ funkcí existuje ekvivalentní ''"n" funkce''
strcpy → strncpy → strlcpy
strlen → strnlen
Řádek 85 ⟶ 86:
=== Z pohledu uživatele ===
Uživatel se může pouze omezit následky takového útoku tím, že nebude spouštět nedůvěryhodné programy s právy privilegovaného uživatele, případně se mu vyhnout použitím aktualizovaných verzí programů. Stoprocentní obrana však neexistuje. I v současnosti přes široké povědomí o tomto typu útoku se objevují programy, které jsou na tento typ útoku náchylné. Chyby tohoto typu se objevují
=== Hardwarová ochrana ===
Dalším ze způsobů ochrany je [[NX bit]] (hardwarová ochrana paměti implementovaná v procesoru) který
== Reference ==
<references />
== Související články ==▼
▲Dalším ze způsobů ochrany je [[NX bit]] (hardwarová ochrana paměti implementovaná v procesoru) který zabrání spuštění kódu v datové části paměti, což je jeden ze způsobů jak využít buffer overflow zranitelnosti.
▲== Související ==
* [[Zásobník (datová struktura)]]
* [[Počítačová bezpečnost]]
|