FreeBasic: Sicherheit

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Grundsatz:

All inputs are evil.

Was heißt das nun?

Alles was rein kommt (Dateien, Eingaben durch den Benutzer, Zwischenablage ...), ist als "böse" zu betrachten.

Übernehmt beispielweise bei einer Bilddatei nicht blindlings die Auflösung.

Oder lest eine Datei nicht in ein Array ein, wenn ihr das Ende der Datei nur mit eof() prüft. (Prüft zusätzlich mit der Obergrenze des Arrays)

buffer overflow[Bearbeiten]

Wikipedia hat einen Artikel zum Thema:

auf Deutsch: Pufferüberlauf.

Auch wenn es nicht so aussieht, kann man auch mit Freebasic große sicherheitskritische Fehler erzeugen.

ReDim a(0 to 5) As Integer
ReDim b(0 to 5) As Integer
Dim i As Integer
 
For i=0 to 5
    b(i)=i^3
    ? b(i)
Next i

?

For i=0 to 20
    a(i)=i*2
Next i

For i=0 to 5
    ? a(i);b(i)
Next i

Sleep

Bei Freebasic 0.17 wird der Inhalt von b() aufgrund der Fehldimensionierung von a() teilweise überschrieben. Nachdem man eine Taste drückt, und sich das Programm normalerweise beendet, erhält man unter Linux sogar eine Fehlermeldung. ("*** glibc detected *** ./sicherheit_test: munmap_chunk(): invalid pointer: 0x08053a58 ***")

Hier ein anderes Beispiel:

ReDim liste1(1 to 3) as string*15
ReDim liste2(1 to 3) as string*15
Dim As Integer i

liste1(1)="Apfel  "
liste1(2)="Birne  "
liste1(3)="Pflaume"

liste2(1)="Hund   "
liste2(2)="Katze  "
liste2(3)="Fisch  "

For i=0 to 8
    ? liste1(i)
Next i

sleep

Das Schlimme an solchen Sachen ist, dass es anfangs einwandfrei läuft; aber früher oder später gehen solche "Zeitbomben" hoch.

Wie schon diese Beispiele zeigen, ändert sich bei fast jeder Version das Verhalten.

Ein buffer overflow kann zu unerklärlichen Fehlern führen, die schwer zu finden sind.

Die Moral von der Geschicht:

Beim Dimensionieren genau aufpassen, dass die Größe des Arrays stimmt.


Zum Überprüfen kann man FreeBASIC anweisen, wie unter QBASIC eine Fehlerüberprüfung durchzuführen. Dazu kompiliert man mit "fbc <program.bas> -exx", und schon erhält man bei den Beispielen folgenden Fehler:

Aborting due to runtime error 6 (out of bounds array access) at line XXX of XXX.bas::()

(Die Fehlerausgabe kommt während der Ausführung des Programms, nicht bei der Kompilierung.)