Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Jsou vaše peníze u Citibank v bezpečí?

Platby pomocí platebních karet jsou dnes již neodmyslitelnou součástí elektronického obchodování. Konkrétní implementace platebních bran se liší a v tomto článku bychom chtěli rozebrat platební bránu Citibank a její implementaci programu na počítání kontrolního součtu zpráv. Jsou vaše peníze u Citibank v bezpečí?

Na úvod vás zlehka zasvětím do tajů bezpečného programování. Jazyk C/C++ používá k ukládání textových řetězců do paměti takzvané NULL-terminated řetězce. V praxi to znamená, že má program na zásobníku kus paměti, který považuje za řetězec do té doby, než narazí na znak NULL (jenž je reprezentován znakem s hodnotou 0). Bohužel jazyk C nemá možnost zajistit, aby program zapisoval pouze do té části paměti, která byla pro řetězec předem vyhrazena (alokována), a pokud si programátor nedá pozor, může dojít k přepsání dat mimo tuto vyhrazenou paměť. Jelikož jsou na zásobníku uložena i data, která určují, na jakou adresu se má po ukončení funkce vrátit řízení programu, může dojít k jejich (ať už záměrné nebo nechtěné) změně a tím ke změně programu. V lepším případě se pak program chová nedefinovaně, v horším umožní případnému útočníkovi spustit vlastní kód. Tato chyba se nejčastěji nazývá „buffer overflow“ (přetečení bufferu) a je jednou z nejčastějších programátorských chyb zneužívaných pro útoky na Internetu.

Jistě už tušíte, kde asi udělali indičtí programátoři chybu v programu pro počítání kontrolního součtu, který je nabízen ke stažení na adrese: http://citicon­necttest.citi­businessdirec­t.com/CitiCon­nect/default.htm

Ano, hádáte správně. Jedná se o zapisování do bufferu s pevnou velikostí bez specifikování horní meze, a to hned na několika místech. Nebudu zde vypisovat všechny výskyty, uvedu jen několik do očí bijících případů:

Funkce Transpo(string, Key) – první vstupní parametr je sestavený řetězec s parametry zprávy posílané platební bráně, druhý parametr je takzvaný Working Key, s jehož pomocí je ze zprávy vypočten kontrolní součet.

