Pamitaj, e plik ten nie nazywa si "Poczta internetowa dla gupkw".
Zawiera kilka rnorakich pomysw. Nie wyjania ich. Text podzielony jest na
sekcje.

W dokumencie tym sowo "sendmail" oznacza program rozprowadzany w pakiecie o 
teje nazwie; "klon-sendmaila" to program rozprowadzany z tym pakietem.


1. Bezpieczestwo

Istnieje wiele ciekawych zdalnych atakw denial-of-service (DoS) dla
systemw pocztowych. Rozwizaniem dugoterminowym byoby danie
zapaty za nieutoryzowane wykorzystanie zasobw. Technicznym problemem jest
uczynienie mechanizmu zapaty taszym ni koszta ataku. (dla lokalnych
atakw DoS atwo znale winnego uytkownika)

Log qmail-send zosta zaprojektowany z myl o prdkoci. Z czasem dodaem
moliwo ledzenia. Jednake, nie mona cakowicie zweryfikowa nadawcy 
lokalnej wiadomoci; skd mona wiedzie, e odbiorca mwi prawd
o zawartoci wiadomoci? Dziki QUEUE_EXTRA mona zapisywa
jednokierunkowe hashe dla kadej wiadomoci, jednak uytkownik, ktry
chce wysa 'z' wiadomo moe cakowicie obej qmaila.

Na pocztku zdecydowaem, e qmail nie bdzie wysya zaprosze, tak aby
niemoliwoci byo okrelenie wersji. Jednak problem ten znikn po
utworzeniu URL dla qmaila.

Podczas gdy qmail stawa si popularniejszym, mylaem, e dostpno
rcpthosts umoliwi tworzy nieautoryzowane MX-y.
(jak dotd nie widziaem adnego, mog sobie wyobrazi, e byoby to
denerwujce). Zauwa, e rcpthosts nie koliduj z listami dyskusyjnymi.

qmail-start nie odcza si od tty. Na niektrych starych maszynach
oznacza to, e niektrzy mog wysya demonom qmaila sygnay tty.
Jest to luka bezpieczestwa w systemie kontroli zadaniami, nie w qmailu.

Biblioteka resolv nie jest zbyt spasiona ( do wersji 4.9.4 ), jednak
uywa biblioteki stdio, ktra jest. Czytanie /etc/resolv.conf przez kady z
procesw qmail-remote zajmuje wiele pamici. Kuszce jest stworzenie
mniejszej biblioteki rozprowadzanej z qmailem. (Bonus: mona obej kopoty
z rnymi implementacjami). Problemem jest, e byaby to biblioteka
z zaoenia niebezpieczna. Nie mgbym zwala winy na autorw BINDa o to,
e mona wykra poczt korzystajc z DNS-a. Rozwizanie: wymuszenie
uywania lokalnego tumacza nazw, jdro gwarantuje bezpieczestwo 
nisko pooonych portw UDP na 127.0.0.1.

NFS jest gwn dziur w bezpieczestwie UNIXa. Troch wyjanie. Sun wiedzia
od pocztku, e NFS jest dziurawy. Chciano to ukry przez uniemoliwienie,
rootowi, korzystania z niego. Jednak wamywano si przez uytkownika bin
( z tego konta atakowano roota ). Wielu ludzi zadecydowao, i naley 
poprawi bdy Suna i zbudowa cian midzy rootem, a innymi uytkownikami.
Jeeli wszystkie pliki systemowe s roota i nie ma dziur oprcz NFS, to
wamywacz, ktry przej kontrol nad uytkownikami moe usun tylko ich
pliki - system nadal bdzie istnie. Ta bezmylna polityka oznacza, e, dla 
przykadu, wszyscy uytkownicy qmaila musz by zastpieni rootem.
Komentarze: problemem jest zakodowany sposb bezpiecznego porozumiewania si
midzy hostami, istnieje problem mapowania id uytkownikw zdalnych i lokalnych.
Jeeli host jest pod twoj kontrol nie powiniene mapowa niczego.
Jeeli host jest kontrolowany przez kogo innego chiaby mapowa zdalne uid
na lokalne; spraw klienta jest wybr uytkownikw. Sun oryginalnie
mapowa roota na uytkownika nobody, innych zostawia w spokoju - z tego co
wiem zawsze powstaway nieprawidowoci.


