COMPUTERWORLD
Specializovaný týdeník o výpočetní technice

Seriál
o bezpečnosti
a informačním soukromí

Část 14 - CW 24/97

Integrita -- můžete se spolehnout na svá data?

Antonín Beneš ml.


Jezdíte rádi autem? Pojďme se svézt. Tady je dlouhá rovinka, můžete to rozjet. Pozor, teď přijde levá zatáčka. Zpomal, sakra. Nebrzdí... Při technické prohlídce vraku vašeho vozu bylo zjištěno, že byl úmyslně poškozen brzdový systém. Nenaštvalo vás to. V té době vám již několik dní bylo všechno jedno.

Proč ten morbidní úvod? Řeč bude o integritě, nebo chcete-li celistvosti, či neporušenosti dat. Pokusíme se ukázat, že otázka integrity dat rozhodně není Popelkou problematiky bezpečnosti. Právě naopak -- ve specifických situacích může mít cenu nejvyšší.

Vraťme se nakrátko k našemu úvodnímu příkladu. V okamžiku, kdy jste nasedali do svého vozu, vypadal naprosto v pořádku. Stejně jako včera či předevčírem. Zdánlivě jeho integrita nebyla narušena. Nic nenasvědčovalo tomu, že šikula s kleštěmi přeštípl trubku ovládající brzdy, čímž, přeloženo do počítačové terminologie, porušil integritu vašeho vozu.

Mimořádná nebezpečnost podobných činů spočívá právě ve faktu, že poškození není za běžných okolností patrné. Naopak, obyčejně bývá obtížně detekovatelné. Stejně jako v případě poškození dat, největší nebezpečí či škodu zpravidla nezpůsobí vlastní poškození, ale až následné (nevědomé) používání poškozené věci. Často je podobné poškození dat daleko nebezpečnější, než jejich úplná ztráta. Počítače na základě dat, která spravují, řídí nejen telekomunikační centrály, ale mnohdy ovládají i nebezpečné technologické procesy, či poskytují podklady pro rozhodování dispečerům letecké dopravy. Poškození dat může způsobit nejen značné materiální škody, ale i velmi reálné ohrožení desítek lidských životů.

Ejhle, chyba

Počítače datům, která zpracovávají, zpravidla nerozumějí a nedokáží je interpretovat. Nemohou tedy "pohledem" určit, že je něco v nepořádku. Namísto toho je nutné stanovit jednoduchá pravidla, která data musí splňovat. Počítač potom mechanicky ověřuje platnost pravidel, aniž by musel znát sémantiku dat.

Porušení integrity dat můžeme rozdělit do několika kategorií:

-- Nejméně nebezpečné jsou chyby vzniklé na základě disfunkce techniky. Sem řadíme zejména komunikační chyby při přenosu dat, chyby při čtení záznamových médií, chyby způsobené nedostatky programů.

-- Druhou kategorií jsou chyby vzniklé v důsledku neúmyslných omylů lidí. Především jde o chybně zadané vstupní údaje, překlepy apod., ale také o nesprávnou manipulaci s daty.

-- Nejnebezpečnější a nejhůře detekovatelné jsou chyby způsobené cílevědomou činností útočníků se záměrem poškodit data.

Škůdci

Podívejme se, jak dochází k poškození dat. Data jsou nejzranitelnější v době, kdy jsou přenášena mezi jednotlivými počítači. To útočník samozřejmě ví a proto na nás má připravenu řadu metod poškozujících komunikaci. Může se snažit jednoduše zachycovat zprávy a po nějakém čase je opětovně posílat na místo určení. Pokud banka pozná, že daný příkaz k platbě již provedla, nemusí být následky tragické. Další možností je pozměňování pořadí zpráv s přenášenými daty. Útočník také může náhodně pozměňovat data a čekat, kdy bezpečnostní mechanismy nezjistí zásah. Případně může zkoušet ze zachycených zpráv skládat zprávy nové, nebo vkládat do komunikace zprávy vlastní.

Uvědomme si, že přenosy probíhají po linkách, které zpravidla nemáme pod kontrolou. Musíme je sdílet s dalšími uživateli. Rovněž není příliš těžké se na ně napojit a veškerou komunikaci odposlouchávat. To vše způsobuje, zejména mezi vnějšími útočníky, značnou popularitu útoků proti komunikaci.

Pokud má útočník přístup k datům přímo uvnitř systému (ať již proto, že je šikovný, nebo proto, že je náš zaměstnanec), může používat daleko přímočařejší a účinnější metody. Oprávněný uživatel musí být schopen s daty manipulovat -- je to předmětem jeho práce. Pokud se však rozhodne záměrně je pozměňovat, je těžké mu v tom bránit. Často zná použité bezpečnostní mechanismy a dokáže je tedy obejít. Vnitřní útočník má navíc někdy možnost upravit programy, které data spravují. Dokonce může, pokud je dost

