/* Das Set-Uid-Root Bit muss gesetzt sein. * Die Passwörter sind in /etc/Passworte im * Zeilenformat "user-id:passwort". */ #include #include #include int main(void) { char pwd[9], suche[99], zeile[99]; uid_t uid; FILE *df; /* Datenbank öffnen */ df = fopen("/etc/Passworte", "r+"); /* Zur Vorsicht: Datenpufferung aus */ setvbuf(df, 0, _IONBF, 0); /* Uid und Passwort einlesen */ printf("\nBitte User-Id eingeben : "); fscanf(stdin, "%d", &uid); printf("Bitte Passwort eingeben: "); fscanf(stdin, "%8s", pwd); /* Eintrag in der Datenbank suchen */ sprintf(suche, "%d:%s", uid, pwd); while (1) { /* Zeilenweise suchen */ if (fscanf(df, "%98s", zeile) != 1) { exit(1); /* Dateiende */ } if (strcmp(zeile, suche) == 0) { break; /* gefunden */ } } setreuid(uid, uid); /* Root abgeben */ execl("/bin/Skript", 0); /* starten */ return 255; } /* Versteckte Probleme aus der Umgebung: * * 1. /etc/Passworte wird als Root geöffnet, aber nicht geschlossen. Das * Programm /bin/Skript erbt den Dateideskriptor und hat dann alle Rechte. * 2. Falls stdout beim Aufruf geschlossen ist, bekommt df dessen Deskriptor. * printf() überschreibt dann die Datei. * 3. Umgebungsvariablen werden nicht gelöscht. Angenommen /bin/Skript ist ein * bash Skript. Setzt ein Angreifer die Variable BASH_ENV auf ein anderes * Skript, führt die bash dieses aus, bevor /bin/Skript abläuft. */