Ukousnute dva znaky z auth logu (vsftpd) - CASTECNE VYRESENO

Vlada Macek tuttle na bbs.fsik.cvut.cz
Čtvrtek Červenec 28 21:05:46 CEST 2005


[At 26.07.2005 21:25, Pavel Kankovsky kindly sent the following quotation.]

>On Sun, 24 Jul 2005, Vlada Macek wrote:
>  
>
>>Jul 23 08:13:01 hostname .177.102.164: connected: (pam_unix) session
>>opened for user FTPUSER by (uid=0).
>>Jul 23 08:32:34 hostname .177.102.164: connected: (pam_unix) session
>>closed for user FTPUSER
>>    
>>
>To je dost kuriozni chovani. Zejmena kdyz se ten urizly text objevuje na 
>miste, kde by asi melo byt jmeno procesu.
>
>Nesnazi se nahodou u vas vsftpd nastavit si jmeno procesu na neco ve stylu 
>vsftpd: 1.2.3.4: connected?
>  
>

Jasne, to jsem nezminil, mel jsem. Sel jsem za tim dal a zjistil, v cem
je problem. Tedy podle mych zjisteni:

vsftpd meni nazev procesu, prave na 'vsftpd: 1.2.3.4: connected', a to
znamou prasarnickou, ktera se v Linuxu dela. Tedy uklidi se kopie
prostredi a novym nazvem se prepisuje oblast pameti pocinaje argv[0],
protoze do ni si vcelku odvazne saha jadro a diky tomu to zobrazuje
prikaz ps.

V glibc existuje mj. moc pekna promenna char *__progname, kterou pouziva
tamni volani syslog() a ktera je tamtez nastavovana takto:

    void __init_misc (int argc, char **argv, char **envp)
    {
      if (argv && argv[0])
        {
          char *p = strrchr (argv[0], '/');
          if (p == NULL)
            __progname = argv[0];
          else
            __progname = p + 1;
          __progname_full = argv[0];
        }
    }


Tedy ukazuje na prvni znak argv[0] za poslednim lomitkem, pokud toto
existuje. No a mily vsftpd existenci __progname ignoruje. To, co mi v
mem predchozim prispevku chybi -- "vsftpd: 80", odpovida delkou docela
presne retezci "/usr/sbin/". Ach jo.

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. Pro zajimavost, nevite
nekdo, jak by to slo? Je normalni, ze tu promennou nemuzu prepsat? Ptam
se proto, ze na webu jsou priklady kodu, ve kterych se timto zpusobem
(jeste se strdup(), to mi taky nefunguje) obsah __progname aktualizuje.
Ale je mozne, ze to byl kod pro BSD nebo jiny OS, kde to muze byt jinak.

vsftpd je u me nastaveno tak, aby pouzivalo PAM, coz je evidentni z tech
logovych hlasek nahore. pam_open_session() pouzije syslog() na
zaprotokolovani te prvni hlasky. Nedokonalym resenim, ktere me napadlo,
je pri kazde zmene procesu znovu zavolat openlog(), jehoz prvni parametr
je funkci syslog() prednostne vzat jako identifikator a nevezme se tedy
ten zmrseny. Nedokonalym proto, ze openlog() bude zavirat a znovu
otevirat soket k syslogd. Ale to by se mohlo prezit. Napisu to autorum
vsftpd.

-- 

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




Další informace o konferenci Linux