DĂ€mme gegen die SYN-Flut
Viele Trojanische Pferde bieten Funktionen fĂŒr SYN-Flood-Angriffe. Die damit infizierten Rechner lassen sich fĂŒr Angriffe gegen beliebige Server einsetzen. Wer sich nicht kalt erwischen lassen will, sollte Vorkehrungen treffen, bevor er das Ziel wird.
Denial-of-Service-Angriffe auf Server zielen darauf ab, legitimen Nutzern den Zugriff auf einen Dienst zu verwehren. Im einfachsten Fall ĂŒberflutet der Angreifer den Server mit sinnlosen Paketen, um seine Leitung zu ĂŒberlasten. Ein typisches Beispiel dafĂŒr ist ICMP-Flooding. Doch zum einen erfordert das eine groĂe Bandbreite, zum anderen lassen sich die Pakete vergleichsweise einfach schon auf vorgelagerten Systemen ausfiltern. Alternativ kann er versuchen, beispielsweise einen Web-Server so mit Anfragen zuzuschĂŒtten, dass normale Anwender nicht mehr zum Zug kommen. Doch auch dafĂŒr ist eine groĂe Bandbreite erforderlich und ist die IP-Adresse des Angreifers einmal ermittelt, ist er auch schnell ausgesperrt.
Deshalb verlegen sich immer mehr Angreifer auf sogenannte Syn-Flood-Attacken, die nicht darauf abzielen, die Bandbreite auszulasten, sondern die Systemressourcen des Servers selbst blockieren. Dazu verschicken sie sogenannte SYN-Pakete an den TCP-Port des Dienstes, bei einem Web-Server also auf Port 80. Der Server registriert den Synchronisierungswunsch des Clients, legt einen Eintrag in seinen Tabellen dafĂŒr an und bestĂ€tigt die Anfrage mit einem eigenen Synchronisierungspaket (SYN/ACK). Bei einem normalen Verbindungsaufbau bestĂ€tigt der Client dieses ebenfalls mit einem ACK-Paket und komplettiert damit den sogenannten Drei-Weg-Handshake einer TCP-Verbindung.
Nicht so der SYN-Flood-Angreifer. Er lÀsst den Server mit seiner halboffenen Verbindung einfach hÀngen. Der wartet eine Zeitlang und wiederholt sein SYN/ACK-Paket, in der Annahme das erste sei verloren gegangen (Retransmission). Statt einer Antwort kommen jedoch nur weitere Verbindungsanfragen, die der Server ebenso behandelt. Er speichert all diese SYN-Anfragen in einem speziellen Puffer, der sogenannten Backlog-Queue. Ist diese voll, kann er auf diesem Port keine Verbindungen mehr annehmen und das Systen verwirft weitere SYN-Pakete -- der Dienst ist nicht mehr zu erreichen.
Bis der Server einen einmal angelegten Eintrag in der Backlog-Queue wieder löscht, weil er keine Antwort bekommt, können mehrere Minuten vergehen. Nach einem ersten Timeout, typischerweise nach 3 Sekunden, nimmt der Server an, sein SYN/ACK-Paket sei verloren gegangen und schickt es erneut auf die Reise. Dieser Vorgang wiederholt sich mit immer lĂ€ngeren Timeouts mehrfach (Linux: 5 Retransmissions). Auf einem Standard-Linux-System bietet die Backlog-Queue Platz fĂŒr 256 solcher halboffenen Verbindungen. Der Angreifer hat also mehr als genug Zeit, diese mit seinen EintrĂ€gen zu fĂŒllen.
In den meisten FĂ€llen verwendet der Angreifer gefĂ€lschte Absenderadressen fĂŒr seine SYN-Anfragen. Damit bekommt er die Antwortpakete des Servers zwar nicht zu sehen, aber da er ohnehin nicht vorhat, ihren Erhalt zu bestĂ€tigen, stört ihn das nicht. Durch geschicktes Verteilen der Adressen kann er ein Filtern der Angriffspakete verhindern. Denn ein vorgeschalteter Router kann die gefĂ€lschten Pakete nicht von echten VerbindungswĂŒnschen unterscheiden.
Benutzt ein Rechner eine der fĂŒr den Angriff genutzten Absenderadressen, erhĂ€lt er vom angegriffenen Server plötzlich ein BestĂ€tigungs-Paket (SYN/ACK), das er nicht angefordert hatte. Er reagiert auf das offensichtliche MissverstĂ€ndnis mit einer Aufforderung die Verbindung zu verwerfen (Reset, RST). Das fĂŒhrt dazu, dass der Server seinen Backlog-Eintrag löscht. Um das zu vermeiden, verwenden Syn-Flooder bevorzugt Adressen, die zum Zeitpunkt des Angriffs nicht belegt sind. So bekommt der Server keine Antwort auf sein SYN/ACK-Paket und wiederholt die volle Prozedur von Warten und erneutem Senden mehrfach, bevor er den Backlog-Eintrag freigibt.
Unter Beschuss
Unter Beschuss
Sowohl bei Windows als auch Unix/Linux zeigt netstat (Netzwerk-)Verbindungen und deren Status an. Die oft etwas verwirrende Ausgabe aller NetzwerkaktivitĂ€ten (-a) kann man mit -t (Linux) beziehungsweise -p TCP (Windows) auf TCP-Sockets einschrĂ€nken. Die Option -n unterdrĂŒckt zusĂ€tzlich die Namensauflösung.
Halboffene Verbindungen zeigt netstat mit dem Status SYN_RECV an (SYN_RECEIVED unter Windows). Diese treten normalerweise nur vereinzelt auf, selbst auf wirklich vielbeschÀftigten Servern wie denen von heise online sind selten mehrere Verbindungen gleichzeitig in diesem Zustand. WÀhrend einer SYN-Flood-Attacke tauchen hingegen plötzlich hunderte davon auf:
loki:~# netstat -tn
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.10.22.75:80 10.1.0.8:51966 SYN_RECV
tcp 0 0 10.10.22.75:80 10.1.0.6:23451 SYN_RECV
tcp 0 0 10.10.22.75:80 10.1.0.1:7890 SYN_RECV
tcp 0 0 10.10.22.75:80 10.1.0.7:43146 SYN_RECV
...
Doch ein entsprechend vorbereitetes System ist damit nicht so einfach in die Knie zu zwingen. Als ersten Schritt kann der Administrator die GröĂe der Backlog-Queue vorsichtig erhöhen. Unter Linux setzt
echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog
diesen Wert auf 1024, was sich auch im Dauerbetrieb auf heise online als unbedenklich erwiesen hat. Allerdings belegt jeder Eintrag in der Queue Speicher, sodass man den Wert an die Hardwareausstattung und Auslastung der Server anpassen muss.
AuĂerdem kann man analog in tcp_synack_retries die Zahl der erneuten SYN/ACK-Versuche herabsetzen. Der Standardwert von 5 sorgt fĂŒr einen Timeout von drei Minuten. Mit 1 versucht es der Server nach 3 Sekunden ein zweites Mal und gibt nach 9 Sekunden auf, was den Eintrag in der Backlog-Queue freigibt. Unter akutem Angriff kann man die Wiederholung auch ganz abschalten, was aber manchmal zu Problemen mit regulĂ€ren Nutzern mit langsamen Verbindungen fĂŒhrt.
Windows hÀrten
Auch unter Windows (2000, XP, 2003 Server) lÀsst sich die Zahl der SYN/ACK-Wiederholungen anpassen. Hier steuert das in der Registry unter
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
der Wert des Parameters TcpMaxDataRetransmissions. Zum HĂ€rten des Systems empfiehlt Microsoft ihn auf 2 (DWORD) zu setzen, was fĂŒr die Backlog-Queue einen Timeout von 21 Sekunden zur Folge hat.
AuĂerdem verfĂŒgt Windows ĂŒber einen Mechanismus, SYN-Flood-Angriffe selbststĂ€ndig zu erkennen und darauf zu reagieren. Diesen aktiviert der Parameter SynAttackProtect, die Werte von TcpMaxHalfOpen und TcpMaxHalfOpenRetried spezifizieren die Grenzwerte, bei deren Erreichen das System die Schutzmechanismen aktiviert. Steht SynAttackProtect auf 1, setzt Windows die Zahl der Retransmission herab und verzögert laut Microsoft das Anlegen von EintrĂ€gen im Routing-Cache. Der empfohlene Wert von 2 sorgt zusĂ€tzlich dafĂŒr, dass Windows erst nach einem vollzogenen Drei-Wege-Handshake das Winsock-Subsystem ĂŒber die ankommende Verbindung benachrichtigt. Das Verhalten des Systems im Normalbetrieb Ă€ndert sich durch SynAttackProtect nicht.
| Name | Wert (DWORD) |
| SynAttackProtect | 2 |
| TcpMaxPortsExhausted | 1 |
| TcpMaxHalfOpen | 500 |
| TcpMaxHalfOpenRetried | 400 |
| TcpMaxConnectResponseRetransmissions | 2 |
| TcpMaxDataRetransmissions | 2 |
| EnablePMTUDiscovery | 0 |
| KeepAliveTime | 300000 (5 Minuten) |
| NoNameReleaseOnDemand | 1 |
Von Microsoft zum Schutz vor SYN-Flooding vorgeschlagene Werte (unter HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters) [2,3]
Windows-Applikationen rufen zur Netzwerkkommunikation die Windows Socket API auf (Winsock). Auf Kernel-Ebene implementiert deren Funktionen der Treiber afd.sys. Auch er lĂ€sst sich ĂŒber spezielle Registry-Parameter anpassen und insbesondere eine dynamisch wachsende Backlog-Queue aktivieren.
| Name | Wert (DWORD) |
| EnableDynamicBacklog | 1 |
| MinimumDynamicBacklog | 20 |
| MaximumDynamicBacklog | 20000 |
| DynamicBacklogGrowthDelta | 10 |
Von Microsoft vorgeschlagene Parameter fĂŒr den Winsock-Treiber afd.sys (HKLM\System\CurrentControlSet\Services\AFD\Parameters)
Cookies als Schutzimpfung
Cookies als Schutzimpfung
Die eigentliche Schwachstelle, die SYN-Flooder ausnutzen, ist die Backlog-Queue; daran Ă€ndern auch die vorgestellten MaĂnahmen nichts. Sie erschweren einen Angriff zwar deutlich, aber mit ausreichenden Ressourcen kann ein Angreifer die Backlog-Queue immer noch mit sinnlosen EintrĂ€gen ĂŒberfluten.
Bereits 1996 hat jedoch Dan Bernstein gezeigt, wie man diese Schwachstelle gÀnzlich beseitigen kann. Dabei dienen sogenannte SYN-Cookies als Fallback-Mechanismus wenn die Backlog-Queue voll ist. Sie erfordern keine Anpassungen bei den Clients, aus deren Sicht der Server weiterhin normal antwortet.
Der Trick dabei ist es, dass der Server selbst keinerlei Informationen ĂŒber ein SYN-Paket speichert, sondern diese als Crypto-Cookie an den Client sendet. Wenn dieser nicht antwortet, hat der Server lediglich ein wenig Rechenzeit investiert. Antwortet der Client jedoch, kommt das Cookie wieder zurĂŒck und der Server kann anhand der darin enthaltenen Informationen feststellen, dass er mit diesem Client bereits gesprochen hat und die Verbindung herstellen â auch ohne dass er einen Eintrag in der Backlog-Queue dazu vorfindet.
Konkret verwendet der Server seine Sequenznummer, die er normalerweise pseudozufĂ€llig erzeugt, als Cookie. Mit SYN-Cookies erstellt er aus Quell- und Ziel-Ports, den zugehörigen IP-Adressen und einem Geheimnis einen MD5-Hash und schickt diesen als erste Sequenznummer an den Client. Kommt die Antwort, um den Dreiwege-Handshake zu komplettieren, enthĂ€lt diese eine BestĂ€tigung der Sequenznummer (ACK). Der Server bildet wiederum den MD5-Hash ĂŒber das Geheimnis und die Adressen und Ports des ACK-Pakets und vergleicht diesen Wert mit der vom Client bestĂ€tigten Sequenznummer. Stimmen die beiden ĂŒberein, weiss der Server, dass der Client das Cookie von ihm haben muss und stellt die Verbindung her. Weitere Details zu SYN-Cookies finden Sie unter [4].
Ein Handicap der SYN-Cookies ist die EinschrĂ€nkung, dass sie bestimmte TCP-Optionen wie zum Beispiel groĂe Fenster (TCP Window Size) nicht unterstĂŒtzen. Da der Server jedoch im Normalbetrieb keine SYN-Cookies verwendet und ohne diese EinschrĂ€nkung arbeitet, ist es sehr empfehlenswert, auf Servern SYN-Cookies als Fallback-Mechanismus fĂŒr Angriffe zu aktivieren.
Diverse BSD-Systeme und Linux unterstĂŒtzen SYN-Cookies von Haus aus. Bei Linux muss der Kernel mit der Option CONFIG_SYNCOOKIES ĂŒbersetzt sein, was beiden gĂ€ngigen Distributionen der Fall ist. Der Befehl
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
aktiviert dann die Verwendung der SYN-Cookies.
Fazit
MaĂnahmen wie das VergröĂern der Backlog-Queue und Herabsetzen der Zahl der Retransmissions lassen sich auch direkt auf andere Betriebssysteme wie Solaris ĂŒbertragen [5]. Mit den beschriebenen Methoden ist der Server recht gut auf SYN-Flood-Angriffe vorbereitet â ganz ausschalten können sie die Gefahr jedoch nicht. SpĂ€testens wenn die akkumulierte Bandbreite eines verteilten DoS-Angriffs die des Servers ĂŒbersteigt, helfen nur noch Filter auf vorgelagerten Routern, den regulĂ€ren Betrieb aufrecht zu halten.
Literatur
[1] Microsoft Knowledge Base: Internet Server Unavailable Because ofMalicious SYN Attacks [1]
[2] MSDN: How To: Harden the TCP/IP Stack [2]
[3] Microsoft Technet: Security Considerations for Network Attacks [3]
[4] Dan Bernstein: SYN-Cookies [4]
[5] Sun: Solaris Tunable Parameters Reference Manual [5] (ju [6])
URL dieses Artikels:
https://www.heise.de/-270378
Links in diesem Artikel:
[1] http://support.microsoft.com/default.aspx?scid=kb;en-us;142641
[2] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/HTHardTCP.asp
[3] http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/topics/network/secdeny.asp
[4] http://cr.yp.to/syncookies.html
[5] http://docs.sun.com/db/doc/806-7009
[6] mailto:ju@ct.de
Copyright © 2003 Heise Medien