Tato funkce obsahuje definici proměnných „char trans[500]“, „char str_bin[8000]“, tedy máme na zásobníku místo o velikosti 8.000 byte. Nyní si spočítáme délku vstupního řetězce řádkem „slen = strlen(string);“, dále pak pomocnou velikost „leng = slen * 8“, následně do proměnné str_bin uložíme číselnou reprezentaci ASCII znaků ve vstupním řetězci funkcí „asctobin(strin­g,slen,str_bin);“ (která uvnitř také obsahuje buffery o velikosti 8.000 znaků a nikde nekontroluje, nejsou-li vstupní data „delší“ než alokovaná část paměti. Následuje smyčka, která má za úkol vzít každý šestnáctý znak z překódovaného vstupního řetězce počínaje (slen MODULO 16):

for(i=vlen;i<leng;i+=16)
  strncat(trans,str_bin+i,1);

Opomeneme-li to, že vymyslet takto neefektivní implementaci stálo jistě spoustu práce celý vývojový tým programátorů, zůstává ve vzduchu viset otázka:

Co se stane, když délka vstupního řetězce bude delší než 1.000? Za prvé budeme kvůli „str_bin+i“ číst mimo paměť vyhrazenou pro buffer str_bin (leng = délka vstupního řetězce * 8). Za druhé budeme díky strncat(trans,…) zapisovat mimo paměť vyhrazenou pro buffer trans.

Správná implementace této smyčky by měla vypadat:

if (leng>=8000)
  exit(1); /* spatna vstupni data */
for(i=vlen,j=0;i<leng; i+=16, j++)
  trans[j] = str_bin[i];
trans[j] = 0;

Tím zajistíme, že proměnná „i“ nabude maximálně hodnoty 7.999 a proměnná „j“ maximálně hodnoty 499. A zároveň urychlíme chod programu, protože v každém průchodu smyčkou nepřipojujeme znak na konec řetězce, kdy program musí pokaždé procházet řetězec od začátku a hledat znak NULL, ale zapisujeme jej na přesně definovanou pozici a řetězec finálně ukončíme NULL znakem až po celém průběhu smyčkou.

Takovýchto chyb je v kódu knihovny nasekáno více a na některých místech (slen = strlen(string); string[slen] = 0; – aneb nalezneme znak NULL v řetězci, což dělá funkce strlen a následně na tuto pozici opět zapíšeme NULL) – mám pocit, že programátor nevěděl, co dělá.

Neměl jsem možnost takto prohlédnout zdrojový kód zbytku platební brány Citibank a pevně doufám, že tento kus kódu, který mi prošel pod rukama je ojedinělý výtvor, který byl programován ve čtyři ráno po týdnu beze spánku a desáté kávě. Obávám se však, že zbytek platební brány programovali ti samí lidé. A z toho mi běhá mráz po zádech.


Davame_internetu_obsah

       

Na straně obchodníka se tento špatně napsaný kód dá zabezpečit tak, že obchodník zajistí ověření velikostí a validity dat pro kontrolní součet sám. Bohužel nikde v dokumentaci není napsáno, jak velká vstupní data mohou být a obchodník, který si pouze nainstaluje již předkompilované binární knihovny, může být nemile překvapen. Co je na tomto případu horší, je fakt, že podobné chyby se mohou vyskytovat i v interním software platební brány a ty mohou být potenciálně v nejhorším případě zneužity k manipulaci s vašimi penězi.


Autor Citibank na problém upozornil, nedostalo se mu však odpovědi.

Ondřej Surý

Autor je technickým ředitelem CZ.NIC, z.s.p.o. a studentem FSS MU. Zajímá se o DNS, DNSSEC, Linux. Jeho nepočítačový blog najdete na adrese blog.rfc1925.org.

Školení Twitteru s Danem Dočekalem

DW - Školení PPC
  • Jak komunikovat na Twitteru.
  • Jak začlenit Twitter do marketingového mixu vaší firmy.
  • Jak využít Twitter jako zdroj informací pro rozhodování.
  • Nabízíme i školení Facebooku a Google+.

Detailní informace o školení Twitteru »

Přehled názorů

byly jsou a budou...
Libor Nováček 6. 9. 2002 09:00
Nový
....
kony 6. 9. 2002 09:01
Nový
└ 
Re: ....
rc 6. 9. 2002 10:35
Nový
Ebanka i Citi
Jan Janča 6. 9. 2002 09:43
Nový
└ 
Re: Ebanka i Citi
Ondřej Fryc 6. 9. 2002 14:24
Nový
 
└ 
eBanka shopy
salam 9. 9. 2002 07:41
Nový
 
 
└ 
Re: eBanka shopy
janca@mcl.cz 9. 9. 2002 08:09
Nový
 
 
 
└ 
sem toho snad tak moc nerekl :)
salam 9. 9. 2002 10:29
Nový
 
 
 
 
└ 
Re: sem toho snad tak moc nerekl :)
janca@mcl.cz 9. 9. 2002 10:58
Nový
spatne mi to zformatovali...
Ondřej Surý 6. 9. 2002 09:45
Nový
└ 
Re: spatne mi to zformatovali...
David 6. 9. 2002 10:13
Nový
 
├ 
Re: spatne mi to zformatovali...
Lubor Kolar 6. 9. 2002 10:15
Nový
 
│
└ 
Re: spatne mi to zformatovali...
David 6. 9. 2002 10:25
Nový
 
└ 
Re: spatne mi to zformatovali...
Ondřej Surý 6. 9. 2002 10:26
Nový
Citibank
Dennis 6. 9. 2002 10:46
Nový
├ 
Re: Citibank
Jikos 6. 9. 2002 10:56
Nový
│
├ 
Re: Citibank
salam 7. 9. 2002 14:09
Nový
│
└ 
Re: Citibank
Jirka Kosina 9. 9. 2002 00:58
Nový
│
 
└ 
Re: Citibank
Solvina 9. 9. 2002 14:34
Nový
└ 
Re: Citibank
Dan Lukes 7. 9. 2002 23:06
Nový
Vychodni filozofie
kubik 6. 9. 2002 11:04
Nový
└ 
Re: Vychodni filozofie
lm 6. 9. 2002 12:30
Nový
Konec cyklu & ebanka
Lukas Suchanek 6. 9. 2002 12:29
Nový
├ 
Re: Konec cyklu & ebanka
Michal Kubeček 6. 9. 2002 12:37
Nový
│
└ 
Re: Konec cyklu & ebanka
David Petrla 6. 9. 2002 13:53
Nový
│
 
├ 
Re: Konec cyklu & ebanka
Ondřej Surý 6. 9. 2002 14:40
Nový
│
 
│
└ 
Re: Konec cyklu & ebanka
David Petrla 6. 9. 2002 14:53
Nový
│
 
│
 
└ 
Re: Konec cyklu & ebanka
Ondřej Surý 6. 9. 2002 15:00
Nový
│
 
│
 
 
└ 
Re: Konec cyklu & ebanka
Petr 8. 9. 2002 18:44
Nový
│
 
