kostenloser Webspace werbefrei: lima-city


Heap- und Stack-Overflow Was ist das?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    moglie

    moglie hat kostenlosen Webspace.

    Man liest ja immer mal, dass irgendwo mal ein Stack- oder ein Heapoverflow aufgetreten ist, der dazu benutzt werden kann, beliebigen Code mit den Rechten eines bestimmten Benutzers auszuf?hren. Mit Heap und Stack kann ich etwas anfangen, aber ich wollte mal wissen, was so ein overflow ist und was man als Progger machen sollte, damit einem selbst so was nicht passiert?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 0******a

    Heap und Stack (Buffer-) Overflows nennt man allgemein auch Bufferoverflow. Der Unterschied liegt nur darin, wo das statt findet (Heap: dynamisch allozierter Speicher; Stack: Statischer Speicher, Parameter?bergabe bei Funktionen, R?ckgabewerte von Funktionen, etc.).

    Hier ein kleines Beispiel f?r einen Bufferoverflow auf dem Stack:

    char szText[6] = "Hallo";
    strcpy(szText, "Guten Tag");

    Man hat hier jetzt einen Bufferoverflow, weil szText eigentlich nur 5 Zeichen fasst, mit strcpy() aber 9 Zeichen reinkopiert werden. Der f?r strcpy() bereitgestellte Puffer szText ist also "?bergelaufen", daher der Name "Puffer?berlauf" oder "Bufferoverflow". Bei einem kleinen Programm und einem so kleinen ?berlauf passiert meist gar nichts, was aber meist nur im Zusammenhang mit der Speicherverwaltung des Betriebssystems steht. Ansonsten kann das Programm einem auch mal komplett abst?rzen.

    Das Ausf?hren von Code wird nur bei Bufferoverflows auf dem Stack erreicht. Bei Bufferoverflows auf dem Heap besteht meist nur die Gefahr, das Daten, die nur dem gerade ausgef?hrten Programm bekannt sein d?rfen, ausspioniert werden k?nnten.

    Verhindern kann man so was nur, indem man beim Bef?llen von Arrays egal welcher Art auf die Gr?sse des Arrays achtet.
  4. Autor dieses Themas

    moglie

    moglie hat kostenlosen Webspace.

    So wie ich das sehe, sollte es doch dann nicht sonderlich schwierig sein, solche Sicherheitsl?cken zu vermeiden. Trotzdem passiert es immer wieder. Wie kann das sein?
  5. 0******a

    Das Problem tritt meistens bei zwei verschiedenen Dingen auf:
    1. Benutzereingaben oder andere Eingaben, die ?usserem Einfluss unterliegen
    2. Puffer, auf denen viel innerhalb des Programms gemacht wird


    Bei den ?usseren Einfl?ssen passiert nichts, wenn man sorgf?ltig arbeitet, allerdings kommt es halt ab und an mal vor, das man etwas vergisst oder ?bersieht. Folgendes Beispiel dazu (ist zwar eigentlich kein Bufferoverflow, sondern ein Bufferoverrun, aber erstens ist der leichter zu finden und zweitens kann man damit sch?ne DoS-Attacken machen *g*):

    int main(int argv, char * argc[])
    {
    ???char szPuffer[81];

    ???if (argv != 2)
    ???{
    ??????printf("Fehlende oder zu viele Parameter\n");
    ??????return 1;
    ???}

    ???if (strlen(argc[1]) > 40)
    ???{
    ??????printf("Parameter zu lang\n");
    ??????return 1;
    ???}

    ???sprintf(szPuffer, "Uebergebener Parameter: %s\n", argc[1]);
    ???printf(szPuffer);

    ???return 0;
    }

    Versuch doch mal rauszufinden, wo in diesem Code ein schwerwiegender Fehler steckt. Ich poste die L?sung in den n?chsten Tagen, falls es keiner findet.



    Zu dem 2. Punkt, bei dem intern im Programm ein Bufferoverrun erzeugt wird liegt es meistens daran, das der oder die Programmierer einfach bei sehr viel Code den ?berblick verlieren. Oft kommt es durch Zeitdruck zu solchen Schlampereien (ist zum Beispiel bei den Microsoft Produkten fast immer der Fall).

    Beitrag ge?ndert am 18.10 23:52 von 0-checka
  6. Autor dieses Themas

    moglie

    moglie hat kostenlosen Webspace.

    Poste mal bitte die Antwort.
  7. 0******a

    Der Fehler ist in den Zeilen

    sprintf(szPuffer, "Uebergebener Parameter: %s\n", argc[1]);
    printf(szPuffer);

    Es ist zwar vor dem sprintf() ?berpr?ft worden, ob argc[1] in den Puffer szPuffer reinpasst und es auch vorher ?berpr?ft worden, ob argc[1] ?berhaupt existiert, aber man kann das Programm trotzdem abst?rzen lassen. Was ist, wenn irgendein Komiker auf die Idee kommt, dem Programm als Parameter den String "%s%s%s%s%s%s" zu ?bergeben?
    sprintf schreibt dann in szPuffer "Uebergebener Parameter: %s%s%s%s%s%s\n" und wenn dann dann printf() mit szPuffer aufgerufen wird, dann versucht printf() nat?rlich die ganzen nicht vorhandenen Strings vom Stack abzurufen. Schon bei einem nicht vorhandenen String kann das in die Hose gehen, wenn nicht irgendwo auf dem Stack ein '\0'-Byte liegt. Bei so vielen sch?tze ich mal, das es ganz sicher zum Absturz des Programms f?hrt. M?sste man mal ausprobieren. Einen ?hnlichen Fehler gab es zum Beispiel mal beim MS IIS im FTP Modul, was dazu gef?hrt hat, das man den FTP-Server einfach abst?rzen lassen konnte.
    Ich hoffe, das Beispiel war ganz gut, um zu zeigen, wie schnell man eine m?gliche Sicherheitsl?cke ?bersehen kann.


    Nachtrag:
    Um den Fehler zu umgehen, m?sste man statt
    printf(szPuffer);
    das so machen:
    printf("%s", szPuffer);

    Das sind halt so Erfahrungswerte ?ber sicheres Programmieren in C bzw. C++, die man mit der Zeit sammelt, aber die man ab und an mal doch wieder ?bersieht. Daher kommt es halt in solch grossen Projekten wie MS Betriebssysteme und/oder deren Produkten andauernd zu solchen Fehlern (ausser dem Entwickler und vielleicht einem Code Reviewer schaut sich ja niemand den Code an, um so was m?glicherweise mal vorzeitig zu entdecken).

    Beitrag ge?ndert am 21.10 16:47 von 0-checka
  8. d*****s

    [edit]
    ich will nix gesagt haben! :biggrin:

    Beitrag ge?ndert am 28.10 09:31 von des-sys
  9. 0******a


    bin ich bl?d oder w?rd der buffer nicht auch mit der neuen l?sung ?berlaufen?

    Nee, du bist bl?d ;-)



    es wurde ein array szPuffer mit platz f?r 80 zeichen deklariert und eine string-l?nge von ?ber 40 zeichen ?berpr?ft, aber "Uebergebener Parameter: " + einem string von 40 zeichen l?nge w?rde doch schon mehr als 80 zeichen beinhalten und so den speicher f?r das array sprengen, oder nicht?!

    Nein:
    sprintf(szPuffer, "Uebergebener Parameter: %s\n", argc[1]);
    "Uebergebener Parameter: " sind 24 Zeichen. "\n" ist ein Zeichen. Das mach zusammen 25 Zeichen. argc[1] ist an dieser Stelle nie l?nger als 40 Zeichen (wegen if (strlen(argc[1]) > 40) {printf("Parameter zu lang\n"); return 1;}). Das macht zusammen h?chstens 65 Zeichen + ein abschliessendes 0-Byte. Das passt massig in ein Array von 81 Zeichen.
  10. d*****s

    *aaahhhh* was hab ich denn da gestern gerechnet??? *rot-anlauf*
    vergiss alles was ich gesagt hab! :rolleyes:

    ich zieh mich lieber wieder in mein kleines loch zur?ck...
    *ay-wie-peinlich*
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!