Format String Vulnerability [solved]

Alles rund um sicherheitsrelevante Fragen und Probleme.
Antworten
Jester
Beiträge: 23
Registriert: 05.06.2007 20:57:54

Format String Vulnerability [solved]

Beitrag von Jester » 28.06.2010 12:42:04

Hi Leute,
Ich habe mal eine Frage die sich nicht direkt auf Debian bezieht als viel mehr auf Linux allgemein und auch GCC. Ich habe in der Uni gerade eine Vorlesung zum Thema Software Security und habe eine Frage bezgl. Format Strings. Wir haben einiges an Sample Code bekommen, allerdings funktioniert der nicht wirklich, nun meine Frage, hat Gcc 4.3 eine Moeglichkeit Applikationen davor zu schuetzen, dass Format Strings ausgenutzt werden? Oder ist die printf-Methode mitlerweile davor abgesichert einen unsicheren Aufruf zu machen wie z.B.:

Code: Alles auswählen

printf(string);
anstatt:

Code: Alles auswählen

printf("%s", string);
Ich hoffe jemand kann mir zu diesem Thema Aufschluss geben.
Danke schon mal

Mfg
Jester
Zuletzt geändert von Jester am 29.06.2010 15:20:56, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Format String Vulnerability

Beitrag von Meillo » 28.06.2010 13:39:12

Jester hat geschrieben: [...] hat Gcc 4.3 eine Moeglichkeit Applikationen davor zu schuetzen, dass Format Strings ausgenutzt werden?
Applikationen vor dem Programmierer zu schützen? In Sprachen wie C ist das sicher eine Illusion, denn da steht und fällt alles mit dem Programmierer.


Aber man könnte sicher in solchen Situationen eine Warning generieren lassen. (Gcc 4.3.5 sagt aber nichts; auch nicht wenn ein % im String enthalten ist.)
Use ed once in a while!

Jester
Beiträge: 23
Registriert: 05.06.2007 20:57:54

Re: Format String Vulnerability

Beitrag von Jester » 28.06.2010 13:53:03

Ok vielen Dank fuer die Antwort, ich dachte neuere GCC Versionen optimieren so Aufrufe vielleicht oder aehnliches.

Mfg
Jester

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Format String Vulnerability

Beitrag von gms » 29.06.2010 08:54:06

Meillo hat geschrieben: Aber man könnte sicher in solchen Situationen eine Warning generieren lassen. (Gcc 4.3.5 sagt aber nichts; auch nicht wenn ein % im String enthalten ist.)
kann man:

Code: Alles auswählen

gms@gms2 ~ $ gcc-4.3 -o x x.c -Wformat -Wformat-security
x.c: In function ‘main’:
x.c:2: warning: format not a string literal and no format arguments
gms@gms2 ~ $ echo -e "#include<stdio.h>\nint main() { long l=0; printf(\"%d\",l); return 0; }" >x.c
gms@gms2 ~ $ gcc-4.3 -o x x.c -Wformat -Wformat-security
x.c: In function ‘main’:
x.c:2: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long int’
gms@gms2 ~ $ 
manche Distributionen gehen auch dazu über, -Wformat-security und -D_FORTIFY_SOURCE=2 standardmäßig einzuschalten

z.B unter Gentoo:

Code: Alles auswählen

gms@gms1 ~ $ echo -e "#include<stdio.h>\nint main() { long l=0; printf(\"%d\",l); return 0; }" >x.c
gms@gms1 ~ $ gcc-4.3 -o x x.c
x.c: In Funktion »main«:
x.c:2: Warnung: format »%d« erwartet Typ »int«, aber Argument 2 hat Typ »long int«
gms@gms1 ~ $ echo -e "#include<stdio.h>\nint main() { char* buf; printf(buf); return 0; }" >x.c
gms@gms1 ~ $ gcc-4.3 -o x x.c
x.c: In Funktion »main«:
x.c:2: Warnung: Format ist kein Zeichenkettenliteral, und keine Formatargumente
gms@gms1 ~ $ 
siehe auch:
http://wiki.debian.org/Hardening