2. Lokalne wstrzeliwanie poczty (qmail-inject, sendmail-clone)

RFC 822 sekacja 3.4.9 zabrania efektw wizualnych w nagwkach, 
draft 822bis zabrania jeszcze wicej. qmail-inject mgby przestrzega te
absurdalne restrukcje, ale czy nie byoby to strat czasu? Jeeli cierpisz
gdy kto wysya ci "byszczc poczt" znajd sobie lepszy czytnik.

qmail-inject wstawia "Cc: recipient list not shown: ;" zatrzymujc sendmaila
od wstawiania pola Apparently-To. Niestety, stare wersje sendmaila wstawiaj
nazw hosta. Dotyczy to wersji ponieej 8.7. Ile to lat od pojawienia si
RFC 822?

sendmail odrzuca zduplikowane adresy. Spowodowao to, prawdopodobnie,
wicej strat i kradziey przesyek ni odnotowa Oddzia Poczty w Chicago.
Qmail dostarcza wiadomoci w sposb wskazany mu. qmail-inject nie
moe i nie chce obsugiwa czego w rodzaju domylnej opcji sendmaila - 
- nometoo. Oczywicie meneder list dyskusyjnych moe obsugiwa t opcj.

W qmail-inject powinien istnie mechanizm dziaajcy dla odbiorcw jak
Return-Path dla nadawcw. Wtedy qmail-inject -n  mgby wypisa wszystkich
odbiorcw.

Czy qmail-inject powinien obsugiwa wiadomoci bez odbiorcw? Czy powinna
istnie dodatkowa opcja? Jeeli ma zosta po staremu (akceptacja wiadomoci),
qmail-inject powinien unika uywania qmail-queue.


Moliwym jest stworzenie powtarzajcego si Message-ID.
Wystarczy zatrzyma qmail-inject zanim przejdzie do trzeciej linii main(),
poczeka a pidy zawin si, zrestartowa qmail-inject, przesa wiadomo.
Po czym uruchomi z tym samym pid i w tej samej sekundzie innego qmail-inject.
Nie wiem jak to omin bez uywania liczb dostarczonych przez system.
(oczywicie uytkownik moe rwnie poda swoje wasne, nieunikalne pole
Message-ID.)


Podrcznik sendmaila mwi: "Czyny majce ukry hosty w domenie powinny by
wykonywane tylko dla adresu nadawcy". Maskarada odbiorcw dziaa dobrze z
qmailem. adna z uomnoci sendmaila nie zachodzi, dziki prostocie budowy
qmaila.

Przewidziaem, e bd naciskany aby wynagrodzi pewne bdy twrcw
programw pocztowych, ktrzy nie rozumiej tematu wiarygodnoci.
(Np. "To mwisz, e powinienem sprawdza kod zwrcony przez sendmaila?")


3. Odbieranie wiadomoci z sieci (tcp-env, qmail-smtpd)

qmail-smtpd nie zezwala na polecenia ingerujce w prywatno uytkownika, 
np. VRFY, EXPN. Jeeli chcesz publikowa takie dane zrb to w taki sposb
aby uytkownicy wiedzieli o tym, np. fingerd, lub httpd.

RFC 1123 mwi, e VRFY i EXPN s wane przy zapobieganiu ptlom midzy hostami.
Dziki polu Delivered-To ptle nie robi krzywdy, do tego jeden z 
administratorw dostaje odbit wiadomo, ktra dokadnie opisuje sposb 
powstania ptli. Rozwizuje to problem, nie symptomy.

Czy dns.c powinien specjalnie traktowa 127.0.0.1/localhost?

