2012-03-29 15 views
-4

Aus bestimmten Gründen muss ich einen Mini-Webserver in C (mit Debian) entwickeln.Wie schreibt man sichere c-Netzwerk-Software?

Da meine Anwendung wahrscheinlich vollständig aus dem Internet verwendet wird, würde ich mich über einige Tipps freuen, um diese Art von Anwendung zu sichern.

Allgemeiner gesagt, ich bin an allem interessiert damit zusammen, wie in C. sichere Software zu entwickeln

Vielen Dank.

+3

Dies ist ein ginormous Thema. SO ist für kleine spezifische Fragen gedacht. –

+3

Was ist mit den vorhandenen Webservern falsch? – Joni

+2

Die Frage ist kurz, das ist gut, aber im Stackoverflow-Format schwer zu beantworten, weil es nicht sehr fokussiert ist. – thb

Antwort

3

mit großen Schwierigkeiten.

Die beiden größten Probleme in C sind Buffer Overruns und Double-Frees, die es Angreifern ermöglichen, nicht vertrauenswürdigen Code auf Ihrem System auszuführen. Also, Nummer Eins, Code defensiv! Überprüfen Sie immer die Array-Grenzen, verwenden Sie NIEMALS gets und stellen Sie sicher, dass Sie alle Frees visuell mit mallocs übereinstimmen können. In der Tat, wenn Sie können, verwenden Sie einen konservativen GC wie Boehm, so dass Sie überhaupt nicht frei haben müssen. Dann benutze Tools wie Valgrind, um dein Programm zu analysieren und hoffentlich Dinge zu finden, die du vergessen hast.

Dann, da Sie einen Webserver schreiben, können Sie Setuid ausführen (wenn Sie auf einen Port < 1024 hören möchten), die auch sehr gefährlich ist, da es jedem gibt, der in Ihr Programm root einbricht. Führen Sie daher so viel wie möglich Ihres Systems in einem gegabelten Prozess als nicht vertrauenswürdiger Benutzer aus. Dies ist die nächste Sicherheitsebene, die Sie hoffentlich schützt, selbst wenn Ihr Programm einen Exploit hat (was es auch tun wird).

Testen Sie auch Test! Eine wichtige Art der Sicherheitsüberprüfung ist das "Fuzz Testing" - senden Sie zufällige Eingaben an Ihr Programm und sehen Sie, was passiert. Wenn Ihr Programm jemals die Werte für "segment" ändert, haben Sie möglicherweise einen ausnutzbaren Fehler.

+0

Ihre Antwort ist interessant. Ich gebe zu, dass ich eine schlechte Einstellung zu Garbage Collection (GC) hatte, weil ich das Gefühl habe, dass es eine Entschuldigung für schlampiges Coding ist. Aber ich habe noch nie einen Netzwerkserver programmiert, also ist meine schlechte Einstellung vielleicht ein nutzloses Vorurteil. Wenn Sie sich etwas ausdenken wollten, würde mich das interessieren. – thb

+1

Garbage Collection hat definitiv seine Vor- und Nachteile. Der Hauptbetrug ist meiner Meinung nach die Leistung - sowohl im Hinblick auf die Speicherkapazität (wo du erwarten kannst, dass du 2x den Speicher verwendest, den du sonst hättest) als auch auf das Vorhandensein unvorhersehbarer GC-Pausen, wenn dein Programm läuft. Aber im Hinblick auf eine bessere Chance, korrekte Programme zu schreiben, haben Erfahrung und Forschung gezeigt, dass es eine große Hilfe ist. Programme, die in einer Müll-gesammelten Sprache geschrieben werden, können schlampig aussehen, wenn Sie nicht daran gewöhnt sind (wo ist das Eigentum?), Aber die meisten "Schludrigkeiten" sind nur für die Speicherverwaltung wichtig, über die Sie sich keine Sorgen machen müssen! –

+0

Vielen Dank für die konstruktive Antwort. Ihre Antwort hilft wirklich.Ich hoffe auch, dass Leute mit festen Ideen den kleinen Ruf, den ich habe, nicht vollständig töten werden. –