dns-terror (fastresolve-2.10_5) core dump na FreeBSD 10.x

Dan Lukes dan at obluda.cz
Wed Jan 13 13:58:18 CET 2016


On 13.1.2016 13:05, Miroslav Lachman wrote:
> Dlouha leta pouzivam prikaz dns-terror na resolvovani IP adres v log

> Stejne chovani je na 10.1 i 10.2
> +pid 62102 (dns-terror), uid 0: exited on signal 10 (core dumped)

To se stane snadno - staci aby byla aplikace neportabilne napsana a o 
svem okoli predpokladala veci, ktere v konkretnim prostredi neplati, a 
nestesti je na svete.

SIGBUS je obvykle znamka toho, ze se aplikace pokousela sahnout na 
pamet, na kterou sahat nema narok (nebo ktera dokonce vubec neexistuje).

K tomu staci malo - neoverit, ze nejaka funkce, ktera ma vracet pointer 
za nekterych okolnosti vrati NULL (staci treba prosta alokace pameti), 
nespravne predpokladat velikosty typu promennych a bohorovne ukladat 
pointer na cosi do int pripadne obracene a tak ...

> Zkousel jsem i truss, ale to uz se dostavam na tenky led, kde moc nevim,
> co delam a co mam videt.

> gettimeofday({1445175729.664378 },0x0)           = 0 (0x0)
> recvfrom(3,0x7fffffffe060,512,0x0,0x7fffffffe000,0x7fffffffe01c) ERR#35
> 'Resource temporarily unavailable'
> stat("/usr/share/nls/C/libc.cat",0x7fffffffded0) ERR#2 'No such file or
> directory'
> stat("/usr/share/nls/libc/C",0x7fffffffded0)     ERR#2 'No such file or
> directory'
> stat("/usr/local/share/nls/C/libc.cat",0x7fffffffded0) ERR#2 'No such
> file or directory'
> stat("/usr/local/share/nls/libc/C",0x7fffffffded0) ERR#2 'No such file
> or directory'
> SIGNAL 10 (SIGBUS)

No, ja sice truss neznam, ale tyhle informace jsou dost univerzalni. pro 
ucely tveho dotazu ale nejsou napovedou dostatecnou. Vime, ze kod volal 
gettimeofday (a to dopadlo uspesne), pak zkousel prijmout 512B sitovych 
dat z deskriptoru 3 bez flagu, coz skoncilo EAGAIN. Nasledne kod shanel, 
z nazvu souboru soude, po message catalogu, coz je pravdepdobne soucast 
funkce catopen(). Ta se vola v ramci strerror(), jejiz volani po 
recvfrom, ktere skoncilo chybou neni neocekavatelne.

Potud to vypada jako nadejna cesta.

Zda se tedy byt pravdepodobne, ze chyba je bud' uvnitr libc v ramci 
funkce strerror, nebo v aplikace zhavaruje na tom co ji strerror vratil. 
Ale porad je to hypoteza, ktera nemusi byt spravna.

Cimz se dostavame k tomu, ze truss na tohle neni nejstastnejsi, jakkoli 
pro zakladni orientaci poslouzil celkem dobre (stejne dobre me ale mozna 
zavedl na uplne slepou cestu).

Z truss se nepozna ci dany kod je - sekvence kodu, kterou shora 
naznacuju tak muze byt v libc, primo v aplikaci, v nejake jine knihovne, 
kterou aplikace pouziva (treba adns).

Potrebujes aplikaci prelozenou s debugovacima informacema (preklad i 
linkovani s -g a zadne optimalizace, tedy -O0) - a nasledne se pak 
proste podivas na coredump, ktery to pri padu vytvori, ktery ti ukaze na 
kterem radku jakeho zdrojaku kod byl, kdyz to zbuchlo. Hned uvodis, 
jestli uvnitr libc nebo nekde v aplikaci.

> Jde zkompilovat ten port s nejakyma debug options_

Muzes zkusit kompilovat s WITH_DEBUG, k tomu pripadne nastavit 
DEBUG_FLAGS=-g

Muze se ale stat, ze to u konkretniho portu neudela to co cekas. Pak by 
bylo nutne si kod prelozit sam - tedy nezavisle na portovem systemu.

Rec samozrejme neni o samotnem dns-terror, ale o kodu kazde knihovny, 
kterou tento pouziva. I kdyz neni nutne hned prekladat jako debugovaci 
vsechno. Muzes zacit hlavnim portem a kdyz z coredumpu vyplyne, ze k 
padu doslo uvnitr kodu nejake knihovny, tak prelozis jeste tu a opakujes.

Dan



More information about the Users-l mailing list