C++ Sicher programmieren
-
Du kannst JEDEN befehl in das Programm einspeisen und somit mit dem Rechner machen was du willst.
Stell dir mal vor du bist der (böse) User, sitzt an dem Rechner, aber hast keine Adminrechte, kannst demnach nichts kaputtmachen (nehmen wir mal an). Jeetzt startet das Programm aber im Adminmodus (weil es diese Rechte an anderer Stelle braucht und auch so eignerichtet ist, ok) und du bekommst somit als eigentlich nicht berechtigter User die volle Kontrolle über den Rechner und kannst ihn kaputtmachen.
Der Fehler liegt erstens darin system zu nutzen
und zweitens darin, eigegebene Daten ohne Prüfung weiter zu geben und darauf aufzubauen.Nächstes Beispiel:
int main() { char buf[100]; cin.getline(buf, 100); return 0; }Was ist damit?
Was kann passieren?
Wo liegt der Fehler?
-
Das ist aber grenzwertig ob das überhaupt ein Fehler ist. Jeden Befehl mit Adminrechten ausführen zu können kann auch ein Feature sein, man denke an ein Programm für Remote-Login, wo der Nutzer womöglich sogar ein Admin ist.
Ich will auch mal ein Programm in den Raum werfen: format. Formatiert einen Datenträger. Ist das Programm gefährlich? Nützlich? Das hat mit C++ und allgemein Programmierung überhaupt nichts mehr zu tun.
-
Aber sowas sind Sicherheitslücken.
Wenn hier einer von den Webprogrammierern ist, die können da auch en Lied von singen. So SQL-Injections und sowas...
Letztlich gehört das aber alles zum sauberen Programmieren und Software-Designen dazu.
-
Nächstes Beispiel:
int main() { char buf[100]; cin.getline(buf, 100); return 0; }Was ist damit?
Was kann passieren?
Wo liegt der Fehler?Keine Ahnung. Kann es sein das buf nicht initialisiert ist, wenn der Benutzer nichts eingibt?
Ich will auch mal ein Programm in den Raum werfen: format. Formatiert einen Datenträger. Ist das Programm gefährlich? Nützlich? Das hat mit C++ und allgemein Programmierung überhaupt nichts mehr zu tun.
Manche sagen dass die Entwicklung sicherer System eine Design Frage ist.
-
knivil schrieb:
Nicht alles, was hinkt, ist auch ein Vergleich.
Und mir geht es eher hierdrum:
sry schrieb:
knivil schrieb:
Deswegen gibt es keine C, C++ oder Java spezifischen Fehler.
So ein Quatsch.
Willst du einen Fehler den man nur in C++ machen kann? Falsche Reihenfolge/Abhängigkeit in Header/Initialisierungsliste.
Willst du einen Vergleich der so hinkt wie deiner? Ich kann in C++ auch langsame Programme schreiben, also ist C++ nicht schneller als Java.
-
Nächstes Beispiel:
int main() { char buf[100]; cin.getline(buf, 100); return 0; }Was ist damit?
Was kann passieren?
Wo liegt der Fehler?Die Unschönheit besteht darin, dass evt. nicht alle Zeichen gelesen werden können.
Aber einen direkten Fehler hat das Programm nicht.
-
Bitte ein Bit schrieb:
Nächstes Beispiel:
int main() { char buf[100]; cin.getline(buf, 100); return 0; }Was ist damit?
Was kann passieren?
Wo liegt der Fehler?Keine Ahnung. Kann es sein das buf nicht initialisiert ist, wenn der Benutzer nichts eingibt?
Das kommt drauf an, wie du mit den Daten weiterarbeitest.
Nein, worauf ich hinaus will ist der Buffer-Overflow. Ein Häcker könnte mehr als 100 zeichen eingeben und damit auf dem Stack Speicher weiterschreiben. Und wenn er weiss, was er tut, dann kann er nicht Müll dareinschreiben, sodnern z.B. spezielle Daten, die dann bei entsprechender Größe die Rücksprungadresse einer Funktion überschreiben -> ergo kann er den Programmfluss umlenken udn aht damit die Kontrolle über dein Programm.
Es ist dabei auch egal wie groß der Puffer ist, egal ob 10, 100 oder 1000000430. Der böse Cracker muss halt nur die Größe durch probieren rausfinden und kann dahinter dann seine Daten schreiben.Bitte ein Bit schrieb:
Ich will auch mal ein Programm in den Raum werfen: format. Formatiert einen Datenträger. Ist das Programm gefährlich? Nützlich? Das hat mit C++ und allgemein Programmierung überhaupt nichts mehr zu tun.
Manche sagen dass die Entwicklung sicherer System eine Design Frage ist.
Ja, das stimmt auch zum großen Teil. Aber wenn du einen HDD-Formatierer schreibst, dann willst du ja Schaden anrichten, nur soll dieser gewollt und kontrolliert sein

-
Skym0sh0 schrieb:
Das kommt drauf an, wie du mit den Daten weiterarbeitest.
Nein, worauf ich hinaus will ist der Buffer-Overflow. Ein Häcker könnte mehr als 100 zeichen eingeben und damit auf dem Stack Speicher weiterschreiben.Nein, dazu hast du doch die 100 als Begrenzung beim getline. getline ist kein gets. Deine Beispiele sind allesamt etwas ungünstig, das mit dem system gefiel mir auch nicht, denn da geht es offensichtlich darum, etwas auszuführen.
Viel subtiler sind solche Fehler, bei denen Eingaben nicht geprüft werden, weil dem Programmierer nicht klar ist, dass ein Fehler passieren kann. In C++ ist es schon schwierig dies an einem einfachen Programm zu demonstrieren, aber in C kann ein harmlos aussehender Dreizeiler reichen:
char buf[100]; fgets(buf, 100, stdin); printf("Folgendes wurde eingegeben: "); printf(buf);Sieht alles richtig aus? Ist es aber nicht.
So etwas wäre im Prinzip auch in C++ möglich, wenn man Nutzereingaben ungefiltert an eine entsprechend mächtige Funktion schickt. Das ist auch der Exploit den du mit dem system zeigen wolltest, aber da ist es zu offensichtlich. Dies ist auch der Fehler hinter so Dingen wie SQL-Injections & Co.
-
SeppJ schrieb:
Dies ist auch der Fehler hinter so Dingen wie SQL-Injections & Co.
Mit PreparedStatement geht SQL-Injections auch nicht mehr.
http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html
-
Ist es aber nicht.
Es ist völlig offensichtlich, dass der Nutzer ein '%' mitgeben kann, das sieht doch jeder.
P.S.: Jeder C++-Programmierer weiß, dass man in C für die unformatierte Ausgabe von Strings puts verwendet.
-
In C++ ist es schon schwierig dies an einem einfachen Programm zu demonstrieren, aber in C kann ein harmlos aussehender Dreizeiler reichen:
Ich liefere den Einzeiler nach:
int i; while (!(std::cout << "Eingabe: ", std::cin >> i)); std::cout << i;Sieht alles richtig aus? Ist es aber nicht.
DOS ftw.
-
while (!(std::cout << "Eingabe: ", std::cin >> i));Der ist gut!
