Format-Zeichenkette-Probleme
Formatzeichenketteprobleme sind einer der wenigen wirklich neuen Angriffe, zum in den letzten Jahren aufzutauchen. Eine der ersten Erwähnungen der Formatzeichenkettewanzen war an Juni 23, 2000, in einem Pfosten durch Lamagra Argamal (www.securityfocus.com/archive/1/66842); Pascal Bouchareine erklärte sie offenbar fast ein Monat später (www.securityfocus.com/archive/1/70552). Ein früherer Pfosten durch Mark Slemko (www.securityfocus.com/archive/1/10383) merkte die Grundlagen des Problems, aber vermißte die Fähigkeit der Formatzeichenkettewanzen, Gedächtnis zu schreiben. Wie mit vielen Sicherheit Problemen, vertraut die Wurzelursache der Formatzeichenkettewanzen user-supplied Eingang ohne Gültigkeitserklärung. In C/C++ können Formatzeichenkettewanzen benutzt werden, um zu den willkürlichen Gedächtnispositionen zu schreiben, und der gefährlichste Aspekt ist, daß dieser geschehen kann, ohne mit anliegenden Gedächtnisblöcken sich abzugeben. Diese feinkörnige Fähigkeit erlaubt einem Angreifer, Stapelschutze zu überbrücken und ändert sogar sehr kleine Teile des Gedächtnisses. Das Problem kann auch auftreten, wenn die Formatzeichenketten von untrusted Position gelesen werden, die der Angreifer steuert. Dieser letzte Aspekt des Problems neigt, auf UNIX und Linux Systemen überwiegender zu sein. Auf Windows Systemen werden Anwendung Zeichenkettetabellen im Allgemeinen innerhalb des vollziehbaren Programms oder Hilfsmittel der dynamischen Hauptbibliotheken (DLLs) gehalten. Wenn ein Angreifer das hauptsächlichvollziehbare oder das Hilfsmittel DLLs neu schreiben kann, kann der Angreifer viel mehr direkte Angriffe als Formatzeichenkettewanzen durchführen. Selbst wenn Sie’bezüglich des Beschäftigens nicht C/C++, Formatzeichenketteangriffe zu beträchtliche Probleme noch führen können. Das offensichtlichste ist, daß Benutzer irregeführt werden können, aber unter einigen Bedingungen, konnte ein Angreifer Kreuz-Aufstellungsort Scripting oder SQL Einspritzungangriffe auch ausstoßen. Diese können verwendet werden, um Daten außerdem zu verderben oder umzuwandeln. Betroffene SprachenDie am stärksten betroffene Sprache ist C/C++. Ein erfolgreicher Angriff kann zur Durchführung des beliebigen Codes und zu Informationen Freigabe sofort führen. Anderes Sprachen gewonnenes’t erlauben gewöhnlich die Durchführung des beliebigen Codes, aber andere Arten Angriffe sind möglich, wie wir vorher merken. Das Perl isn’t direkt verletzbar zu den Spezifikationselementen, die durch Benutzereingang, aber gegeben wurden, er konnten verletzbar sein, wenn die Formatzeichenketten innen von abgegebenen Daten gelesen werden. Die Sünde ErklärteFormatierung Daten für Anzeige oder Ablage können eine ein wenig schwierige Aufgabe sein. So schließen viele Computersprachen Programme ein, um Daten leicht zu umformatieren. In den meisten Sprachen werden die Formatierung Informationen mit irgendeiner Art einer Zeichenkette beschrieben, genannt die Formatzeichenkette. Die Formatzeichenkette wird wirklich mit begrenzter datenverarbeitender Sprache definiert, daß’s entwarf, sie einfach zu bilden, Ausgang Formate zu beschreiben. Aber viele Entwickler machen einen einfachen Fehler, den—sie Daten von untrusted Benutzer als die Formatzeichenkette verwenden. Infolgedessen können Angreifer Zeichenketten in die datenverarbeitende Sprache schreiben, um viele Probleme zu verursachen. Das Design von C/C++ bildet dieses besonders gefährliche: C/C++’s Design bildet es härter, Formatzeichenketteprobleme zu ermitteln, und Formatzeichenketten schließen einige besonders gefährliche Befehle ein (besonders %n) die nicht in einigen anderen Sprachenformat-’ Zeichenkettesprachen bestehen. In C/C++ kann eine Funktion erklärt werden, um eine variable Anzahl von Argumenten, indem man einen Ellipsis () als…das letzte (oder nur) Argument zu nehmen spezifiziert. Das Problem ist, daß die Funktion, die benannt wird, keine Weise hat, zu wissen, gerade wieviele Argumente innen geführt werden. Der allgemeinste Satz der Funktionen, zum von von variable Länge Argumenten zu nehmen ist die printf Familie: printf, sprintf, snprintf, fprintf, vprintf und so weiter. Breite Buchstabe Funktionen, die die gleiche Funktion durchführen, haben das gleiche Problem. Lassen Sie’s Nehmen ein Blick an einer Abbildung: # schließen Sie < stdio.h > mit ein internes main(int argc, Putzfrau * argv[ ]) Rückkehr 0; Ziemlich einfaches Material. Lassen Sie jetzt’s, was betrachten falsch gehen kann. Der Programmierer erwartet den Benutzer, einzutragen gutartiges etwas, wie hallo Welt. Wenn Sie ihm einen Versuch geben, bekommen’Sie ll hallo Welt zurück. Lassen Sie jetzt’s Änderung der Eingang wenig—Versuch %x %x. Auf einem Windows.xp System mit der Rückstellung Befehl Linie (cmd.exe), erhalten’Sie ll jetzt das folgende: E:\projects\19_sins\format_bug>format_bug.exe "%x %x" Merken Sie, daß wenn Sie’bezüglich des Laufen lassens eines anderen Betriebssystems oder eine andere Befehl Linie Interpret benutzen, können Sie etwas Änderungen vornehmen müssen, um diese genaue Zeichenkette zu erhalten eingezogen in Ihr Programm, und die Resultate sind wahrscheinlich unterschiedlich. Für Benutzerfreundlichkeit konnten Sie die Argumente in einen Oberteilindex oder in eine Reihe Akte setzen. Was geschah? Die printf Funktion nahm eine Eingang Zeichenkette, die sie veranließ, zwei Argumente zu erwarten, auf den Stapel vor dem Benennen der Funktion gedrückt zu werden. Die %x Spezifikationselemente ermöglichten Ihnen, den Stapel, vier Bytes, bis zu Ihnen hintereinander zu lesen’d wie. Es isn’t stark, zum sich vorzustellen, daß, wenn Sie eine kompliziertere Funktion hatten, die ein Geheimnis in einer Stapelvariable speicherte, der Angreifer dann sein würde, das Geheimnis zu lesen. Der Ausgang hier ist die Adresse der Stapelposition (0x12ffc0), gefolgt von der Codeposition, die die main() Funktion in zurückgeht. Wie Sie sich vorstellen können, sind beide von diesen extrem wichtige Information, die zu einem Angreifer ausgelaufen werden. Sie können jetzt sich wundern, gerade wie der Angreifer eine Formatzeichenkettewanze benutzt, um Gedächtnis zu schreiben. Eins der wenigen verwendeten Formatspezifikationselemente ist %n, das die Zahl Buchstaben schreibt, die in die Adresse der Variable bis jetzt geschrieben worden sein sollten, die, Sie als das entsprechende Argument gaben. Hier’s, wie es verwendet werden sollte: nicht unterzeichnete interne Bytes; Der Ausgang würde sein: E:\projects\19_sins\format_bug>format_bug2.exe "etwas gelegentlicher Eingang" Etwas gelegentlicher Eingang Ihr Eingang war 17 lange Buchstaben Auf einer Plattform mit four-byte Ganzzahlen, schreibt das %n Spezifikationselement vier Bytes sofort, und %hn schreibt zwei Bytes. Jetzt müssen Angreifer aus, wie man nur darstellen der Adresse sie d’wie in der passenden Position im Stapel erhält und zwicken die auffangenbreite Spezifikationselemente, bis die Zahl den Bytes geschrieben ist, was sie’d mögen. Für jetzt lassen Sie’s gerade annehmen, daß, wenn Sie Angreifern erlauben, die Formatzeichenkette in einem C/C++ Programm zu steuern, es ein Frage der Zeit ist, bevor sie darstellen aus, wie man Sie ihren Code laufen lassen läßt. Ein besonders böser Aspekt dieser Art des Angriffs ist der, bevor er den Angriff ausstößt, können sie den Stapel prüfen und den Angriff schnell beheben. Tatsächlich das erste mal der Autor diesen Angriff in der Öffentlichkeit demonstrierte, verwendete er eine andere Befehl Linie Interpret als er’d, das verwendet wurde, um die Demonstration zu verursachen, und sie didn’t Arbeit. Wegen der einzigartigen Flexibilität dieses Angriffs, war es möglich, das Problem zu beheben und das Anwendungsbeispiel mit dem Publikum Aufpassen auszunutzen. Die meisten anderen Sprachen ziehen’t Unterstützung das Äquivalent eines %n Formatspezifikationselements an, und sie aren’t direkt, das zur einfachen Durchführung des Angreifer-gelieferten Codes verletzbar ist, aber Sie können ruhiger Durchlauf in Probleme. Es gibt anderes, kompliziertere Varianten auf diesem Angriff, daß andere Sprachen zu verletzbar sind. Wenn Angreifer eine Formatzeichenkette für Ausgang zu einer Maschinenbordbuchakte oder -datenbank spezifizieren können, können sie die falschen oder irreführenden Maschinenbordbücher verursachen. Zusätzlich kann die Anwendung, welche die Maschinenbordbücher liest, sie für verläßlichen Eingang und sobald diese Annahme verletzt wird, Schwächen dadurch halten, daß Anwendung’s grammatische Definition zu Durchführung des beliebigen Codes führen kann. Ein in Verbindung stehendes Problem bettet Steuerzeichen in den Maschinenbordbuchakten ein, die—Rückschritte benutzt werden können, um Sachen zu löschen; zeichnen Sie Abschlußwiderstände kann obfuscate oder sogar die Spuren des Angreifers’s beseitigen. Dieses sollte gehen, ohne zu sagen, aber, wenn ein Angreifer die Formatzeichenkette spezifizieren kann, die zum scanf oder zu den ähnlichen Funktionen eingezogen wird, ist Unfall auf der Weise. Sinful C/C++Anders als viele andere Fehler überprüfen’wir ll, dieses sind ziemlich einfach, als Codedefekt zu beschmutzen. Es’s sehr einfach: printf(user_input); printf("%s", user_input); Eine Variante auf dem Problem, das Vernachlässigung vieler Programmierer ist, daß es nicht genügend ist, dies richtig zu tun nur einmal. Es gibt eine Anzahl von allgemeinem Codekonstruieren, in dem Sie sprintf benutzen konnten, um eine formatierte Zeichenkette in einen Puffer zu setzen, und gleitet dann oben und tut dies: fprintf(STDOUT, err_msg); In Verbindung stehende SündenObgleich der offensichtlichste Angriff mit einem Codedefekt zusammenhängt, ist es allgemeines üblich, Anwendung Zeichenketten in externe Akten zu den Internationalisierung Zwecken einzusetzen. Wenn Ihre Anwendung sinned hat, indem sie die Akte richtig schützen nicht kann, dann ein Angreifer Formatzeichenketten wegen eines Mangels an korrektem Akte Zugang liefern kann. Eine andere in Verbindung stehende Sünde kann Benutzereingang richtig validieren nicht. Auf einigen Systemen spezifiziert eine Klimavariable die Schauplatzinformationen, und der Schauplatz stellt der Reihe nach das Verzeichnis fest, in dem sprachspezifische Akten gefunden werden. Auf einigen Systemen konnte der Angreifer die Anwendung sogar veranlassen, in den willkürlichen Verzeichnissen zu schauen. Beschmutzen des Sünde MustersJede mögliche Anwendung, die Benutzer eingeben nimmt und Durchläufe ist es zu einer Formatierung Funktion möglicherweise an der Gefahr. Ein sehr allgemeiner Fall dieser Sünde geschieht in Verbindung mit Anwendungen, die Benutzereingang loggen. Zusätzlich können einige Funktionen innerlich formatieren einführen. Beschmutzen der Sünde während des Schreibtischtests für ein ProgrammIn C/C++ suchen Sie nach Funktionen von der printf Familie. Zu suchen die Probleme sind printf(user_input); Wenn Sie eine Funktion sehen, die wie dieses aussieht: fprintf(STDOUT, msg_format, arg1, arg2); dann Sie Notwendigkeit, zu überprüfen, wo die Zeichenkette, die durch msg_format bezogen wird, gespeichert wird und wie gut es geschützt werden. Es gibt viele andere System Anrufe und APIs, das auch verletzbarer syslog—sind, ist ein Beispiel. Immer wenn Sie eine Funktion Definition sehen, die … in der Argumentliste einschließt, Sie’bezüglich des Betrachtens etwas, das wahrscheinlich ist, ein Problem zu sein. Viele Quellenprogrammscanner, sogar die lexikalischen mögen RATTEN und flawfinder, kann dieses ermitteln. Dort’s gleichmäßiges PScan (www.striker.ottawa.on.ca/~aland/pscan/), das spezifisch für dieses bestimmt war. Widersprechen auch Werkzeugen, die in den Kompilation Prozeß errichtet werden können. Z.B. dort’s Crispin Cowan’s FormatGuard: http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html Prüfung Techniken, zum der Sünde zu findenFühren Sie Formatierung Spezifikationselemente in die Anwendung und sehen Sie, wenn hexadezimale Werte zurückgebracht werden. Z.B. wenn Sie eine Anwendung haben, die einen Dateinamen erwartet und eine Fehlermeldung zurückbringt, die den Eingang enthält, wenn die Akte nicht gefunden werden kann, dann nennt der Versuch, der ihm Akte gibt, wie NotLikely%x%x.txt. Wenn Sie eine Fehlermeldung entlang den Linien von "erhalten, NotLikely12fd234104587.txt kann nicht gefunden werden," dann Sie haben gefunden gerade eine Formatzeichenketteverwundbarkeit. Dieses ist offensichtlich ein wenig sprachabhängig; Sie sollten in die Formatierung Spezifikationselemente überschreiten, die durch die Implementierungssprache Sie bezüglich mindestens’verwenden verwendet werden. Jedoch da viele Sprachenlaufzeiten in C/C++ eingeführt werden, sind’Sie d klug, in C/C++ Formatierung Zeichenkettebefehle auch zu senden, Fälle zu ermitteln, in denen Ihre zugrundeliegende Bibliothek eine gefährliche Verwundbarkeit hat. Merken Sie, daß, wenn die Anwendung das Netz ist, das gegründet wird und Ihren Benutzer widerhallt, der zurück zu Ihnen eingegeben wird, ein anderes Interesse Kreuz-Aufstellungsort scripting Angriffe sein würde Beispiel-SündenDie folgenden Eintragungen in der allgemeinen Verwundbarkeit und in den Belichtungen (CVE) an http:// cve.mitre.org sind Beispiele der SQL Einspritzung. Aus den 188 CVE Eintragungen heraus, die Bezugsformatzeichenketten, diese ein Musterstück gerecht ist. CVE-2000-0573Von der CVE Beschreibung: “Die lreply Funktion in wu-ftpd 2.6.0 und früheres nicht richtig reinigt untrusted Formatzeichenkette, die Remoteangreifern erlaubt, willkürliche Befehle über den Befehl des AUFSTELLUNGSORTES EXEC durchzuführen.” Dieses ist die erste öffentlich bekannte Großtat für eine Formatzeichenkettewanze. Der Titel dem BUGTRAQ Pfosten unterstreicht die Schwierigkeit des Problems: “Zur Verfügung stellen * Direktübertragung * verwurzeln Sie seit 1994 mindestens.” CVE-2000-0844Von der CVE Beschreibung: “Einige Funktionen, die das Schauplatzuntersystem auf UNIX einführen, nicht richtig reinigen Benutzer-eingespritzte Formatzeichenketten, das lokalen Angreifern erlaubt, willkürliche Befehle über Funktionen wie gettext durchzuführen und catopen.” Das Ganztext vom ursprünglichen beratenden kann an www.securityfocus.com/archive/1/80154 gefunden werden, und dieses Problem ist besonders interessant, weil es Kernsystem APIs für die meisten UNIX Varianten (einschließlich Linux) beeinflußt, außer den Bd Varianten wegen der Tatsache, daß die NLSPATH Variable für privilegierte suid Anwendung in Bd ignoriert wird. Dieses beratende, wie viele KERN SDI advisories, ist besonders wohles geschrieben und informativ und gibt eine sehr vollständige Erklärung des gesamten Problems Abzahlung-SchritteDer erste Schritt ist nie der Durchlaufbenutzer, der direkt zu einer Formatierung Funktion eingegeben wird, und ist auch sicher, dies auf jedem Niveau der Behandlung des formatierten Ausganges zu tun. Als zusätzliche Anmerkung haben die Formatierung Funktionen bedeutende Unkosten. Betrachten Sie die Quelle nach _ ausgegeben, wenn Sie’bezüglich interessierten—es bequem sein konnten zu schreiben: fprintf(STDOUT, buf); Die vorhergehende Linie des Code isn’t gerade gefährlich, aber es verbrauchen auch eine Menge Extra-CPU Zyklen. Der zweite Schritt zum zu nehmen ist, sicherzugehen, daß die Formatzeichenketten Ihr Anwendung Gebrauch nur von verläßlichen Plätzen gelesen werden und daß die Wege zu den Zeichenketten nicht durch den Angreifer gesteuert werden können. Wenn Sie’bezüglich des Schreiben Codes für UNIX und Linux, nach dem Beispiel der des Bd Varianten und Ignorierens der NLSPATH Variable, die verwendet werden kann, um die Akte zu spezifizieren, für beschränkte Anzeigen verwendeten, können etwas eingehende Verteidigung zur Verfügung stellen. C/C++ AbzahlungDort isn’t viel mehr zu ihm als dieses: printf("%s", user_input);
Defensive ExtramasseÜberprüfen Sie und begrenzen Sie den Schauplatz auf gültige Werte. (zu mehr Information, sehen Sie David Wheeler’s “, es zu schreiben sicher: Formatieren Sie Zeichenketten und die Schauplatz-Entstörung, die” nachstehend im “anderen Betriebsmittel-” Abschnitt aufgeführt wird). Ziehen Sie’t Gebrauch die Printffamilie von Funktionen an, wenn Sie sie vermeiden können. Z.B. wenn Sie’bezüglich C++, Gebrauchstromoperatoren anstatt verwenden: # schließen Sie < iostream > ein Andere Betriebsmittel
dieses ist ein Artikel, der von Hendra Fang
hinzugefügt wird
|
|||
|