Přetečení bufferu je velkým zdrojem potíží

DEFINICE K přetečení bufferu dochází tehdy, když se počítačový program pokouší uložit do bufferu (tedy do defino...


DEFINICE
K přetečení bufferu dochází tehdy, když se počítačový program pokouší uložit do
bufferu (tedy do definované dočasné vyrovnávací paměti) více informací, než se
jich tam vejde. Nadbytečné bajty dat potom zpravidla přepíší platný obsah
paměti. Za určitých okolností mohou být dokonce přetečená data interpretována
jako program a provedena.
Pokud provedete na internetu hledání na téma "přetečení bufferu", získáte
stovky nebo dokonce tisíce odkazů a většina z nich se bude týkat počítačové
bezpečnosti. Není divu. Přetečení bufferu se jí skutečně velmi citlivě dotýká.
V seznamu počítačových slabin ICAT, který dává dohromady americký institut NIST
(National Institute of Standards and Technology), je na prvních 10 místech 6
slabin souvisejících právě s přetečením bufferu. V roce 1999 jmenovala nyní již
zaniklá analytická společnost Hurwitz Group přetečení bufferu (buffer overflow)
jedničkou mezi počítačovými slabinami. Také nyní, o 4 roky později, jde o
závažný problém.

Jak buffer přetéká
Pokud jste se někdy pokoušeli nalít půllitr vody do skleničky o objemu 2
decilitry, pak si dokážete barvitě představit, o čem je řeč. V případě vody
dochází k rozlití tekutiny všude kolem.
Uvnitř počítače se stane něco podobného, pokud se snažíte uložit příliš mnoho
dat do prostoru, který byl vyhrazen pro méně dat. Vstupy počítače za
standardních okolností míří do dočasných úložných prostorů, nazývaných buffery,
jejichž velikost je definována v aplikačním programu nebo přímo v operačním
systému.
Za ideálních podmínek program kontroluje délku dat na vstupu a nedovolí vložení
příliš dlouhých dat do krátkého bufferu. Mnohé programy ale předpokládají, že
se uvedená data do vyhrazeného prostoru vždy vejdou.
Operační systémy využívají buffery nazývané zásobníky (stack), kam se data
ukládají dočasně mezi operacemi. Tyto zásobníky mohou rovněž přetéci.
Když se do bufferu dostane příliš dlouhý řetězec dat, všechny nadbytečné bajty
jsou zapsány do úseku paměti, který bezprostředně následuje za úsekem
vyhrazeným bufferu což ovšem může být další buffer, ukazatel na nějakou
instrukci nebo výstupní vyrovnávací paměť programu. Cokoli na tomto místě je,
je přepsáno, a tak zničeno.
To už je samo o sobě problémem. Prosté zahození kousku dat nebo úseku instrukcí
může způsobit, že program nebo dokonce operační systém spadne. Mohou se stát
ale ještě i daleko horší věci. Nadbytečné bajty mohou být interpretovány jako
instrukce a provedeny. Potom mohou provést v rámci počítače takřka cokoli mohou
být totiž spuštěny na nejvyšší bezpečnostní úrovni (administrátor, root), která
přísluší danému paměťovému úseku.

Špatné programování
Přetečení bufferu je výsledkem velmi dobře známé a snad-no pochopitelné
programátorské chyby. Jestliže program nekontroluje na možnost přetečení každý
znak vstupních dat (resp. každou dávku těchto dat) a nepřestane data přijímat v
okamžiku, kdy je buffer naplněn, je tu možnost přetečení bufferu a je jen
otázkou času, kdy k němu dojde. Uvedená kontrola je ovšem často považována za
zbytečnou, protože vyžaduje určitou časovou režii.
Především v době, kdy byly počítače méně výkonné a měly méně paměti, bylo
odstranění (resp. nezavedení) takových kontrol ospravedlnitelné. Důsledky
platnosti Moorova zákona ale tuto omluvu zrušily my však stále provozujeme
množství kódu, který byl napsán před 10 nebo 20 lety, a to i přesto, že
provozujeme poslední verze aplikací.
Některé programovací jazyky jsou vůči problému přetečení bufferu imunní: Perl
automaticky mění velikost polí v případě potřeby, Ada95 možné přetečení bufferu
detekuje a v případě potřeby mu brání. Nicméně jazyk C (a ani jeho rozšíření
C++), nejpoužívanější programovací jazyk dneška, neobsahuje žádnou z uvedených
kontrol, a programy v tomto jazyce tedy mohou často bez problémů zapisovat i za
konec vyhrazeného pole znaků.
Také standardní knihovna funkcí jazyka C obsahuje řadu funkcí pro kopírování
nebo spojování řetězců, které neprovádějí žádnou kontrolu jejich délky proti
délce cílového prostoru. C++ je na tom o poznání lépe, ale i tak se tu nabízí
řada příležitostí pro přetečení bufferu.

Crackerova volba
Přetečení bufferu se stalo pro autory virů a programů chovajících se jako
trojské koně jednou z nejoblíbenějších metod útoku na počítače. Crackeři jsou
zběhlí v tom, jak najít programy, u nichž lze přeplnit buffery a pak provést
specifické akce s privilegii roota například přinucení počítače k tomu, aby
zničil datové soubory, změnil nějaká data, zveřejnil citlivé informace nebo
vytvořil zadní vrátka pro přístup do systému.
Dobrým příkladem může být více než 3 roky stará situace. V červenci roku 2000
bylo zjištěno, že programy Microsoft Outlook a Outlook Express umožňují
útočníkům kompromitovat cílové počítače prostým posláním e-mailové zprávy.
Nikdo dokonce ani nemusel zprávu otevřít jakmile uživatel stáhl zprávu ze
serveru, rutiny pro práci s hlavičkou zprávy spustily svou činnost bez toho,
aby kontrolovaly délku dat. Tak mohlo dojít k přetečení bufferu a provedení
instrukcí, které s sebou dotyčný e-mail nesl. Microsoft poté vydal záplatu,
která uvedený nedostatek řeší.
To byl ovšem jenom jeden příklad za všechny. Je velmi pravděpodobné, že desítky
dalších aplikací v sobě chyby umožňující přetečení bufferu i nadále obsahují.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.