Wstp: co kilka miesicy CERT ogasza nastpn dziur w sendmailu---
---co co pozwala przej kontrol nad systemem uytkownikom lokalnym, a
nawet zdalnym. Jestem pewien, e istnieje wicej pluskw czekajcych na
odkrycie; budowa sendmaila czyni kad pluskw w kodzie, majcym 46000 linijek,
dziur w bezpieczestwie. Inne popularne programy, jak np. smail, a nawet
zarzdcy list dyskusyjnych, np. Majordomo, nie s lepsze.

Dodano w 1998: Napisaem powysz cz w grudniu 1995, ostatni wersj
sendmaila bya 8.6.12 ( 41000 linii ). Midzy 8.6.12 a 8.8.5 odkryto
14 dziur w bezpieczestwie. Zobacz http://pobox.com/~djb/docs/maildisasters/sendmail.html.

Rozpoczem prac nad qmailem poniewa miaem dosy tego cyklu zniszczenia.
Oto kilka spord rzeczy, ktre uczyniem aby qmail nigdy nie wpuci
wamywacza.

1. Programy i pliki nie s adresami. Nie traktuj ich jak adresy.

sendmail traktuje programy i pliki jako adresy. Oczywicie niektrzy nie
mog uruchomia pewnych programw, lub zmienia pewnych plikw, dlatego
sendmial stara si sprawowa kontrol czy uytkownik odpowiada za dany adres.
Dowiedziono, e jest to wielka pomyka.

W qmailu, programy i pliki nie s adresami, lokalny spedytor moe
uruchamia programy, oraz zmienia pliki zgodnie z poleceniami zawartymi w
~uytkownik/.qmail, jednak czyni to z prawami danego uytkownika.
( pojcie uytkownika jest konfigurowalne, jednak nigdy nie moe nim by root.
Aby zapobiec pomykom qmail-local sprawdza czy aby przypadkiem ~uytkownik, lub
~uytkownik/.qmail nie jest zapisywalny przez wszystkich, lub grup )

Bezpieczestwo: .qmail dziaa na zasadzie, e jeeli kto moe zapisa
do pliku jako dany uytkownik, moe rwnie jako ten uytkownik
uruchomi odpowiednie programy. Nic wicej.


2. Rb najmniej jak moesz w programach setuid.

Program setuid dziaa w bardzo niebezpiecznym rodowisku: uytkownik
jest pod kontrol wielu rnych czynnikw. Do tego czynniki te zmieniaj
si wraz z systemem, czy dystrybucj, bardzo trudno stworzy program, ktry
potrafi to wszystko przywrci.

Z 20 ostatnich dziur w sendmailu, 11 dziaao tylko dlatego, e sendmail
jest programem dziaajcym w caoci z setuid.

W qmailu tylko jeden program dziaa z takim bitem - qmail-queue. Jego jedynym
dziaaniem jest dodawanie nowych wiadomoci do wychodzcej kolejki,


3. Rb najmniej jak moesz jako root.

Cay system sendmail dziaa jako root, nie ma moliwoci aby pomyki zostay
wychwycone przez wbudowane w system zabezpieczenia. Porwnujc, tylko dwa
programy, w pakiecie qmail, dziaaj jako root: qmail-start i qmail-lspawn.


4. Przenie oddzielne funkcje do oddzielnych, nieufajcych sobie programw.

Pi programw qmaila: qmail-smtpd, qmail-send, qmail-rspawn,
qmail-remote, tcp-env nie s krytyczne dla bezpieczestwa. Nawet jeeliby
wamywacz przej pen kontrol nad kontami: qmaild, qmails, qmailr, oraz
kolejk poczty nie moe przej kontroli nad systemem. aden z tych programw
nie ufa wynikom pozostaych.

Prawd mwic, programy te wogle sobie nie ufaj. S podzielone na trzy
grupy: tcp-env i qmail-smtpd dziaaj jako qmaild; qmail-rspawn i
qmail-remote pracuj jako qmailr; qmail-send, zarzdca kolejki,
dziaa jako qmails. Kada z tych grup jest nieczua na ataki pozostaych.

(Z punktu widzenia roota, dopki on sam nie wysya poczty, tylko qmail-start i
qmail-lspawn s krytyczne dla bezpieczestwa. Przy czym nie uruchamiaj
one adnych programw, ani nie zapisuj do adnych plikw.)


5. Nie przetwarzaj.

Odkryem, e w wiecie komputerw istniej dwa interfersjy: dobry i
uytkownika.

Podstaw interfejsu uytkownika jest przetwarzanie - konwertowanie
niezrestrukturyzowanej sekwencji polece, czsto, w formacie pokierowanym
psychologi, a nie inyneri, do postaci struktury danych.

Kiedy inny programista chce komunikowa si poprzez ten interfejs, musi
stworzy narzdzie przetwarzajce jego struktur, na niezrestrukturyzowan
seri polece, wierzc w duchu, e zostanie ona pniej przetworzona po jego
myli.

Sytuacja taka to przepis na katastrof. Parser ma czsto wiele bdw,
moe mie ograniczenia, niepoprawnie przetwarza poprawne wejcie, itp.
Dane podawane mog by rwnie wytwarzane w sposb niepoprawny, program
odpowiedzialny za to moe posiada bdy. Rzadko si zdarza
aby obie czci gadko wsppracoway.

Kiedy oryginalne dane s pod kontrol zoliwego uytkownika wiele z tych
bdw zamienia si w dziury bezpieczestwa. Kilka przykadw:
bd -froot w login; klasyczna dziura find | xargs rm; dziura w procesie
wstrzeliwania, w Majordomo. Nawet prosty parser getopt jest na tyle
skomplikowany, e mona si w nim zgubi.

W qmailu wszystkie struktury danych s niewiarygodnie proste: linie text0
zawierajce pojedycze polecenia. (format text0 oznacza, i linie s
rozdzielane bajtem zerowy zamiast znaku nowej linii). Same programy
w trakcie dziaania nie pobieraj adnych opcji.

Caa zoono przetwarzania list adresw RFC 822 i przepisywania
nagwkw zawarta jest w programie qmail-inject, ktry uruchamiany jest
bez adnych przywilejw, do tego jest on uywany przez UA.

6. Niech to bdzie proste, gupie.

Zobacz BLURB aby dowiedzie si dlaczego qmail jest mniejszy od sendmaila.
Nie ma nic trudnego w pisaniu programu pocztowego (za wyjtkiem obsugi
RFC 822, ale to znajduje si tylko w qmail-inject). Dziury w bezpieczestwie
nie zostan ujawnione przez cechy ktre nie istniej.


7. Twrz narzdzia bezbdne.

Prawie sobie odpuciem korzystanie ze standardowej biblioteki C.
Wiele z rzeczy zawartych w niej, zwaszcza stdio, wydaje si by stworzonym
specjalnie aby powstaway bdy. Dua cz qmaila jest zaczerpnita z
podstawowej biblioteki C, ktr tworz od kilku lat na potrzeby moich
programw. Budowa stralloc, getln powoduj, e unika si takich sytuacji jak
przepenienie bufora, brak pamici, oraz sztucznych limitw dugoci linii.
