Sichere Codierung - Secure coding
Sichere Codierung ist die Praxis - Computer zu entwickeln Software in einer Weise , dass schützt vor unbeabsichtigten Einführung von Sicherheitslücken . Defekte, Bugs und Logikfehler sind durchweg die Hauptursache für häufig ausgenutzte Softwareschwachstellen. Durch die Analyse von Tausenden von gemeldeten Schwachstellen haben Sicherheitsexperten festgestellt, dass die meisten Schwachstellen auf eine relativ kleine Anzahl häufiger Softwareprogrammierungsfehler zurückzuführen sind. Durch die Identifizierung der unsicheren Codierungspraktiken, die zu diesen Fehlern führen, und die Schulung von Entwicklern zu sicheren Alternativen, können Unternehmen proaktive Schritte unternehmen, um Sicherheitslücken in der Software vor der Bereitstellung deutlich zu reduzieren oder zu beseitigen.
Pufferüberlaufsicherung
Pufferüberläufe , eine häufige Sicherheitslücke in Software, treten auf, wenn ein Prozess versucht, Daten über einen Puffer mit fester Länge hinaus zu speichern. Wenn beispielsweise 8 Fächer zum Lagern von Gegenständen vorhanden sind, tritt ein Problem auf, wenn versucht wird, 9 Gegenstände zu lagern. Im Computerspeicher können die übergelaufenen Daten Daten an der nächsten Stelle überschreiben, was zu einer Sicherheitslücke (Stack-Smashing) oder Programmabbruch (Segmentierungsfehler) führen kann.
Ein Beispiel für ein C- Programm, das anfällig für einen Pufferüberlauf ist, ist
int vulnerable_function(char * large_user_input) {
char dst[SMALL];
strcpy(dst, large_user_input);
}
Wenn die Benutzereingabe größer als der Zielpuffer ist, tritt ein Pufferüberlauf auf. Um dieses unsichere Programm zu beheben, verwenden Sie strncpy, um einen möglichen Pufferüberlauf zu verhindern.
int secure_function(char * user_input) {
char dst[BUF_SIZE];
// copy a maximum of BUF_SIZE bytes
strncpy(dst, user_input, BUF_SIZE);
}
Eine weitere sichere Alternative ist die dynamische Speicherzuweisung auf dem Heap mithilfe von malloc .
char * secure_copy(char * src) {
size_t len = strlen(src);
char * dst = (char *) malloc(len + 1);
if (dst != NULL) {
strncpy(dst, src, len);
// append null terminator
dst[len] = '\0';
}
return dst;
}
Im obigen Code-Schnipsel versucht das Programm, den Inhalt von src nach dst zu kopieren, während es gleichzeitig den Rückgabewert von malloc überprüft, um sicherzustellen, dass genügend Speicher für den Zielpuffer reserviert werden konnte.
Verhinderung von Format-String-Angriffen
Ein Format-String-Angriff liegt vor, wenn ein böswilliger Benutzer bestimmte Eingaben bereitstellt, die schließlich als Argument in eine Funktion eingegeben werden, die eine Formatierung durchführt, z. B. printf() . Der Angriff beinhaltet, dass der Gegner vom Stack liest oder auf ihn schreibt .
Die C printf-Funktion schreibt die Ausgabe nach stdout. Wenn der Parameter der printf-Funktion nicht richtig formatiert ist, können mehrere Sicherheitsfehler eingeführt werden. Unten sehen Sie ein Programm, das anfällig für einen Format-String-Angriff ist.
int vulnerable_print(char * malicious_input) {
printf(malicious_input);
}
Ein bösartiges Argument, das an das Programm übergeben wird, könnte „%s%s%s%s%s%s%s“ lauten, das das Programm aufgrund falscher Speicherlesevorgänge zum Absturz bringen kann.
Integer-Überlaufverhinderung
Ganzzahlüberlauf tritt auf, wenn eine arithmetische Operation zu einer Ganzzahl führt, die zu groß ist, um innerhalb des verfügbaren Platzes dargestellt zu werden. Ein Programm, das nicht richtig auf Integer-Überlauf prüft, führt potenzielle Softwarefehler und Exploits ein.
Unten ist eine Funktion in C++, die versucht zu bestätigen, dass die Summe von x und y kleiner oder gleich einem definierten Wert MAX ist:
bool sumIsValid_flawed(unsigned int x, unsigned int y) {
unsigned int sum = x + y;
return sum <= MAX;
}
Das Problem mit dem Code besteht darin, dass er bei der Additionsoperation nicht auf Ganzzahlüberlauf überprüft. Wenn die Summe von x und y größer als der maximal mögliche Wert von an ist unsigned int, läuft die Additionsoperation über und führt möglicherweise zu einem Wert kleiner oder gleich MAX, obwohl die Summe von x und y größer als MAX ist.
Unten ist eine Funktion, die auf Überlauf prüft, indem sie bestätigt, dass die Summe größer oder gleich sowohl x als auch y ist. Bei einem Überlauf der Summe wäre die Summe kleiner als x oder kleiner als y.
bool sumIsValid_secure(unsigned int x, unsigned int y) {
unsigned int sum = x + y;
return sum >= x && sum >= y && sum <= MAX;
}
Pfadüberschreitungsprävention
Path Traversal ist eine Schwachstelle, bei der Pfade, die von einer nicht vertrauenswürdigen Quelle bereitgestellt werden, so interpretiert werden, dass ein unbefugter Dateizugriff möglich ist.
Stellen Sie sich beispielsweise ein Skript vor, das einen Artikel abruft, indem es einen Dateinamen verwendet, der dann vom Skript gelesen und analysiert wird . Ein solches Skript könnte die folgende hypothetische URL verwenden, um einen Artikel über Hundefutter abzurufen :
https://www.example.net/cgi-bin/article.sh?name=dogfood.html
Wenn das Skript keine Eingabeprüfung hat und stattdessen darauf vertraut, dass der Dateiname immer gültig ist, könnte ein böswilliger Benutzer eine URL fälschen, um Konfigurationsdateien vom Webserver abzurufen:
https://www.example.net/cgi-bin/article.sh?name=../../../../../etc/passwd
Je nach Skript kann dies die Datei /etc/passwd exponieren , die auf Unix-ähnlichen Systemen (unter anderem) Benutzer-IDs , ihre Login-Namen , Home-Verzeichnispfade und Shells enthält . (Siehe SQL-Injection für einen ähnlichen Angriff.)
Siehe auch
Anmerkungen
Verweise
- Taylor, Kunst; Brian Büge; Randy Layman (2006). Hacken von exponiertem J2EE und Java . McGraw-Hill-Primis. P. 426. ISBN 0-390-59975-1.