Gruß
gms

Jester
Beiträge: 23
Registriert: 05.06.2007 20:57:54

Re: Format String Vulnerability

Beitrag von Jester » 29.06.2010 09:23:23

Vielen Dank fuer die Antwort,
das habe ich auch gefunden, das der Compiler eine Nachricht ausgiebt. Aber irgendwie kommt es mir so vor als ob der Stack irgendwie geschuetzt werden wuerde. Aehnlich dem was http://de.wikipedia.org/wiki/Puffer%C3%BCberlauf im Abschnitt "4.3 Unterstuetzung durch Compiler" beschrieben wird. Aber eben auch fuer einzelne Variablen und nicht nur fuer den gesamten Stack Frame. Kann das sein?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Format String Vulnerability

Beitrag von gms » 29.06.2010 09:46:18

als Schutz gegen Pufferüberlauf werden hauptsächlich diese Features benutzt:

fstack-protector bzw fstack-protector-all ... soweit ich mich erinnere, ist das eine Implementierung von dem Stack Smashing Protector wie er auf der von dir geposteten Seite erwähnt wird
( wird normalerweise nur bei gehärteten Systemen und bei speziellen Diensten aktiviert )

und

-D_FORTIFY_SOURCE=2 ... damit werden statische Pufferüberläufe erkannt ( benötigt -O2 )

Aber irgendwie kommt es mir so vor als ob der Stack irgendwie geschuetzt werden wuerde.
hast du diesbezüglich ein Beispiel ?

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Format String Vulnerability

Beitrag von Meillo » 29.06.2010 10:09:02

gms hat geschrieben:
Meillo hat geschrieben: Aber man könnte sicher in solchen Situationen eine Warning generieren lassen. (Gcc 4.3.5 sagt aber nichts; auch nicht wenn ein % im String enthalten ist.)
kann man:

Code: Alles auswählen

gms@gms2 ~ $ gcc-4.3 -o x x.c -Wformat -Wformat-security
[...]
Da bin ich wohl darauf reingefallen, dass -Wall nicht, wie man vermuten würde, ``all Warnings'' bedeutet.
man gcc hat geschrieben: -Wformat is included in -Wall. For more control over some aspects of format checking, the options
-Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security,
and -Wformat=2 are available, but are not included in -Wall.
Use ed once in a while!

Jester
Beiträge: 23
Registriert: 05.06.2007 20:57:54

Re: Format String Vulnerability

Beitrag von Jester » 29.06.2010 15:20:39

Hi Meillo,
also vielen Dank ich habe die Loesung gefunden, ich war nur zu doof den Kram richtig anzuwenden, hier mal die Demo und wie sich C nicht dagegen wehren kann das von auszen Variablen veraendert werden... :twisted:

Code: Alles auswählen

/*test.c*/
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

int main(int argc, char *argv[]) { 
   char text[1024]; 
   static int test_val = -72; 
   if(argc < 2) { 
      printf("Usage: %s <text to print>\n", argv[0]); 
      exit(0); 
   } 
   strcpy(text, argv[1]); 
   printf("\nPrint User Input:\n"); 
   printf(text); 
   printf("\n");
   printf("[*] test_val @ 0x%08x = %d 0x%08x\n", &test_val, test_val,test_val); 
   exit(0); 
}

Code: Alles auswählen

Auruf:
$ ./fmt_vuln $(printf "\x70\x97\x04\x08")%08x%08x%08x%08x%n
Print User Input:
p�bfffe84d00000000bfffc560bfffc970
[*] test_val @ 0x08049770 = 36 0x00000024
Danke noch mal fuer deine Geduld.
edith: und auch fuer dein gms :wink:

Mfg
Jester
Zuletzt geändert von Jester am 29.06.2010 23:26:45, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Format String Vulnerability

Beitrag von Meillo » 29.06.2010 19:06:54

Jester hat geschrieben:Hi Meillo,

[...]

Danke noch mal fuer deine Geduld.
Der Dank gebührt gms.
Use ed once in a while!

Antworten