vice domen v sendmailu

Jirka Kosina jikos na jikos.cz
Pondělí Srpen 6 15:11:22 CEST 2001


Ahoj,

> > Existuje moznost pomoci [v]syslog() a free() potom zachazet neprijemnym
> > zpusobem s heapem  (problem je, ze free() neni re-entrantni fce, ze).
> Dufam ze toto nepopisuje chybu linuxoveho kernelu, na zaklade ktorej sa
> dalo nieco podstrcit sendmailu a tak ziskat roota. Sendmail v tom bol
> nevinne.

Ne, nejde o chybu kernelu, ale o chybne napsany kod sendmalu ve funkcich
pro obsuluhu signalu. Zjednodusene je to v tech verzich o kterych jsem
mluvil nejak takto (zjednodusene, jde o ideu):

void sighndlr(int dummy) {
  syslog(LOG_NOTICE,user_dependent_data);
  // ...
  free(global_ptr2);
  free(global_ptr1);
  // A: dalsi cisteni
  exit(0);
}

a nekde v main()u pak je neco jako:

  signal(SIGHUP,sighndlr);
  signal(SIGTERM,sighndlr);

  global_ptr1=malloc(nnn);
  global_ptr2=malloc(yyy);

  // B: dalsi chod programu

A kdyz se ted posle jeden signal, ktery obsluhuje funkce sighndlr() (nekde
v casti B), skoci se do funkce na obsluhu signalu. Kdyz se v zapeti rychle
posle SIGTERM (pak se SIGHUP zamaskuje a bude se dorucovat SIGTERM), cimz
se znovu vleze do sighndlr(). Pak je mozne za urcitych podminek zneuzit
dvojnasobneho zavolani free() prave za pomoci syslog(). Nebudu se tady
poustet do podrobnosti, pro pochopeni principu je dulezite pochopit, jak
syslog() funguje.

Reseni je nekolik: napriklad pouzivat nejake semafory kolem nereentrantich
funkci libc, blokovani dorucovani signalu uvnitr vykonavani signalovych
fci, etc. Ale to uz je asi mimo rozsah teto konference. ;)

-- 
JiKos.




Další informace o konferenci Sendmail