Ukousnute dva znaky z auth logu (vsftpd) - VYRESENO

Vlada Macek tuttle na bbs.fsik.cvut.cz
Pátek Červenec 29 12:23:00 CEST 2005


[At 29.07.2005 09:46, Pavel Kankovsky kindly sent the following quotation.]

> On Thu, 28 Jul 2005, Vlada Macek wrote:
>
>> V glibc existuje mj. moc pekna promenna char *__progname, kterou
>> pouziva tamni volani syslog() a ktera je tamtez nastavovana takto:
>
> [...]
>
>> Vytahl jsem si z vsftpd cast kodu, ktera meni nazev procesu a dodal
>> zmenu promenne __progname:
>>
>> extern char *__progname; __progname = argv[0];
>>
>> Bohuzel do logu se zapisuje porad ukousnuto. Je evidentni, ze na
>> promennou __progname z glibc timto nedosahnu. [...]
>
>
> Problem neni v tom, ze tu promennou nezmenite. Vy ji zmenite. Ale
> kdyz se podivate do sysdeps/generic/syslog.c,

Aspon pro glibc-2.3.2, kterou zkoumam, je do misc/syslog.c, ale to
zrejme nehraje roli.


> tak uvidite, ze si tu adresu schovava jeste do privatni promenne
> LogTag, na kterou uz nedosahnete.

Az diky tomuhle me to trklo, dekuju. :-) V testovacim programu jsem mel
na zacatku syslog(..."TEST MSG");, abych vedel, co se logne na zacatku.
Jenze to nebylo moudre, protoze tohle volani zjisti, ze ma LogTag
prazdnou a naplni ji __progname, ktera je stale spatne posunuta.

Resenim je nastavit __progname = argv[0] co NEJDRIV v programu, treba
hned na zacatku main(). Tim zajistime, aby si prvni volani syslog() do
promenne LogTag zapsalo zacatek titulku a ne argv[0]+?.

Hodil jsem __progname do vsftpd a chyba je opravena.

Alternativni moznosti, jak primo nastavit LogTag, je volat openlog(ident
!= NULL, ...). __progname neni v ramci glibc krome syslog() pouzivana
prilis casto, nicmene i tak bych ji asi nastavil taky.

Zamotal jsem se do toho tak, ze jsem nevidel tu nejjednodussi cestu. :-]

Pri te prilezitosti jsem vycetl jednu zajimavost, ktera treba bude k
necemu i vam: Logging facility neni nutne nastavovat vyhradne vcelku
drahym volanim openlog(), staci ji bitove pricist k priorite v
jednotlivych volanich syslog(). Tato hlaska se pak logne tam kam chcete
prekryje bud vychozi facility LOG_USER nebo co si dosud nastavila
aplikace. Dela to tak i pam_unix, aby najisto logoval pres LOG_AUTH,
zatimco aplikace jinam.


> Jedno takove ne moc koncepcni ale asi ucinne reseni by spocivalo v
> tom, ze budete vsftpd volat tak, aby bylo argv[0] primo "vsftpd" a
> tedy se pri setproctitle() nezmenilo (alternativne by bylo mozno
> upravit setproctitle() tak, aby zachovaval obsah argv[0]).

To podle me nejde, protoze prave misto, kam ukazovalo argv[0] pri startu
programu, je v Linuxu treba zmenit, aby se tento nazev ukazoval ve
vystupu`ps'. Anebo si nerozumime. :-)

-- 

\//\/\
(Sometimes credited as 1494 F8DD 6379 4CD7 E7E3 1FC9 D750 4243 1F05 9424.)



Další informace o konferenci Linux