Mailinglist Archive: opensuse-de (6551 mails)

< Previous Next >
Re: Was ist eine gueltige Message-ID?
  • From: Jan.Trippler@xxxxxxxxxxx (Jan Trippler)
  • Date: Sat, 3 Aug 2002 22:43:10 +0200
  • Message-id: <20020803224310.A21774@xxxxxxxxxxxxxx>
On Sam, 03 Aug 2002 at 20:49 (+0200), Andre Heine wrote:
Am Samstag, 3. August 2002 20:24 schrieb Thorsten Haude:
* Jan Trippler <Jan.Trippler@xxxxxxxxxxx> [02-08-03 17:06]:
On Sam, 03 Aug 2002 at 10:45 (+0200), Thorsten Haude wrote:

[...]
Ich linke mich jetzt mal dazu :))

Nebenbei: Du betreibst Demagogie, Du behauptest nämlich
implizit, dass die Verwendung von strcmp() Bufferprobleme
verursacht - womit Du immer noch allein bist.

IMHO sollte man bei C99 lieber strncmp, strncat, strncpy, usw.
verwenden.

Sorry, ich kenne leider den ganzen Thread nicht. Durch strcmp()
können IMHO Puffer Überläufe passieren, man sollte gerade bei der
string Verarbeitung aufpassen.

Sorry, das sind Gemeinplätze. Schau Dir den Anfang des Threads an,
damit Du verstehst, wie diese Diskussion zustande kam. BTW: man
sollte bei der Programmierung immer aufpassen - nicht nur bei
Strings (um auch mal einen Gemeinplatz beizusteuern).

Jedenfalls wenn man mit Sockets arbeitet, ein Server kann einem
soetwas sehr übel nehmen.

JEDES Programm nimmt Buffer Overflows übel. Es führt in den meisten
Fällen zu einer ungewollten Programmfortführung (oder -beendigung).

ZITAT:
"Es ist bemerkenswert, wie viele Einbrüche durch einen Hacker
zustande kamen, der so viele Daten sendete, daß der Server-Aufruf
von sprintf Puffer zum Überlaufen brachte. Weitere Funktionen, mit
denen wir vorsichtig sein sollten, sind gets, strcat,strcpy. Statt
dessen sollten wir üblicherweise fgets, strncat und strncpy
verwenden. Zusätzliche Hinweise zum Aufbau von sicheren
Netzwerkenprogrammen finden Sie im Kapitel 23 von[Garfinkel und
Spafford 1996]"

Aus dem Buch "Programmieren von UNIX-Netzwerken", Hanser Verlag.

Was meinst Du, warum strcmp in diesem Zitat nicht auftaucht ...

Zu dem Zitat: Es geht hier IMHO um eine bestimmte Art von
Stringhandling: Die Zuweisung von Werten unbekannter Herkunft an
einen String. Alle diese Funktionen haben gemeinsam, dass sie die
Quell-Strings ungeprüft (bis zum ersten auftretenden 0 - sic!) an
das Ziel übergeben. Es wird keine Prüfung durchgeführt, ob die
Deklaration des Zielpuffers ausreichend ist - das geht aus 2 Gründen
nicht:
- die aufgerufene Funktion kennt die Deklaration nicht (sie kriegt
einen Pointer als Parameter)
- die Größe kann zur Compile-Zeit unbekannt sein (dynamische
Puffer).

Der Buffer Overflow tritt aus genau einem Grund auf: Der
Programmierer hat einen String aus unsicherer Quelle nicht
ausreichend geprüft. Wenn das geschieht, kann man diese Funktionen
auch einsetzen. Ein Schutz kann u. a. mit Hilfe von strncat,
strncpy, fgets passieren, die eine Maximallänge zu kopierender
Zeichen erwarten; denkbar sind aber auch Konstrukte wie:
while (i < sizeof buf) *(buf + i++) = fgetc(file);
oder:
sprintf (format, "%%-.%ds", sizoef (buf) - 1);
sprintf (buf, format, eingabe);
oder:
...

IMHO ist das genauso mit strcmp(), mag mich aber täuschen...

Was bringt Dich auf diesen Gedanken? Alle im Zitat genannten
Funktionen weisen Strings Werte zu, str(n)cmp vergleicht Strings.
strcmp ist nur dann ein Risiko, wenn einer der beiden Parameter
nicht sauber nullterminiert ist. Und dann kann strcmp eben einfach
durch den Speicher sausen und bei der ersten Unstimmigkeit (oder 0!)
anhalten. Wenn ich ein Programm baue, dem erst an dieser Stelle
auffällt, das da was nicht stimmen könnte - ...

Zum x-ten Mal: Die Diskussion begann, als Thorsten Haude behauptete,
man könne sich nicht sicher sein, ob strcmp() am Stringende (Wert
des Bytes = 0) aufhört zu vergleichen - und das ist nun mal Quatsch!

Ich behaupte nur, daß ich darüber nicht nachdenken will, und
darum strncmp verwende, wenn es sich irgendwie einrichten läßt.

ACK.

NACK! Wenn ich anfange, in Programmen nicht mehr über die
Zweckmäßigkeit dieser (strcmp) oder jener (strncmp) Funktion
nachzudenken, dann sollte ich mir einen anderen Job suchen. Wie im
Thread bereits mehrmals erwähnt bedeutet der Einsatz von strncmp
immer, dass ich mir Gedanken darüber machen muss, wie weit ich den
Vergleich laufen lasse. Das kann einfach sein (statische Strings,
wohldefinierte Größen), kann aber im Falle von dynamisch erzeugten
Strings auch ziemlich aufwändig werden - vor allem dann, wenn ich
diese Berechnung sehr oft machen muss.

Wenn es nur ein einziger, oder wenige Vergleiche sind, so ist
das sicherlich egal. Aber gerade Vergleiche können sehr,
sehr häufig vorkommen. Denk mal an Sortierprogramme.

Server z.B., DOS Attacken, etc...

Was sollen uns diese Begriffe jetzt sagen?

Jan


< Previous Next >
Follow Ups