sendmail

Michal Zalewski lcamtuf w ids.pl
Śro, 4 Lis 1998, 15:45:54 CET


On Wed, 4 Nov 1998, Pawel Krawczyk wrote:

> Jesli jeszcze tego nie zrobiliscie, to zapatchujcie sendmaila. Okolice
> linijki 316 w daemon.c powinny wygladac nastepujaco:
> 
>            t = accept(DaemonSocket,
>                 (struct sockaddr *)&RealHostAddr, &lotherend);
>             if (t >= 0 || (errno != EINTR && errno != ENETUNREACH &&
>                             errno != EHOSTUNREACH))
>                 break;

Sorry ze wtykam lapki gdzie nie trzeba, ale albo mi sie zdaje, albo
brakuje tu clou programu, czyli nieszczesnego ECONNRESET, bez ktorego
niewielki ma to wszystkko sens. 

Aha, tak na marginesie - radze wam goraco prezyjrzec sie pakietowi
sysklogd - nie wiem, jaki trafil do PLD, ale ten dostarczany ze Slackiem
czy RedHatem ma bardzo przykra wlasciwosc, a mianowicie overflowa w
momencie, gdy dane z 4-kb ringa w kernelu (przez czytanie /proc/kmem o ile
pamietam) sa wczytywane do rowniez 4-kb bufora, a nastepnie... rozbijane
na linie, przy czym bufor pojedynczej linii ma 1024 bajty i w zadnym
momencie nie zachodzi kontrola... W efekcie w (czysto hipotetycznej)
mozliwosci, gdy ktos zmusi kernela do zapisania odpowiednio dlugiej
linijki (a printk'ow w kernelu, zwlaszcza w 2.1.xxx, zawierajacych %s i
odwolujacych sie do przeroznych obiektow jest baardzo duzo, poza tym
ciezko przewidziec, jak beda sie zachowywaly i jak logowaly moduly
instalowane pozniej) - erm, wracajac do kwestii skutkow - klogd malowniczo
wysypuje sie. Przy okolo 2 kb stwierdza (zgodnie z prawda), ze deskryptor
pliku (odpowiadajacy za /proc/kmem) jest nieprawidlowy (bo sie ze tak
powiem przepisal ;-), przy czym system zwalnia makabrycznie, a mesg w
przeciagu minuty zostaje powtorzony np. 100000 razy ;>


Co zmienic? w klog.c (a moze klogd.c? nie pamietam) jest #define
BUF_COSTAM 4096 a zaraz pod tym #define COSTAM_LINE_COSTAM 1024.
Ustawienie obu na 4096 powinno wystarczyc. Quick test czy klogd jest
podatny:

--
#define MODULE
#define __KERNEL__

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/malloc.h>
#include <asm/unistd.h>
#include <linux/version.h>
#include <asm/string.h>

int init_module(void) {
  printk("Tu_wpisz_okolo_2kb_smieci_typu_aaaaaa\n");
  return 0;
}

void cleanup_module(void) {}
--

Wpisanie odpowiedniej ilosci smiecia w zaznaczonym miejscu (nie chce
was katowac wysylaniem tego, wiec 'zrob-to-sam' ;-), wstukanie 'gcc test.c
-c -O3;insmod test;rmmod test' i rzut okiem do logow powinien wystarczyc.

PS. Obiecuje juz wiecej was nie spamowac ;>

_______________________________________________________________________
Michal Zalewski [lcamtuf w ids.pl] [ENSI / marchew] [dione.ids.pl SYSADM]
[http://linux.lepszy.od.kobiety.pl/~lcamtuf/] <=--=> bash$ :(){ :|:&};:
[voice phone: +48 (0) 22 813 25 86] ? [pager (MetroBip): 0 642 222 813]
Iterowac jest rzecza ludzka, wykonywac rekursywnie - boska [P. Deutsch]




Więcej informacji o liście dyskusyjnej pld-devel-pl