[ slash @ 10.11.2001. 11:01 ] @
Private Release : UNIX System Security Research Labs : final.version[b#3rc2]


==============================================================================
B U F F E R O V E R F L O W S B Y E X A M P L E
BIND 8.2.3-REL & ProFTPd 1.2.0rc2
=============================================[ by slash <[email protected]> ]===



(0x00) U v o d
==============

Evo odlucio sam malo pojasniti bugove u BIND-u te proftpd-u za koje slobodno
mozemo reci da su jedni od najkoristenijih DNS/FTP servisa danas. Preporucujem
ovaj tekst svatkom tko zna C ili se jednostavno bavi hackingom kako bih shvatili
gdje se nalazi bug, ili u drugom slucaju kako se nebi sve svelo na jednostavno
pokretanje exploita.



(0x01) BIND 8.2.3-REL Bug #1
============================

BIND-8.2.3-REL/src/bin/named/ns_update.c:1636

case T_SIG:
if (dlen < SIG_HDR_SIZE || size < dlen)
return (0);
memcpy(cp1, cp, SIG_HDR_SIZE);
size -= SIG_HDR_SIZE;
cp += SIG_HDR_SIZE;
cp1 += SIG_HDR_SIZE;
n = dn_expand(msg, eom, cp, (char *)cp1, size);
if (n < 0 || n + SIG_HDR_SIZE > dlen)
return (0);
cp += n;
n1 = dlen - n - SIG_HDR_SIZE;
n = strlen((char *)cp1) + 1;
cp1 += n;
/* #1 */
if (size < n1)
return (0);
memcpy(cp1, cp, n1);
cp1 += n1;
return (cp1 - cp1init);

Ova funkcija je zaduzena za procesiranje T_SIG "resouce records"-a unutar
UPDATE paketa. Buffer overflow se dogadja zato sto dolazi do asinkronizacije
pointera `cp1' i variable `size'. `cp1' je pointer u data buffer u koji se pise
kod procesiranja paketa a `size' je broj preostalih, neiskoristenih byteova
unutar buffera. U ovom slucaju autor je je zaboravio oduzeti broj byteova koji
se upisuju u buffer (putem funkcije dn_expand) od variable `size'. Ovo nam
omogucuje da prepisemo buffer sa 1025 byta (MAXDNAME) minus par byteova zbog
memcpy.

Da bi ispravili bug moramo kod oznake #1 unijeti sljedecu liniju:

size -= n;




(0x02) BIND 8.2.3-REL Bug #2
============================

BIND-8.2.3-REL/src/bin/named/ns_update.c:1655

case T_NXT:
n = dn_expand(msg, eom, cp, (char *)cp1, size);
if (n < 0 || (u_int)n >= dlen)
return (0);
size -= n;
/* #1 */
cp += n;
n1 = dlen - n;
n = strlen((char *)cp1) + 1;
cp1 += n;

if ((*cp & 0x80) == 0) {

if (n1 < 4 || n1 > 16)
return (0);
}
if (n1 > size)
return (0);
memcpy(cp1, cp, n1);
cp1 += n1;
return (cp1 - cp1init);

Ovdje autori BIND-a grijese ne znajuci svrhu svog API-a. Funkcija `dn_expand'
vraca broj byteova za koliko je povecan "processing pointer". Ali moze pisati
samo `size' byteova u uotput buffer, koji je zadan pointerom `cp1'. Ipak `size'
se smanjuje zbog pogresne vrijednosti (broja byteova za koliko se pomaknuo "source
pointer"), dok se pointer `cp1' krece normalno. Ovo moze dovesti do buffer overflowa
u kojem slucaju mozemo prepisati MAXDNAME byteova izvan buffera.

Ovi overflowi su interesantni, ali ne i korisni (osim u nekim slucajevima kad
imamo arhitekture sa razlicitim "stack layout"-om, ili imamo privilegije za
izdavanje UPDATE paketa itd.).



(0x02) ProFTPd 1.2.0rc2
=======================

proftpd-1.2.0rc2/modules/mod_ls.c:333

char *p = nameline + strlen(nameline);
...
snprintf(p, sizeof(nameline) - strlen(nameline) - 4, " -> %s", l);

Gdje je nameline buffer na stacku.

char nameline[MAXPATHLEN + MAXPATHLEN + 128] = {'\0'};

Problem se manifestira ako je strlen (nameline) > (sizeof (nameline) - 3)
zato jer parametar duljine kod snprintf funkcije postaje negativan, te se
ponasa kao normalna sprintf funkcija. Iako nije moguce postici velicinu
buffera vecu od 124 bytea, ovaj bug pokazuje da "sign conversion" bugovi
jos uvijek postoje unutar popularnih programa i danas.



(0x02) Z a k lj u c a k
=======================

U ovom tekstu sam zelio pokazati koliko je bitno citati kod programa pa i
svog po nekoliko puta, jer kod programa koji koriste puno funkcija cesto
dolazi do zabune da ni sami autori neznaju svrhu svojih API poziva.


Shouts: predator, sirius, random, #!/bin/zsh .


Unix System Security Research Labs
slash - 14. Listopad anno 2000 (18:04pm)
[email protected] / [email protected] / [email protected]
"Use the source Luke" - unknown
[ stinger @ 10.11.2001. 13:06 ] @
veoma lepo obrazlozeno... :)
[ leka @ 13.11.2001. 14:47 ] @
Nadam se da si napisao patch-eve za sve to sto si nabrojio i poslao BIND timu... Interesuje me ako si im poslao to, kako su reagovali - tj. sta oni kazu na to.