badmailfrom (np. 8BITMIME) jest marnotrawstwem kodu.

Teoretycznie MAIL, lub RCPT mog zawiera niezacytowane znaki LF. W praktyce
istnieje wiele klientw koczcych lini samym LF, te same programy
potrafi poprawnie terminowa linie wewntrz DATA.


4. Wstrzeliwanie wiadomoci do kolejki (qmail-queue)

Czy qmail-queue powinien upewnia si, na zapas, czy na dysku jest 
wystarczajca ilo miejsca? Kiedy qmail-queue jest wywoywany przez 
qmail-local, lub przez qmail-smtpd, itd. mgby otrzymywa informacje
o iloci wolnego miejsca. Chciabym aby UNIX posiada funkcj atomowo
allokujc obszar na dysku.

Interfejs qmail.h (odzwierciedlajcy interfejs qmail-queue, ktry odzwierciedla
struktur kolejki) nie jest zdolny do obsugiwania adresw zawierajcych
bajt 0. Nie wyobraam sobie aby to byo problemem.

Czy qmail-queue powinien zapobiega zakolejkowaniu wiadomoci bez
odbiorcw?


5. Obsuga zakolejkowanej poczty (qmail-send, qmail-clean)

Katalog queue musi by lokalny. Mountowanie go przez NFS jest niebezpieczne -
- nie przeszkadza to ludziom uruchamia sendmaila w taki sposb!

Bezdyskowe hosty powinny uywa mini-qmaila.

Wiarygodno kolejki opiera si na zaufaniu, i zapis jednego bajtu jest
atomowy. Jest to prawd dla systemw plikw ze staym rozmiarem blokw -
- UFS, oraz systemw z kartotek (logging filesystems), np. LFS.

qmail-send uywa 8 bitw dla kadej wiadomoci. Podwj to przy reallokacji.
(Rozwizanie: uywaj maego lasu kopcw; trzymaj kilka kolejek z prioretytami.)
Podwj przy wadliwych implementacjach malloc(). (Rozwizanie: pamitaj o
rozmiarach kopcw.) 32 bajty s dokuczliwe, lecz nie s niszczycielskie -
- na mojej maszynie (duy dysk, mao pamici) szybciej zabraknie mi i-wzw,
ni pamici.

Niektre systemy pocztowe oranizuj kolejk ze wzgldu na hosta. Jest to
bezsensowne, do tego dzieli to struktur kolejki. Prawdziw spraw jest: co
zrobi gdy komputer si podniesie (jest w zasigu). Dla lokalnych
pocze SLIP/PPP z gry wiadomo, ktre hosty wymagaj innego traktowania,
mona jest obsuy za pomoc virtualdomains i serialmaila.

Dla starej struktury kolejki zaimplementowaem kompresj list odbiorcw:
jeeli poczta wysyana jest przez olbrzymi list dyskusyjn i wikszo
z odbiorcw jest dostarczana tworzy now, skompresowan list todo. Jednak
nie opaca si tego robi: oszczdza to ma cz czasu CPU.

qmail-send nie zna precedensu, priorytetu, sprawiedliwoci, czy wanoci
przy rozprowadzaniu poczty. Obsuguje wiadomoci w kolejnoci pierwsza-
-zobaczona-podana. Kto mgby zrobi wiele aby to zaimplementowa, jednak
byaby to strata czasu: dziki mechanizmowi 'spustu' i zwlekania adko
zdarza si aby kolejka zawieraa wicej ni jedn wiadomo.

Wyjtek: nawet z du liczb jednoczesnych dostarcze qmail-send
moe spdzi kilka minut rozsyajc poczt dla duej listy dyskusyjnej.
Uytkownik w midzyczasie moe wysya wiadomoci. Najprostrzym
wyjciem byoby stworzenie osobnego kanau dla duych wiadomoci.

qmail-send nigdy nie rozpocznie pracy, ktr ju ma. Oznacza to, e
gdy prba dostarczenia trwa duej ni okres powtarzania zostanie ono
opnione. Dla starej struktury kolejki zaimplementowaem odwrotn
stategi. mark() musia rozumie sposb buforowania wejcia; kada nowa
prba dostarczenia sprawdzaa mpos w tej wiadomoci, ktra bya przetwarzana.

Rzeczy, ktre qmail-send robi synchronicznie: kolejkowanie odbitej wiadomoci;
porzdki via qmail-clean; klasyfikacja i przepisywanie wszystkich adresw do
nowej wiadomoci. Zmiana wszystkiego na dziaanie asynchroniczne wymagaaby
troch roboty, jednak prawdopodobnie przypieszyaby troch program.
(Chtnie uybym waitpid() zgodnego z POSIX, jednak NeXTSTEP 3 go nie 
obsuguje.)

Dyskowe We/Wy jest wskim gardem; UFS jest wiarygodny, jednak nie jest
szybki. Dobry system plikw z kartotek oferuje szybsze dziaanie, jednak
takie systemy plikw nie s rozpowszechnione. Rozwizanie: trzyma kartotek
poza kolejk, po padzie kolejki mona j odtworzy (w najgorszym wypadku
powstayby podwjne wiadomoci). Skompresowa kartotek. Takie rozwizanie
dramatycznie obniyoby dyskowe operacje We/Wy.

Skadowanie wiadomoci odbitych jest problematyczne. Zapisy o odbiciach nie 
s katastofoodporne; midzy odbiciem a wiadomoci moe nastpi dua
przerwa; format wiadomoci jest nazbyt skomplikowany. Kusi mnie aby
usun katalog bounce i wysya dla kadej odbitej wiadomoci wiadomo
o odbiciu (z odpowiednio zmienion treci).

imlementacja qmail-stop: setuid na UID_SEND; kill -TERM -1. Inaczej, wystartuj
qmail-start pod zewntrznym kontrolerem (takim jak supervise); dlatega
program nie dziaa w tle.

Interfejs readdir() ukrywa bdy We/Wy. Interfejs niszego poziomu
mgby nie by przenony. Naprawd nie wiem co z tym fantem zrobi.
Naturalnie powane bdy We/Wy oznaczaj utrat wiadomoci, jednak
niektre z nich monaby obej.

job_open() lub pass_dochan() mogyby zachowywa si bardziej paranoicznie -
- sprawdza czy id, kana zostay ju otwarte; poniewa messdone() jest
paranoiczny przy pluskiwe w kodzie, w najgorszym wypadku, nastpioby
tylko podwjne dostarczenie.

Troch matematyki: optymalnym schematem wysyania jest istotnie, lecz
nie dokadnie, niezalene prby dostarczenia. Jednak najbardziej znaczcy
jest koszt prby dostarczenia, oraz zminiejszanie czstotliwoci.
'Kwadratowy' schemat qmaila mwi, i godzinne opnienie przy jednodniowej
wiadomoci jest warte tyle samo co dziesiciominutowe przy wiadomoci
oczekujcej godzin; nie wydaje mi si to, a takie nierozsdne.


Zdradzajc: AOL prbuje wiadomoci co pi minut przez pierwsze trzy dni. Hmm.


6. Przesyanie wiadomoci przez sie (qmail-rspawn, qmail-remote)

Czy istniej komputery zapchane wielkimi wiadomociami do mnstwa
odbiorcw na jednej maszynie? Dla typowego programu SMTP wielu
odbiorcw na jednym komputerze to wielka poraka. Odzielne transakcje maj
mniejsze opnienie.

Suszaem trzy skargi na temat przepustowoci od masochistw wysyajcych
wiadomoci poprzez modem, przy smarthost, do tysica odbiorcw---bez
podlisty! Mona osign znacznie lepsz przepustowo za pomoc QMQP.

W odwrotn stron: kusi mnie aby usun cz @host z agumentu recip
programu qmail-remote. Lub co najmniej unika podwjnych dns-cname.

Istnieje wiele powodw, dla ktrych qmail-rspawn powinien czciej 
uczestniczy w dziaaniach qmail-remote. Powinien wywoywa zewntrzne
programy do 1) zapyta MX, 2) pocze SMTP, 3) pocze QMTP.
(Jednak nie byoby to tak wane gdyby biblioteka DNS zajmowaaby mniej
pamici.)

Odrzucam dwuznaczne MX-y. ('dwuznaczny MX' jest to najbardziej uprzywilejowany 
MX przysyajcy mi poczt dla hostw, ktre nie s lokalnymi dla mnie )
Automatyczne  traktowanie takich MX-w jako lokalne blokuje dziaanie
lokalnych spedycji po padzie sieci. Jest to pokadanie nadzei w czym co na
ni nie zasuguje. Lepsze rozwizanie: generowanie rekordw MX na podstawie
zawartoci control/locals.

Jeeli udaje mi si poczy z hostem wskazywanym jako MX, jednak on odmawia
przyjcia poczty prbuj pniej. Kilka dokumentw sugeruje sprawdzanie
dalszych MX-w. Co ich autorzy sobie myl? Moje podejcie dziaa prawidowo
z wyczonymi hostami, niedostpnymi komputerami (z powodu firewalla), oraz z 
balansowaniem obcienia; do czego, jeszcze, ludzie wykorzystuj kilka 
rekordw MX?

Aktualnie qmail-remote wysya dane w 1024 bajtowych pakietach. Moe powinien
zwraca uwag na MTU?

Moe qmail-remote powinien allokowa sta liczb czasu na DNS/connect()
obojtnie co do liczby MX-w; ide t podsun Mark Delany.

RFC 821 nie definuje sowa "text". Wedug qmail-remote "text" nie moe 
zawiera goych znakw LF.

RFC 821 i RFC 1123 zabraniaj aliasowanych nazw hostw w MAIL FROM i RCPT TO.
qmail-remote, tak jak sendmail, przepisuje aliasy w RCPT; ludzie ktrzy
nie zapisuj aliasw w control/locals lub CW sendmaila bezpodstawnie si na
tym opieraj. Gupiutkim byoby zmuszanie wewntrznego DNS-a aby tak
wpywa na dostarczanie poczty, jednak tak dziaa Internet. qmail-remote nie
troszczy si, ju, o zapytania CNAME dla nadawcy koperty.


7. Lokalne dostarczanie poczty (qmail-lspawn, qmail-local)

qmail-local nie obsuguje comsat. comsat jest bezcelowym paskudztwem.
Uywaj qbiff, jeeli chcesz mie podobny rodzaj powiadamiania.

Interfejs getpwnam() ukrywa bdy We/Wy. Wyjcie: qmail-pw2u.


8. Nowe cechy sendmaila V8

sendmail-8.8.0/doc/op/op.me zawiera list znacznych udoskonale dla
sendmaila 8.8.0 (liczc od wersji 5.67). Oto jak qmail ma si do tych
usprawnie. (oczywicie qmail posiada wasne udoskonalenia, jednak nie to
jest celem tej listy)

Cache'owanie pocze, MX piggybacking: Nie. (Profiluj. Nie spekuluj.)

Szybka odpowied na polecenie RCPT: Tak.

Adresy IP pokazywane w liniach Received: Tak.

Self domain literal (???) jest obsugiwane prawidowo: Tak.

Rne czasy wyganicia dla QUIT, RCPT, etc.: Nie, jedna warto.

Prawidowa obsuga <>, skracanie trasa-adres: Tak, nie jest to konfigurowalne.

Obsuga ESMTP: Tak. (Po stronie serwera, wczajc PIPELINING.)

8-bitowo: Tak. (Wsparcie dla 8BITMIME; to samo co sendmail z opcj 8.)

Konfigurowalna baza uytkownikw: Tak.

Obsuga BIND: Tak.

Keyed files: Tak, w fastforward.

931/1413/Ident/TAP: Tak.

Prawidowe (z RFC 822) przetwarzanie list adresw: Tak. (Zauwa, e sendmail
ma nadal pewne problemu z cytowaniem.)

Obsuga wacicieli list: Tak.

Dynamiczna allokacja nagwkw: Tak.

Minimalna liczba blokw na dysku: Tak, via tunefs -m. (Lub quota; prawidowe 
ustawienie to: may limit dla qmailq i qmails z wikszym - tak aby qmail-send
mia miejsce do pracy.)

Odznaczanie: Tak, nie jest konfigurowalne - qmail zawsze odznacza.

Konfigurowalno wiadomoci o bdach: Nie.

Dopasowywanie GECOS: Nie bezporednio, jednak atwe do dodania.

Limitowanie przeskokw: Nie. (qmail limituje je do 100, jednoczenie zawiera
automatyczn detekcj ptli, ktra jest znacznie lepsza od liczenia
przeskokw.)

Wiadomoci o bdach w MIME: Nie. (qmail powiadamia o bdach zgodnie z QSBMF, 
jest to atwiejsze do przetworzwenia.)

cieka do pliku Forward: Tak, via /etc/passwd.

Konfiguracja przychodzcych SMTP: Tak, poprzez inetd, lub tcpserver.

Opcjonalna prywatno: Tak, przy czym nie jest ona opcjonalna.

Maglowanie 'najlepszy-MX': Nie. Zajrzyj do sekcji 6.

Maglowanie do 7 bitw: Nie. qmail zawsze uywa 8 bitw.

Obsuga a do 20 rekordw MX: Tak, do tego wicej. Jedynym limitem qmaila jest
pami.

Prawidowe cytowanie nazwa-i-adres: Tak.

VRFY i EXPN teraz rne: Nie. qmail ukrywa te informacje.

Klasy wielo-znakowe, ekspansja makr, oddzielne przetwarzanie kopert/nagwkw,
oddzielne przetwarzanie kopery i nagwka dla kadego z odbiorcw, nowe
argumenty, nowe opcje konfiguracyjne, nowe makra: wszystko to specyficzne dla
sendmaila nie ma sensu w qmailu. Dla przykadu, _oczywicie_, e qmail
przetwarza oddzielnie kopert i nagwek; przecie to cakowicie rne obiekty!


9. Rne

klon-sendmaila i qsmhook s zbyt pokrcone aby je udokumentowa. (Oficjalnym
zamiennikiem qsmhook jest preline w poczeniu ze zmiennymi rodowiska
qmail-command.)

Zastanawiaem si nad atomow instalacj, jednak jest to bardzo trudne do
zrobienia, a zrobione le moe zaszkodzi.

RN sugeruje automatyczne wstawianie odpowiednich linii do /etc/passwd.
Dla mnie jest to wchodzenie w drog innym programom. Zlinczowanoby mnie
gdybym zepsu komu plik passwd. Naley to pozostawi specyficznym dla OS
skryptom instalacyjnym.

W BSD 4.2 inetd nie zezwala na nazw uytkownika. Myl, e mog o tym 
swobodnie zapomnie. (DS zauway, e nazwa uytkownika dziaa na Ultriksie,
przy czym jest nieudokumentowana.)

Powinienem dopracowa wybr bput/put.

Niektre z funkcji stralloc_0() powinny "grok" (masz lepszy sownik to
sprawd i przylij mi tumaczenie :-) stralloc.

qmail zakada, e: czas jest dodatni; pid_t, time_t, ino_t zmieszcz si
w unsigned long; gid_t zmieci si w int; zestawem znakw jest ASCII;
oraz wszystkie wskaniki zamienne. Czy mi zaley?

Podrcznik sendmaila usprawiedliwia nastpujco szalony mechanizm
dzielenia linii: mgby by uyteczny dla "40 znakowej instukcji jazdy 
wydrukowanej braillem". Tylko na to was sta?

Maskotk qmaila jest delfin.
