Am Freitag, 7. Januar 2005 23:58 schrieb Werner Schalk:
Euch ist schon klar, dass das Programm ne astreine root-Vulnerability enthält, oder?
char bigpointer[1024];
int main (int argc, char *argv[]) { int i;
strcat (bigpointer, "/sbin/rcnetwork restart ");
Schon das hier ist gefährlich. Du kannst nicht davon ausgehen, dass bigpointer mit 0 initialisiert ist (beim gcc mags funktionieren, aber das ist keineswegs ein Fakt auf den man sich verlassen darf). Besser strcpy (noch besser strncpy, hier kann man drauf verzichten, weil die Längen vom Puffer und vom char* bekannt sind).
for (i=1;i
Der Puffer für bigpointer wird überlaufen, wenn die Anzahl der Kommandozeilenparameter >1024 ist (ab ca. 1090) und schon gibts nen Buffer Overflow. Mit suid-Berechtigung ist das der perfekte lokale root-Exploit. Danke.
Und das ist noch das kleinere Übel (dem man mit sauberer Längenprüfung begegnen kann). Aber man kann das Ding viel einfacher ausnutzen: Rufe das Programm doch mal so auf: programm parameter1 \; rm -rf / Da keinerlei Prüfungen der Argumente durchgeführt werden, führt der system()-call einfach die Kommandos /sbin/rcnetwork restart parameter1; rm -rf / nacheinander aus. Ein Abfangen solcher (und anderer) Übel ist deutlich aufwändiger. Mit: programm parameter1 \; /bin/bash hast Du gleich ne root-Shell. Ich habe den Thread nicht verfolgt, aber sudo ist doch sicher schon genannt worden, oder? Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org