schopný, bezpečnostní mechanismus zcela odstavit.

Ochrana nejen pro pány

Jak se tedy bránit? Kupodivu nejsnazší je bránit se proti chybám techniky. Počátek bezpečnostních mechanismů se datuje do dob úsvitu počítačů.

Nejjednodušší metodou jsou paritní bity. K několika (nejčastěji osmi) bitům užitečné informace přidáme ještě jeden -- paritní -- navíc. Hodnota tohoto bitu je potom nastavována tak, aby počet všech jedniček ve skupině byl sudý (sudá parita), nebo lichý (lichá parita). Vždy, když tato data čteme, zkoumáme, zda je počet jedničkových bitů správný. Metoda dokáže odhalit lichý počet chyb.

Trochu lepším mechanismem jsou kontrolní součty (checksums). Celá data si rozdělíme na bloky stanovené délky (několik bajtů). Spočítáme logickou funkci XOR prvního a druhého bloku, na výsledek operace a třetí blok aplikujeme opět funkci XOR atd. To, co získáme, je hledaný kontrolní součet, který připojíme na konec přenášeného bloku dat. Chceme-li ověřit integritu dat, provedeme obdobnou proceduru. Pokud je výsledkem blok ze samých nul (uvažte, že pracujeme s daty, ke kterým je přidán kontrolní součet), jsou data v pořádku.

Ještě lepší zabezpečení poskytuje speciální třída mechanismů nazývaných cyklické redundantní kódy, nebo krátce CRC. Binární reprezentaci dat lze chápat mimo jiné jako polynom nad tělesem charakteristiky 2. (Jednotlivé bity jsou koeficienty polynomu.) Použitý CRC kód je sám zadán svým charakteristickým polynomem (opět řetězec jedniček a nul). Při výpočtu výsledného kódu vydělíme polynom, který odpovídá zabezpečovaným datům, charakteristickým polynomem CRC kódu. Zbytek po dělení je hledaný zabezpečovací kód.

Uvedené metody umožňují zjistit, že došlo k poškození dat. Systém tak má příležitost na vzniklou situaci reagovat. Pokud použijeme "chytré" kódování znaků přenášené abecedy, můžeme nejen zjišťovat, že k chybě došlo, ale některé z chyb též opravit. Kódům, které toto umožňují, říkáme samoopravné kódy.

Definujme vzdálenost dvou slov jako počet míst, na kterých se od sebe liší. (slova táta a máma mají vzdálenost 2) Samoopravný kód používá kódová slova větší délky, než je nezbytně nutné pro přenos užitečné informace. Díky tomu mohou jednotlivá slova kódu být od sebe dostatečně vzdálená. Pokud dojde k chybě, kód určí kódové slovo, které má nejmenší vzdálenost od přijatého slova. Proto samoopravný kód umožňuje opravovat výskyt n/2 chyb v přenášeném slově, kde n je minimální vzdálenost dvou kódových slov.

Když to nejde po dobrém

Dosud uvedené metody jsou efektivní jen v případě, že potřebujeme data zajistit proti chybám techniky. Jejich slabinou je, že jsou snadno napodobitelné. Nehodí se tedy pro ochranu dat před úmyslnými útoky. Zde musíme k zajištění integrity obsahu zpráv použít metody, které mají vhodné kryptografické vlastnosti. Zejména je důležité, aby výsledná kontrolní hodnota závisela co nejkomplikovanějším způsobem na každém bitu zajišťované zprávy. Pak není možné pozměňovat obsah jednotlivých částí. Rovněž chceme, aby nebylo možné zprávu upravit a spočítat novou kontrolní hodnotu upravené zprávy.

Důležitou roli hrají tzv. kryptografické hašovací funkce. Nebudeme se pouštět do rozboru matematického pozadí těchto funkcí. Podstatné je, že tyto funkce jsou jednosměrné, tzn., že pro daný obraz je obtížné najít odpovídající vzor. Mnohé z nich jsou navíc odolné vůči kolizím -- známe-li dvojici vzor-obraz, je obtížné najít další vzor se stejným obrazem.

Pokud výpočet hodnoty funkce závisí na klíči, hovoříme o autentizačním kódu zprávy (MAC - Message Authentication Code). V opačném případě se jedná o kód pro detekci modifikací (MDC - Modification Detection Code).

