Ukousnute dva znaky z auth logu (vsftpd) - VYRESENO

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Červenec 30 12:14:30 CEST 2005


On Fri, 29 Jul 2005, Vlada Macek wrote:

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

V nejnovejsich verzich je to uz v sysdeps kvuli nejakemu obskurnimu 
flagu, ktery se muze na ruznych platformach lisit.

> 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]+?.

To asi ano. Tedy pokud nejaka dynamicka knihovna nezavola syslog()  
iniciativne ve svem konstruktoru jeste driv, nez se spusti main().

> Alternativni moznosti, jak primo nastavit LogTag, je volat
> openlog(ident != NULL, ...).

To je asi nejspolehlivejsi metoda.

> > Jedno takove ne moc koncepcni ale asi ucinne reseni by spocivalo v
> > tom, ze budete vsftpd volat tak, aby bylo argv[0] primo "vsftpd" [...]
>
> 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. :-)

Ano a ne. Kdyz se program spusti, tak dostane od jadra nekde na 
vrcholu zasobniku nasledujici souvisly blok znaku

  "argv[0]\0argv[1]\0...argv[argc-1]\0envp[0]\0envp[1]\0...envp[N]\0"

a k tomu pod nim samozrejme blok ukazatelu, ktery na jednotlive polozky
ukazuje. Presneji dva bloky (argv[] a envp[]). Nebo jeste presneji jeden
blok, ktery ma jeden NULL na hranici argv[] a envp[] (jeho index je argc)
a druhy na samem konci.

Zaroven si nekde u sebe drzi ukazatele arg_start, arg_end, env_start
a env_end, ktere ukazuji na tuhle oblast. Kdyz se ps zepta na 
/proc/PID/cmdline, tak mu jadro posle obsah pameti ciloveho procesu mezi 
arg_start a arg_end (plus nekdy az do env_end, ale to ted neni dulezite).

setproctitle() udela proste to, ze vyse popsany blok znaku prepise zadanym 
textem. Kdyz bylo na miste argv[0] napsano "vsftpd", __progname ukazovalo 
stejne jako argv[0] a setproctitle() bylo zavolano se stringem, ktery 
zacinal "vsftpd", tak bude __progname stale ukazovat na "vsftpd".

Ale ma to jednu chybicku, kterou jsem si neuvedomil: setproctitle() 
samozrejme temer jiste prepise '\0', ktera puvodni argv[0] = __progname 
ukoncovala, takze by se priste jako tag do syslogu posilal cely text 
nastaveny pres setproctitle().

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux