Postfix Security Advisory

Wietse Venema

IBM

02. September 2008


Table of Contents

Zusammenfassung
Diskussion
Workaround
Lösung
Patch

Zusammenfassung

Postfix 2.4 und neuere Versionen sind auf Linux Kernel Versionen 2.6.x anfällig für einen DoS Angriff durch einen lokalen Benutzer. Es gibt dabei keine Preisgabe von Daten oder eine Gefährdung der Datenintegrität. Das Problem wurde vom Postfix Autor während der routinemäßigen Pflege des Quellcodes gefunden.

Diskussion

Postfix ist ein OpenSource MTA, der auf verschiedenen Unix-basierten Systemen läuft. Postfix 2.4 (veröffentlicht in 2007) führte performanteres I/O Event Handling auf Basis verschiedener Routinen ein:

  • BSD kqueue (auch in MacOS X vorhanden)

  • Linux epoll und

  • Solaris /dev/poll

Diese implementieren ein besser skalierbares Event Handling als die alten select() und poll() Routinen.

Auf 2.6.x Linux Kerneln haben Postfix 2.4 und neuere Versionen ein epoll Dateideskriptor-Leck, wenn nicht-Postfix Befehle z.B. über die $HOME/.forward Datei eines Benutzers ausgeführt werden. Ein lokaler Benutzer kann auf den epoll Dateideskriptor zugreifen und einen Denial of Service-Angriff gegen Postfix ausführen. Der Angriff kann zu verminderter Performance oder gar zur automatischen Beendigung von Postfix führen, wenn ein interner Sicherheitsmechanismus ausgelöst wird. Einige mögliche Angriffe werden im letzten Absatz dieses Abschnitts beleuchtet.

Bei der Verwendung von kqueue oder Solaris /dev/poll ist Postfix nicht betroffen. Dort widerruft der Kernel den Zugriff auf das unterliegende Kernelobjekt, wenn ein Kindprozess mittels fork() erzeugt wird, wobei normalerweise nur der ursprüngliche Prozess auf das Kernelobjekt zugreifen darf.

Die zuvor genannten Ansätze könnten die Konsistenz der input/output event notification unter Linux verbessern. Aktuell

  1. können verschiedene Linux Prozesse unterschiedliche Updates auf einer gemeinsamen epoll Instanz machen

  2. könnte daher der Kernel input/output Ereignisse an Prozesse melden, die nicht nach diesen Ereignissen gefragt haben und

  3. könnten diese Ereignisse Aktivitäten auf Pipes, Sockets usw. einschließen, die nicht für diese Prozesse offen sind.

Diese Inkonsistenzen könnten vermieden werden, wenn eine epoll Instanz nur durch den Prozess, der sie erzeugt, zugreifbar ist.

Workaround

Erlauben Sie nur vertrauenswürdigen Benutzern die Mailzustellung an externe Programme. Im folgenden Beispiel ist das Verzeichnis /var/forward nicht durch Benutzer schreibbar und Postfix ist konfiguriert nach /var/forward/username (plus optionaler Adresserweiterung) anstelle des Standardpfades ~username/.forward (plus optionaler Adresserweiterung) zu suchen.

/etc/postfix/main.cf:

forward_path = 
   /var/forward/${user}${recipient_delimiter}${extension},
   /var/forward/${user}

Andere Workarounds sind für andere Filter nötig, die Befehle aus benutzerschreibbaren Konfigurationsdateien ausführen.

Lösung

Applizieren Sie den Quellcode-Patch aus dem nächsten Abschnitt oder installieren Sie eine aktualisierte Postfix Version. Postfix Versionen 2.4.9, 2.5.5 und 2.6-20080902 sind auf der Postfix Homepage verfügbar. Distributoren werden aktualisierte Versionen gem. ihrer eigenen Supportpolicies bereitstellen.

Patch

*** src/util/events.c.orig      Mon Mar 24 13:19:23 2008
--- src/util/events.c   Tue Aug 26 17:43:41 2008
***************
*** 426,431 ****
--- 427,433 ----

  #define EVENT_REG_INIT_HANDLE(er, n) do { \
        er = event_epollfd = epoll_create(n); \
+       if (event_epollfd >= 0) close_on_exec(event_epollfd, CLOSE_ON_EXEC); \
      } while (0)
  #define EVENT_REG_INIT_TEXT   "epoll_create"