Výsledkem funkcí je řetězec (hašovací hodnota) konstantní délky. Pokud jsme použili funkci MAC, tento řetězec připojíme za konec původní zprávy a jsme hotovi. Výsledek funkce MAC závisí na tajném klíči. Útočník tedy nemůže spočítat hašovací hodnotu pozměněné zprávy. Díky vlastnostem těchto hašovacích funkcí rovněž nemůže postupovat tak, že by k danému "haškódu" hledal další odpovídající zprávu.

Pokud jsme použili funkci MDC, získali jsme hašovací hodnotu, která dobře závisí na celém obsahu zprávy. Je však kdykoliv (a hlavně kýmkoli) znovu spočitatelná. Proto ji nemůžeme použít přímo jako v případě funkcí MAC. Namísto toho ji elektronicky podepíšeme pomocí vhodného šifrovacího algoritmu s veřejným klíčem (např. RSA) a ke zprávě připojíme až tento elektronický podpis. Tak jsme pořídili kontrolní součet, který je dokonce veřejně ověřitelný. Díky vlastnostem šifrovacího algoritmu jej ale dokáže vyrobit pouze odesílatel zprávy. Z důvodů stejných jako u kódů MAC nelze najít ani jinou zprávu, která by měla stejný kontrolní součet.

Pořádek v pořadí

Vyzbrojeni znalostmi o vytváření kryptografických kontrolních součtů můžeme rovnou vyřešit problematiku ochrany proti pozměňování pořadí a opakovanému zasílání starších zpráv. Jednou možností je číslování zpráv. Systém nesmí přijmout zprávu, která má nižší číslo, než poslední přijatá zpráva. Je samozřejmě nutné, aby kryptografický kontrolní součet závisel rovněž na čísle zprávy.

Pokud přenášené zprávy rovněž šifrujeme vhodným algoritmem, můžeme použít tzv. ofsetování klíčů. Číslo odpovídající pořadí zprávy potom nepřipojujeme ke zprávě, ale přičteme jej ke klíči. Takto upraveným klíčem potom zprávu zašifrujeme. Pro použití ofsetovaných klíčů platí stejná pravidla, jako v případě očíslovaných zpráv.

Pátá kolona?

Zbývá nám vyřešit problém, jak chránit integritu dat proti autorizovaným uživatelům. Proti chybným zadáním dat se lze bránit zavedením formálních kontrol zadávaných informací. Můžeme kontrolovat, zda vkládaná hodnota je pravděpodobná (pracovník pracoval méně než 20 hodin za den), zda hodnota je syntakticky správná (datum obsahuje dvě tečky) atd. V úvahu připadá též opakované zadávání týchž dat různými pracovníky. Před realizací vybraného okruhu operací může systém požadovat explicitní potvrzení pokynu k provedení operace. Tak zamezíme náhodnému poškození dat.

Proti úmyslnému poškození dat ze strany autorizovaných uživatelů ochrana v podstatě neexistuje. Je však vhodné, aby systém vedl podrobné záznamy o tom, kdo, kdy a jaké změny spravovaných dat prováděl. To sice nezabrání poškození dat, ani příliš neusnadní detekci poškození, ale pokud zjistíme, že taková situace nastala, alespoň můžeme podniknout kroky zamezující jejímu opakování.

Trocha teorie závěrem

Formálně se otázkami integrity zabývá Bibův bezpečnostní model. Budeme se mu podrobně věnovat v článku o víceúrovňové bezpečnosti. Zde se krátce zmíníme o Clark-Wilsonově modelu. Model předpokládá, že veškeré manipulace s daty jsou prováděny výhradně prostřednictvím spolehlivých transformačních procedur. Pomocí procedur pro verifikaci integrity se ověří, že všechna data jsou v pořádku a následně aplikací transformačních procedur systém přechází z jednoho konzistentního stavu do druhého.

Certifikaci transformačních procedur provádí administrátor. Každý uživatel má specifikován okruh procedur, které smí používat. Cílem je docílit takového přiřazení procedur uživatelům, aby žádný uživatel neměl k dispozici všechny procedury nutné k provedení celé operace. Například pokladní může provést výplatu peněz, ale nemůže vydat povolení k provedení této platby, které však v korektní transakci musí vlastní platbě předcházet.

Doufáme, že se nám podařilo vás přesvědčit, že problematika integrity dat je nejen důležitou, ale i docela zajímavou oblastí bezpečnosti. Věříme, že náš výklad příliš nenarušil integritu vaší osobnosti.

Seriál je rovněž dostupný na www.idg.cz/computerworld/bvsk/


| COMPUTERWORLD - seriál o bezpečnosti | COMPUTERWORLD | IDG CZ homepage |