[ slash @ 13.11.2001. 19:53 ] @
Citat:
leka je napisao:
Nadam se da si napisao patch-eve za sve to sto si nabrojio i poslao BIND timu... Interesuje me ako si im poslao to, kako su reagovali - tj. sta oni kazu na to.



patcheve sam napisao, ali BIND dev team nisam mejlao iz jednostavnog razloga -- ne pregovaram s vendorima. Podrzavam non-discloasure (http://anti.security.is) i svoje bugove i exploite ostavljam za sebe, jer ih na kraju i pisem samo za sebe. Sebicno ? Mozda...



[ leka @ 14.11.2001. 12:49 ] @
Da, sebicno je (po meni).
Ako koristis GNU software i ako znas da napises patch onda je zaista sebicno da patch koji si napisao ne posaljes. Na kraju krajeva, da tako ne radi narod sirom sveta nebi ni bilo tako rapidnog razvoja OpenSource aplikacija.

Na nesrecu, mnogo programera, ima svoje uvrnute stavove i ne razmislja o tome da sami uzivaju blagodeti koje su stvorene u OpenSource zajednici.
[ leka @ 14.11.2001. 12:50 ] @

Pogotovo je sebicno ako OVDE napises (maltene) patch i izgubis silno vreme pisuci onaj tekst gore, isto toliko vremena si mogao da odvojis za par diff-ova... Zar ne?
[ Dusan Marjanovic @ 14.11.2001. 22:01 ] @
Citat:
leka je napisao:

Pogotovo je sebicno ako OVDE napises (maltene) patch i izgubis silno vreme pisuci onaj tekst gore, isto toliko vremena si mogao da odvojis za par diff-ova... Zar ne?

mislim da nije stvar u tome da coveka mrzi...vec se jednostavno pridrzava politike koju propagira sajt anti.security.is. A kad na sajtu procitas obrazlozenje takve politike, sa jedne strane i jeste tako.
[ slash @ 20.11.2001. 13:35 ] @
Kao prvo mislim da je odluka na meni gdje cu sto postati i dali cu obavijestiti vendore, pa zato molim da mi ne predbacujete sto svoje stvari drzim prvenstveno za sebe. Cijenim vase kritike ali mislim da bi vi isto trebali cijeniti cinjenicu da sam svoj rad odlucio podjeliti
upravo s vama, jer svrha mojeg teksta nije da objavljujem bugove kako bi netko napisao exploite, vec
da svi zajedno nesto naucimo a mislim da se i cijeli ovaj forum svodi na to. Zasto objaviti tekst u
kojem se opisuje bug a ne priloziti patch ? Pisanje patcha ostavljam spretnima s vise vremena. Moje vrijeme ipak -- kosta.


pozdrav,

sliz-ash
[ Vojislav Milunovic @ 21.11.2001. 02:34 ] @
Citat:
slash je napisao:
Pisanje patcha ostavljam spretnima s vise vremena. Moje vrijeme ipak -- kosta.


A sto lupi vako jeboga ti? Patch za ovo sto si naveo ne bi ti odneo vise od 2min.
[ stinger @ 21.11.2001. 12:16 ] @
Citat:
slash je napisao:
Kao prvo mislim da je odluka na meni gdje cu sto postati i dali cu obavijestiti vendore, pa zato molim da mi ne predbacujete sto svoje stvari drzim prvenstveno za sebe. Cijenim vase kritike ali mislim da bi vi isto trebali cijeniti cinjenicu da sam svoj rad odlucio podjeliti
upravo s vama, jer svrha mojeg teksta nije da objavljujem bugove kako bi netko napisao exploite, vec
da svi zajedno nesto naucimo a mislim da se i cijeli ovaj forum svodi na to. Zasto objaviti tekst u
kojem se opisuje bug a ne priloziti patch ? Pisanje patcha ostavljam spretnima s vise vremena. Moje vrijeme ipak -- kosta.


Goody, it's true :)
[ Gojko Vujovic @ 21.11.2001. 12:49 ] @
I ja se slažem da ne treba da im piše patch ako ga ne plate, ali i da ne objavljuje javno gotov exploit, i dobro je što je tako i postupio.

A ovo je zaista velikodušno što je slash odlučio da objavi ovakve podatke upravo na ES-u i molim ostale da to poštuju.

Slash, good work, kao i uvek :)


