linux-l: Buffer-Overflow

Jens Dreger jens.dreger at physik.fu-berlin.de
So Apr 23 19:56:28 CEST 2000


On Sun, Apr 23, 2000 at 05:40:39PM +0200, Michael Müller wrote:
> Hallo zusammen!
> 
> Ich habe im aktuellen Linux-Magazin unter der Insecurity-Rubrik, in der
> über Sicherheitslöcher berichtet wird, mehrmals gelesen, daß ein
> Angreifer durch Erzeugen eines Buffer-Overflows root-Rechte erlangen
> kann.
> Mir ist überhaupt nicht klar, was da passiert. Leider ist auch nicht
> erklärt, was ein Buffer-Overflow ist. Ich stelle mir vor, daß man einen
> Speicherbereich überlaufen läßt und so einen Speicherschutzmechanismus
> aktiviert. Aber wie kommt der Angreifer jetzt an seine root-Rechte?
> Warum bricht (bzw. wird abgebrochen) das Programm nicht einfach ab?

Nun, Du willst zwar einen Speicherbereich ueberschreiben, aber dabei nicht
unbedingt aus den Speicherseiten herauslaufen, die dem Programm
gehoeren. Segmentation Fault ist also nicht unbedingt Dein Ziel.

Hier ein Mini-Beispiel:

---------------8<---------------------
// compile with: gcc overflow.c -o overflow
#include <stdio.h>

char s1[2] = "";
char s2[2] = "";

int main( int argc, char *argv[] )
{
  strcpy( s1, argv[1] );
  printf("s2: %s\n",s2);
}
--------------8<---------------------------

Das erste Argument wird in den String s1 kopiert und danach String s2
ausgegeben. Was wuerde man erwarten ? Dass nichts erscheint natuerlich, 
String s2 ist ja leer.

  dreger at smart:~> overflow 1
  s2:

Aber wenn man mehr als zwei Zeichen uebergibt:

  dreger at smart:~> overflow 123
  s2: 3

Die 3 ist von s1 nach s2 ruebergeschwappt, weil die zufaellig direkt
hintereinander im Speicher lagen. Das Programm stuerzt natuerlich
nicht ab, weil s2 ja zum Programm gehoert. Tatsaechlich stuerzt es
erst weit spaeter mit einem Seg-Fault ab:

  dreger at smart:~> overflow 123456789012345678901
  s2: 3456789012345678901
  Segmentation fault (core dumped)

Immerhin hat es noch die Ausgabe geschafft. Dies ist 7 Bytes spaeter
nicht mehr der Fall:

  dreger at smart:~> overflow 1234567890123456789012345678
  Segmentation fault (core dumped)

Alles was Du jetzt noch machen musst, ist statt 1234567... einen
ausfuehrbaren Code zu uebergeben und mit etwas Glueck wird der in
einen Bereich geschrieben, der irgendwann zur Ausfuehrung gelangt,
weil da eigentlich eine Unterroutine stehen sollte.

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l