Sicherheitskritische Frage zu C



  • Hallo Leute,

    durch die Funktion

    alloca(size_t n)
    

    wird Speicher auf dem Stack Frame der aktuell aufrufenden Funktion reserviert und nach dem beenden der Funktion wieder freigegeben.

    Nun lässt sich diese Funktion dazu nutzen, um eventuell das Ausführen von Shellcode zu erschweren? Natürlich unter der Bedingung das der Stack Ausführbar und nicht randomiesiert wurde.

    Ich meine, wenn ich den StackFrame einer Funktion dynamisch und zufällig vergrößere über alloca, sollte das Programmieren von Shellcode der im Context einer so präparierten Funktion laufen soll, geradezu unmöglich sein.

    Oder sehe ich das falsch?

    Es geht mir hier, nur um eine hypothetische Antwort auf meine Frage, ich benötige kein Quellcode der mir Zeigt das es doch geht, sondern wenn ich falsch liege würde ich gerne nur kurz eine Antwort haben!

    Gruß an alle Leser



  • Der Haken ist, dass du dich damit ausschließlich auf eine Funktion beschränkst. Mal angenommen ein Programm sollte durch dieses Verfahren von Shellcode geschützt werden, dieses von jeder existierenden Funktion durchlaufen werden.
    Wenn man den damit verbundenen Aufwand und vorallem die Fehleranfälligkeit berücksichtigt und sich klar macht,- dass schon eine einzige JMP-Operation den kompletten Mechanismus zunichte machen kann,- ist nicht die Shellcode Ausführung unmöglich, sondern die Umsentzung deiner Idee;



  • Ok. Das der Aufwand groß ist, ist mir klar. Es ging mir auch um eine prinzipielle Frage, wenn ein Angreifer nicht weiß wie groß die Stack Frames der Funktionen sein werden, kann er auch keinen Exploit entwickeln der deterministisch Funktioniert? Das sollte doch stimmen und für mich stellt sich hier dann die Frage warum kein Compiler die Größe der Stack Frames dynamisiert?

    Grüé



  • Vermutlich macht das kein Compiler weil z.B. Stack Canaries deutlich geringere Runtime Kosten haben, bei vermutlich vergleichbar gutem Schutz.

    Und als "Runtime Kosten" muss man hier denke ich auch dazuzählen dass mit der von dir beschriebenen Technik nicht mehr deterministisch wäre wie tief der Callstack eines Programms entlang einer bestimmten Rekursionskette werden kann.
    D.h. das selbe Programm mit dem selben Input könnte 1x perfekt durchlaufen und ein anderes mal mit nem Stack Overflow crashen. Ohne dass das Programm dabei selbst irgendwelche Zufallszahlen verwendet.
    Das wäre doch sehr ungünstig.

    ps: du hast das "k" bei "kein Compiler" ausgelassen. Was den Satz recht verwirrend macht.



  • Vermutlich macht das kein Compiler weil z.B. Stack Canaries deutlich geringere Runtime Kosten haben, bei vermutlich vergleichbar gutem Schutz.

    Nur das Canaries, kein aktiven Schutz liefern sondern die Möglichkeit Pufferüberläufe zu erkennen und wenn es ganz hart läuft lässt sich zumindest in meiner Vorstellung Shellcode entwickeln der Canaries in den einfachsten Ausführungen in leere laufen lässt.

    Nichts desto trotz, habt ihr Recht. Dynamisch die Größe des Stack Frames zu variieren ist mit Sicherheit nicht die Beste Idee, um die Ausführung von Shellcode zu verhindern. Es war auch nur ein prinzipielle Frage.

    PS: @hustbar hat aus ein kein gemacht.


Anmelden zum Antworten