[ Vojislav Milunovic @ 21.11.2001. 17:15 ] @
A sigurno ima patch vec za to. Sigurno da ima cim su vec objavili verziju 9. Ako u 9eci toga ima onda znaci da je bug jos neotkriven ali ako je bug ispravljen onda sigurno vec ima patch.
[ BoyScout @ 29.04.2003. 20:49 ] @
BTW ljudi, ne znam da li ste znali, ali ovaj tekst nije pisao slash niti je slash otkrio te bugove.
[ BobMarley @ 30.04.2003. 00:14 ] @
pa ljepo pise gore da je on napisao tekst, da li imas mozda neku originalniju verziju kada vec prozivas ?
[ BoyScout @ 30.04.2003. 00:27 ] @
Imam!
Evo je:

http://161.53.51.222/proof/scut.txt

To je original

Usporedite to sa slashevom verzijom, i vidjet cete da je 'njegov' tekst 1:1 prijepis od Scuta.

Evo, jos jednom prilazem slashovu kopiju.

http://161.53.51.222/proof/slash.txt

S tim da morate uzeti u obzir da je Scut jedan od vecih strucnjaka iz vrlo hvaljene security grupe team-teso iliti 7350 koja se bavi sigurnosnim istrazivanjima, a sigurno vam je poznato da su puno exploita napisali oni.

Prema Scutovim rijecima, slash je odnekud dobio njihovu privatnu verziju teksta koja je nekako procurila, a onda ju je slash preveo i napisao da je to njegovo i da je on otkrio te bugove. Molim komentare.
[ 6544616a006e @ 30.04.2003. 02:07 ] @
Ma dobro, svi znamo da su hakeri uglavnom skriberi...
[ 6544616a006e @ 30.04.2003. 02:11 ] @
Mene je zapravo mrzelo da tražim original na NET-u, mada sam znao da postoji, jer sam ga davno pročitao... Glupo je gubiti vreme na dokazivanje lamerizma naroda...

slash-a treba poštovati svejedno, znate zašto - čovek je ipak potrošio silno vreme prevodeći!

Čudi me samo da niko nije komentarisao ovo "otkriće" :)

Hehe, da li treba davati još neme mnogo poznatije skribere kod nas? - Evo jednog, svima dobro znanog - Dejan Ristanović. Čovek je, kako je moj pokojni deda znao da veli, "prepisao Boga Oca"!

Svako može da to i dokaže.
[ 6544616a006e @ 30.04.2003. 02:15 ] @
Leko, jedna ispravka: pišući i prevodeći ... i nauči da koristiš naša slova na Linux-u! (Dragiša čitaš li?)

Citat:
leka:

Pogotovo je sebicno ako OVDE napises (maltene) patch i izgubis silno vreme pisuci onaj tekst gore, isto toliko vremena si mogao da odvojis za par diff-ova... Zar ne?

[ BobMarley @ 30.04.2003. 12:58 ] @
hehe ... jebiga, u lazi su kratke noge :)

a ko kaze da nije scut prepisao od Slasha ? :))))



[ BobMarley @ 30.04.2003. 12:59 ] @
Citat:
Gojko Vujovic:
I ja se slažem da ne treba da im piše patch ako ga ne plate, ali i da ne objavljuje javno gotov exploit, i dobro je što je tako i postupio.

A ovo je zaista velikodušno što je slash odlučio da objavi ovakve podatke upravo na ES-u i molim ostale da to poštuju.

Slash, good work, kao i uvek :)




Gojko se vec ufurao :) "kao i uvek" :)
Leka isto tako
[ 6544616a006e @ 30.04.2003. 19:14 ] @
Da, svako od njih dvojice na svoj način - Gojko za dobrobit ES-a, Leka za dobrobit GNU sveta... ;)