├ 
Re: Konec cyklu & ebanka
Michal Kubeček 6. 9. 2002 15:26
Nový
│
 
├ 
Re: Konec cyklu & ebanka
mol 6. 9. 2002 23:13
Nový
│
 
│
└ 
Re: Konec cyklu & ebanka
David Petrla 9. 9. 2002 10:38
Nový
│
 
│
 
└ 
Re: Konec cyklu & ebanka
Ondřej Surý 9. 9. 2002 14:10
Nový
│
 
│
 
 
└ 
Re: Konec cyklu & ebanka
David Petrla 10. 9. 2002 08:47
Nový
│
 
│
 
 
 
└ 
Re: Konec cyklu & ebanka
shrek 10. 9. 2002 09:39
Nový
│
 
│
 
 
 
 
├ 
Re: Konec cyklu & ebanka
David Petrla 10. 9. 2002 09:45
Nový
│
 
│
 
 
 
 
│
└ 
Re: Konec cyklu & ebanka
shrek 10. 9. 2002 09:49
Nový
│
 
│
 
 
 
 
│
 
└ 
Iterátor
David Petrla 10. 9. 2002 10:20
Nový
│
 
│
 
 
 
 
└ 
Re: Konec cyklu & ebanka
shrek 10. 9. 2002 09:47
Nový
│
 
└ 
Re: Konec cyklu & ebanka
Petr 8. 9. 2002 18:37
Nový
├ 
Re: Konec cyklu & ebanka
PaJaSoft 6. 9. 2002 13:39
Nový
│
├ 
Re: Konec cyklu & ebanka & SET
PaJaSoft 6. 9. 2002 13:45
Nový
│
├ 
Re: Konec cyklu & ebanka
Lukas Suchanek 6. 9. 2002 13:46
Nový
│
│
└ 
Re: Konec cyklu & ebanka
Jan Spurny 7. 9. 2002 12:16
Nový
│
└ 
Re: Konec cyklu & ebanka
Michal Kubeček 7. 9. 2002 16:21
Nový
├ 
Re: Konec cyklu & ebanka
Michal Vodicka 7. 9. 2002 01:57
Nový
│
├ 
Oprava
Michal Vodicka 7. 9. 2002 06:23
Nový
│
├ 
Re: Konec cyklu & ebanka
shrek 8. 9. 2002 08:28
Nový
│
│
├ 
Re: Konec cyklu & ebanka
David Petrla 9. 9. 2002 10:42
Nový
│
│
│
└ 
Re: Konec cyklu & ebanka
Michal Kubeček 12. 9. 2002 00:17
Nový
│
│
└ 
Re: Konec cyklu & ebanka
Michal Vodicka 9. 9. 2002 21:42
Nový
│
└ 
Re: Konec cyklu & ebanka
kubik 10. 9. 2002 09:54
Nový
└ 
Re: Konec cyklu & ebanka
nobody 7. 9. 2002 14:12
Nový
Muzu jen potvrdit
Jan Kotek 6. 9. 2002 13:10
Nový
└ 
Re: Muzu jen potvrdit
Jan 6. 9. 2002 16:28
Nový
 
└ 
Re: Muzu jen potvrdit
Jan Kotek 6. 9. 2002 16:42
Nový
 
 
└ 
Re: Muzu jen potvrdit
Jan 6. 9. 2002 16:53
Nový
Mojebanka
7. 9. 2002 04:49
Nový
Banky a jejich nedostatky
Dennis 8. 9. 2002 16:17
Nový
└ 
Re: Banky a jejich nedostatky
RK 8. 9. 2002 19:36
Nový
 
└ 
Re: Banky a jejich nedostatky
Jerry III 9. 9. 2002 01:57
Nový
 
 
└ 
Re: Banky a jejich nedostatky
Jan Kotek 9. 9. 2002 14:24
Nový
 
 
 
└ 
Re: Banky a jejich nedostatky
Jerry III 9. 9. 2002 20:17
Nový
 
 
 
 
└ 
Re: Banky a jejich nedostatky
Jan Kotek 10. 9. 2002 10:54
Nový
Zdrojáky
Ondřej Surý 9. 9. 2002 14:13
Nový
Pozdě
MLysak 9. 9. 2002 22:16
Nový
├ 
Re: Pozdě
Lubor Kolar 10. 9. 2002 09:54
Nový
│
└ 
Re: Pozdě
Jan 10. 9. 2002 12:05
Nový
│
 
└ 
Re: Pozdě
Lubor Kolar 10. 9. 2002 17:23
Nový
└ 
Re: Pozdě
Jan 10. 9. 2002 11:49
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem