wu.ftpd vulnerability - otazka

Martin Mares mj na atrey.karlin.mff.cuni.cz
Sobota Únor 13 19:09:53 CET 1999


Zdravim,

> Ftp server je vec, ktera musi bezet _rychle_ (i kdyz je na nem
> prihlaseno 200 uzivatelu) a neco takoveho si proste nemuze dovolit.

   Ehm, nebylo by lepsi zamyslet se nad tim, kolik casu stravi ftp server
operacemi se stringy? Ja si myslim, ze jedina casove kriticka cast takoveho
serveru je samotny file transfer (pominu-li ted na chvili listingy adresaru,
na ktere si ovsem vetsina ftp daemonu stejne pousti externi ls) a v nem
se IMHO vubec zadne stringove operace nedelaji. Opravdu by bylo nebylo
od veci, kdyby sitove servery tohoto typu zachazely se stringy trosku
opatrneji, i kdyz by je treba par procent vykonu v nekritickych vetvich
kodu stalo.
 
> Rozumny programator tu nulu dvakrat nehleda. Ostatne cecko te nenuti
> pouzivat takove retezce; muzes si klidne na zacatek pole napsat delku
> a pak znaky ... sice se ti bude rychleji pridavat na konec, ale uvedom
> si, ze na jakoukoli jinou manipulaci jsou null terminated stringy
> rychlejsi. Pokud v cyklu prochazis pascalsky retezec, potrebujes na to
> registry 2 (pointer a delka), zatimco na null terminated string staci
> jeden.

   To ovsem vubec nic nedokazuje. Sice mi dalsi registr zabere delka stringu,
ale na druhou stranu mohu pri provadeni operaci typu strcpy snadno pracovat
s vetsimi bloky najednou a usetrit tak testy na koncovou nulu, takze tyto
operace dokonce mohou byt rychlejsi a navic mohu bez obavy zpracovavat
binarni stringy, ktere obsahuji nuly (je mi ponekud stydno pri pomysleni,
ze vetsina Unixovych programu, ktere se jinak tvari, jako ze binarni
soubor schroustaji bez problemu, se zasekne na prvni nule a provede
tam nejakou vylomeninu).

   Jiny pribeh je ovsem zpracovavani stringu znak po znaku, pri kterem se
s kazdym znakem provadi netrivialni operace. Pak skutecne vlaceni se s dalsi
hodnotou a porovnavani s ni, jakmile chceme zjistit, zda jsme na konci,
znacnou pritezi ... pokud ovsem neskaceme po stringu tam i zpet a nepotrebujeme
testovat i zacatek -- tehdy nam nula na konci nijak nepomuze.

   Kdyz jsem se nad timto problemem zamyslel asi tak pred dvema lety, napadla
mne trosku netradicni representace stringu, ktera kombinuje oba pristupy
-- string obsahuje jak svoji delku (plus velikost alokovaneho prostoru),
tak nulovy znak na konci, jakoz i na zacatku. Naprosta vetsina operaci
je pak velice prijemne rychla, pouze nelze provadet "tail cut" (to jest
prohlaseni konce stringu za jiny string prostym ukazanim na nej).

				Have a nice fortnight
-- 
Martin `MJ' Mares   <mj na ucw.cz>   http://atrey.karlin.mff.cuni.cz/~mj/
Faculty of Math and Physics, Charles University, Prague, Czech Rep., Earth
"A LISP programmer knows value of everything, but cost of nothing."


Další informace o konferenci Linux