<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Wie kann ich Buffer-Overflows ausschließen (winsock)?]]></title><description><![CDATA[<p>Mein Programm beinhaltet einen Server. Die mit recv() eingelesenen Daten vom Socket werden in einen fixen Speicher von einer Größe von x-Bytes gerspeichert.<br />
Da die Übertragung nach meinem Protokoll läuft haben die Pakete eine festgelegte Größe von x-Bytes.</p>
<p>Was würde passieren, wenn nun ein Böswilliger mit nem Script übergroße Datenpakete senden würde?</p>
<p>Kann es dann zu Buffer-Overflows kommen?<br />
Wenn ja, wie kann ich diese ausschließen (verhindern)?</p>
<p>Meines Wissens würde recv() nicht mehr als im Parameter angegebene Bytes zu meinem Buffer weiterleiten, sondern würde das, was zu viel ist, abschneiden und wegschmeissen.</p>
<p>Da ich unter keinen Umständen DOS-Attacken-Opfer werden will und das Programm ständig läuft wäre gut zu wissen, ob Gefahr besteht.</p>
<p>Mfg. Tolga.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/79312/wie-kann-ich-buffer-overflows-ausschließen-winsock</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 18:30:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/79312.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Jul 2004 18:48:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 18:48:01 GMT]]></title><description><![CDATA[<p>Mein Programm beinhaltet einen Server. Die mit recv() eingelesenen Daten vom Socket werden in einen fixen Speicher von einer Größe von x-Bytes gerspeichert.<br />
Da die Übertragung nach meinem Protokoll läuft haben die Pakete eine festgelegte Größe von x-Bytes.</p>
<p>Was würde passieren, wenn nun ein Böswilliger mit nem Script übergroße Datenpakete senden würde?</p>
<p>Kann es dann zu Buffer-Overflows kommen?<br />
Wenn ja, wie kann ich diese ausschließen (verhindern)?</p>
<p>Meines Wissens würde recv() nicht mehr als im Parameter angegebene Bytes zu meinem Buffer weiterleiten, sondern würde das, was zu viel ist, abschneiden und wegschmeissen.</p>
<p>Da ich unter keinen Umständen DOS-Attacken-Opfer werden will und das Programm ständig läuft wäre gut zu wissen, ob Gefahr besteht.</p>
<p>Mfg. Tolga.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557098</guid><dc:creator><![CDATA[Tolga]]></dc:creator><pubDate>Fri, 09 Jul 2004 18:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 19:11:54 GMT]]></title><description><![CDATA[<p>recv schmeißt nichts weg, sondern speichert die restlichen Daten in eine queue und liest diese beim nächsten recv Aufruf ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557106</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Fri, 09 Jul 2004 19:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 19:01:39 GMT]]></title><description><![CDATA[<p>Wenn du bei recv die richtige Größe angibst und das Buffer-Array auch groß genug ist, kann doch nichts passieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557108</guid><dc:creator><![CDATA[schlau]]></dc:creator><pubDate>Fri, 09 Jul 2004 19:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 19:23:32 GMT]]></title><description><![CDATA[<p>Sobald du glaubst, daß dein Code sicher ist, solltest du ihn einfach testen. Schicke einfach mal ein paar zu lange Blöcke, und achte besonders auf Randfälle (z.B. wenn der Block genau ein Byte zu lang ist etc.).</p>
<p>Wenn dein Protokoll die Übertragung von Strings vorsieht, kann es z.B. sein, daß dann der 0-Terminator fehlt.</p>
<p>Finde ich aber Klasse, daß du dir um so etwas Gedanken machst. Weiter so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/557117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557117</guid><dc:creator><![CDATA[Raving Tux]]></dc:creator><pubDate>Fri, 09 Jul 2004 19:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 19:38:14 GMT]]></title><description><![CDATA[<p>Ich übertrage binär eine Struktur in der die Paketinformationen und Daten enthalten sind...</p>
<p>Danke für die Antworten. Es war gut zu erfahren, dass recv() nicht den überschüssigen Teil wegschmeisst. War mir neu.</p>
<p>Was passiert wenn dieser Queue auch voll wird (was ja allein wegen der Logik ganz sicher auftritt wenn permanent mehr geschickt wird als ich rauslese)?<br />
Schmeisst Windows dann teile weg oder nimmt winsock keine neuen daten mehr an oder ist das die Geburt des Buffer-Overflows??</p>
<p>Bin dafür ich als Programmierer verantwortlich oder ist es Windows' Aufgabe sowas zu verhindern?</p>
<p>Bisher wurde mir nur empfohlen es einfach zu testen mit Übergroßen Paketen.<br />
Sagen wir mal, ich ahbe es getestet und mein Programm stürzt ab. Wie kann man dann dagegen vorgehn?</p>
<p>Was mir spontan einfällt ist einfach immer 10 Bytes größeren Buffer anzugeben bei recv() als meine datenpakete groß sind. Dann könnte man eine Attacke im Keim erstekicken indem man, sobald ein größeres Paket ankommt als vorgesehn die Verbindung zum Remote sofort beendet wird.</p>
<p>Ich nehme mal an dass das auch der konventionelle Weg ist oder gibts da ne bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557123</guid><dc:creator><![CDATA[Tolga]]></dc:creator><pubDate>Fri, 09 Jul 2004 19:38:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 20:27:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Danke für die Antworten. Es war gut zu erfahren, dass recv() nicht den überschüssigen Teil wegschmeisst. War mir neu.</p>
</blockquote>
<p>Ist jetzt nicht böse gemeint, aber lies dir unbedingt erst mal die Dokumentation im MSDN durch. Dort stehen die Antworten auf alle deine Fragen. Der 'Remarks'-Teil sollte unbedingt immer komplett durchgelesen werden.</p>
<blockquote>
<p>Was passiert wenn dieser Queue auch voll wird (was ja allein wegen der Logik ganz sicher auftritt wenn permanent mehr geschickt wird als ich rauslese)?<br />
Schmeisst Windows dann teile weg oder nimmt winsock keine neuen daten mehr an oder ist das die Geburt des Buffer-Overflows??</p>
</blockquote>
<p>Wie im MSDN nachzulesen, hängt das vom Protokoll ab. Bei TCP wird nichts weggeschmissen.</p>
<blockquote>
<p>Was mir spontan einfällt ist einfach immer 10 Bytes größeren Buffer anzugeben bei recv() als meine datenpakete groß sind. Dann könnte man eine Attacke im Keim erstekicken indem man, sobald ein größeres Paket ankommt als vorgesehn die Verbindung zum Remote sofort beendet wird.</p>
</blockquote>
<p>Was genau du machen solltest, hängt von deinem Protokoll. Zwei Beispiele:</p>
<p>1. Der Client schickt immer nur ein Paket pro Verbindung.<br />
In diesem Fall liest du einfach so viele Bytes, wie du für deine Pakete brauchst. Danach bearbeitest du dein Paket und schickst die Antwort zurück. Dann machst du einfach die Verbindung zu; wenn der Client zu viel geschickt hat, dann ignorierst du das einfach.</p>
<p>2. Der Client schickt mehrere Pakete pro Verbindung.<br />
Dann machst du einfach das folgende in einer Schleife:<br />
- Lies so viele Bytes ein, wie du für ein Paket brauchst.<br />
- Überprüfe, ob das Paket gültige Daten enthält.<br />
- Bearbeite das Paket.</p>
<p>Sollte der Client jetzt ein gültiges Paket plus Extra-Bytes schicken, dann würde der erste Teil der Daten (das gültige Paket) bearbeitet werden. Der Rest würde dann bei der Gültigkeits-Überprüfung durchfallen, und du würdest die Verbindung schließen.</p>
<p>Wichtig: recv() kann auch weniger Bytes zurückgeben als du haben möchtest. Die Buffer-Größe ist nur ein Maximal-Wert!</p>
<p>Wie gesagt: Lies dir mal ganz genau die Doku im MSDN durch; dann sollten die meisten Fragen beantwortet sein. Ansonsten einfach nochmal nachfragen.</p>
<p>Das mit dem 10 Bytes größeren Buffer vergiss schnell wieder. Viel zu umständlich, und sicher ist es auch nicht (z.B. weil recv() weniger als die Buffer-Größe zurückliefern kann etc.).</p>
<blockquote>
<p>Ich nehme mal an dass das auch der konventionelle Weg ist oder gibts da ne bessere Lösung?</p>
</blockquote>
<p>Die Lösung ist keine Lösung (siehe oben). Vergiss das bitte ganz schnell wieder.</p>
<p>Gruß</p>
<p>Raving Tux</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557142</guid><dc:creator><![CDATA[Raving Tux]]></dc:creator><pubDate>Fri, 09 Jul 2004 20:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 20:27:39 GMT]]></title><description><![CDATA[<p>Wenn die Warteschlange voll ist, werden möglicherweise Daten die vorne liegen (ältere Daten) gelöscht, um Platz hinten für neue Daten zu machen. Zumindest auf diese Weise funktioniert eine Queue <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/557143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557143</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Fri, 09 Jul 2004 20:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 20:45:57 GMT]]></title><description><![CDATA[<p>Was passiert dann wenn nen mit 1 Gigabit angebundener Client eine 50 GB Datei empfängt, aber dessen Festplatte die Datei nur mit 0,5 Gigabit speichern kann ?<br />
Dann würde die Queue ja ziemlich schnell ziemlich groß...<br />
...und einfach ältere noch nicht via recv() eingelesene Bytes wegschmeißen würde ja die Datenfolge völlig zerstören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557155</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Fri, 09 Jul 2004 20:45:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 20:54:41 GMT]]></title><description><![CDATA[<p>Ich habe den remakrsbereich auch shcon durchgelesen gehabt und anscheinend zu oberflächlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>@Raving Tux:<br />
Danke für den tollen Tipp. Hört sich gut an. Wenn Extrabytes mitgeschickt werden die cniht zum Paket gehören, dann würden diese beim nächsten Aufruf von recv() als ein Teil des nächsten Pakets eingelesen und ich könnte mit ner Benachrichtigung über die falschen Daten die Verbindung zum Remote beenden.<br />
Scheint auch sauberer zu sein.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/41">@Geeky</a>: Dann müsste der Client sich den Umständen anpassen und sinnvoll senden statt den Server voll zu schießen.</p>
<p>--- Hier mit ist der Thread für mich geschlossen. Thx @ll ---</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557164</guid><dc:creator><![CDATA[Tolga]]></dc:creator><pubDate>Fri, 09 Jul 2004 20:54:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 21:38:48 GMT]]></title><description><![CDATA[<p>geeky schrieb:</p>
<blockquote>
<p>Was passiert dann wenn nen mit 1 Gigabit angebundener Client eine 50 GB Datei empfängt, aber dessen Festplatte die Datei nur mit 0,5 Gigabit speichern kann ?<br />
Dann würde die Queue ja ziemlich schnell ziemlich groß....</p>
</blockquote>
<p>Stichwort Flusskontrolle. Bei TCP werden für jedes empfangene Paket eine Bestätigung verschickt, außerdem schickt der Server maximal x Pakete gleichzeitig auf die Reise. Das heißt, wenn der Empfänger mit Speichern nicht nachkommt, bekommt der Server weniger Bestätigungen und sendet automatisch langsamer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/557191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557191</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Fri, 09 Jul 2004 21:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann ich Buffer-Overflows ausschließen (winsock)? on Fri, 09 Jul 2004 22:04:22 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/557200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/557200</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Fri, 09 Jul 2004 22:04:22 GMT</pubDate></item></channel></rss>