Philipp Hasenfratz: aufruf des interpreters/start eines prozesses unterbinden

Beitrag lesen

Halihallo

mit Verspätung kommen noch einige Anmerkungen...

Ich bin der Meinung von Michael: Du solltest eigentlich jedem Benutzer den Zugang zu deinen Programmen gewähren und kannst nicht zwischen "guten und bösen" Abfragen unterscheiden (dafür gibt's leider keine 100% sicheren Kriterien). Deshalb schlage ich auch nur Lösungsansätze vor, die mögliche Attacken minimieren.

"<http-equiv name='refresh' content='1; URL=<same-script>'> einen Augenblick bitte, das Programm ist momentan ausgelastet"; das Script wird dann automatisch nach einer Sekunde erneut gestartet.

das hilft in dem fall leider auch net weiter, da daß aufrufende progi die antwort nicht abwartet...und somit auch nicht verarbeitet. außerdem bezweifele ich stark daß es ein browser ist. das script soll ÜBERHAUPT NICHT starten.

Ist mir klar, dass das Programm die Ausgabe nicht abwartet. Diese Meldung soll den "guten" User darüber informieren, dass dein Programm ausgelastet ist. Die Abfrage (ob ausgelastet) kannst du an den Anfang deiner Programme setzen. Somit kannst du die Laufdauer der Programme im Falle einer Attacke verkleinern.
Falls keine Attacke am Laufen ist, wird diese Meldung praktisch nie ausgegeben (es sei denn zwei oder mehrere Klienten greifen zur selben Sekunde auf dieselbe URL zu). Mir ist jedoch auch klar, dass die Attacke dennoch nach 20 Minuten erfolgreich sein wird. Du müsstest theoretisch ein Programm schreiben, welches schneller ist als die Request des attackierenden Programmes. Dann hättest du keine Probleme mehr.

fast alle scripte ändern irgendwelche daten. die laufzeit hab ich insofern verkürzt, daß ganz am anfang, bevor das script überhaupt seine eigentliche arbeit startet, zuerst $ENV{'HTTP_USER_AGENT'} abgefragt wird, und, falls $ENV{'HTTP_USER_AGENT'} eq "" dann exit...geholfen hat's leider nix, nach knapp 20minütiger attacke war's dann soweit :-(

Das ist leider ein Problem, dass nicht einfach (oder gar nicht?) zu lösen ist.

  • Theoretisch lässt sich auch ein Session-Management einrichten. Programme, welche ohne gültige SessionID und SessionKey aufgerufen werden, werden sofort beendet. Zwischen den Requests einer Session muss mindestens eine halbe Sekunde verstreichen, sonst wird das Programm ebenfalls beendet.

öhm, sagt mir jetzt net viel, auf der anderen seite, was bringt's, wenn der prozess sowieso wird? ich will vielmehr verhindern, daß er überhaupt erst gestartet wird

Um den Lösungsvorschlag zu erklaren:
Jedem Clienten teilst du eine SessionID und einen SessionKey (temporäres Passwort) zu. Für jeden Request hast du also folgende Informationen:

2002-01-16 15:36:01 /cgi-bin/.../prog.pl SessionID=123 (das Attackescript)
2002-01-16 15:36:01 /cgi-bin/.../prog1.pl SessionID=456 (ein anderer)
2002-01-16 15:36:02 /cgi-bin/.../prog1.pl SessionID=123 (Attacke!)

Also, dann sollte das prog1.pl Programm sofort merken, dass die SessionID 123 vor nur _einer_ Sekunde ein anderes Programm gestartet hat und somit sollte eine Meldung ausgegeben werden (falls es ein braver Client war) und das Programm _sofort_ beendet werden (um die Laufzeit zu verkürzen und die Attacke etwas zu vermiesen).

mag sein, daß diese ihren dienst versehen...aber leider unzureichend :-( trotzdem thanx.

Einverstanden. Sicher sind sie unzureichend, aber du wirst _nie_ eine zureichende Lösung finden, ohne andere in Mitleidenschaft zu ziehen! - Michael hat ja die einzelnen Punkte genannt.

Viele Grüsse

Philipp