2009-06-24 11 views
1

Ich verwende IIRF - ein ISAPI-Filter für pretty URLs umschreiben. Ich konnte nicht viel Hilfe vom Entwickler zu diesen Problemen bekommen. Ich hoffe, dass ich mir einen Eindruck von diesem Dump verschaffe, damit ich den problematischen Bereich im Code finden und ihn selbst wieder aufbauen kann. Ich bin mit C nicht sonderlich vertraut, kann aber umgehen. Muss ich das mit Debug-Symbolen erstellen, um nützliche Informationen aus dem Speicherauszug zu erhalten?Stack-Überlauf in IIRF (ein C-Programm, ISAPI)

Diese Stapelüberlauf-Ausnahmen finden auf unserem Live-Produktions-Webserver statt. Daher kann ich den Debug-Modus nicht verwenden, um in diesen Code zu gelangen. Was geschieht, ist meine Anwendungspoolprozesse (w3wp.exe), um dieses Fehlerereignis erhalten:

Ein Prozess für Anwendungspool ‚dotNET Pool‘ erlitt einen tödlichen Kommunikationsfehler mit dem World Wide Web-Publishing-Dienst. Die Prozess-ID war "6924". Das Datenfeld enthält die Fehlernummer.

Kann mir jemand helfen, diese Daten zu verstehen? Es ist ein Speicherauszug aus dem IIS Debug Diagnostic Tool. Wie interpretiere ich es und finde die Quelle der Ausnahme? Es scheint eine Ausnahme innerhalb der regulären PCRE-Expressions-Bibliothek von Drittanbietern zu sein.

WARNING - DebugDiag was not able to locate debug symbols for IsapiRewrite4.dll, so the information below may be incomplete.

In w3wp__PID__3760__Date__06_23_2009__ Time_01_29_55PM__916__Second_Chance_Exception_C00000FD.dmp the assembly instruction at IsapiRewrite4!pcre_exec+12f9 in C:\IIRF1.2.15R5\IsapiRewrite4.dll has caused a stack overflow exception (0xC00000FD) when trying to write to memory location 0x00fc2be8 on thread 5

 
Type of Analysis Performed Crash Analysis 
Machine Name WEB 
Operating System Windows Server 2003 Service Pack 2 
Number Of Processors 4 
Process ID 8056 
Process Image c:\WINDOWS\system32\inetsrv\w3wp.exe 
System Up-Time 0 day(s) 09:26:25 
Process Up-Time 0 day(s) 02:17:00 

Thread 4 - System ID 6624 
Entry point w3tp!THREAD_MANAGER::ThreadManagerThread 
Create time 6/23/2009 11:12:56 AM 
Time spent in user mode 0 Days 0:0:40.906 
Time spent in kernel mode 0 Days 0:0:6.312 

Function       Arg 1  Arg 2  Arg 3  Source 
IsapiRewrite4!pcre_exec+12f9  08166a27  01b6741f  081669b8  
IsapiRewrite4!pcre_exec+2779  08166a27  01b6746b  081669b8  
IsapiRewrite4!pcre_exec+1660  08166a26  01b6741f  081669b8  
IsapiRewrite4!pcre_exec+2779  08166a26  01b6746b  081669b8  
IsapiRewrite4!pcre_exec+1660  08166a25  01b6741f  081669b8  
IsapiRewrite4!pcre_exec+2779  08166a25  01b6746b  081669b8  
IsapiRewrite4!pcre_exec+1660  08166a24  01b6741f  081669b8  
IsapiRewrite4!pcre_exec+2779  08166a24  01b6746b  081669b8  
IsapiRewrite4!pcre_exec+1660  08166a23  01b6741f  081669b8  
IsapiRewrite4!pcre_exec+2779  08166a23  01b6746b  081669b8  
IsapiRewrite4!pcre_exec+1660  08166a22  01b6741f  081669b8  
[...snip...] 


Update zu diesem Debug-Prozess

Ich glaube, dass ich die Schuldigen gefunden zu haben, nachdem sie die IIS Debug Diagnostic Tools Tweaking weitere Informationen zur Verfügung zu stellen, ich habe URLs gefunden wie folgende. Es scheint einem SQL Injection Angriff ähnlich zu sein, aber ich glaube nicht, SQL Injection zu sein.

[original_url]/Forum+Result:+%E8%F1%EF%EE%EB%FC%E7%EE%E2%E0%ED+%ED%E8 %EA%ED%E5%E9%EC+%22Rifsadasy%22;%EF%E8%EA%F2%EE%EA%EE%E4+%E4%E5%F8%E8 %F4%F0%EE%E2%E0%ED;%E7%E0%F0%E5%E3%E8%F1%F2%F0%E8%F0%EE%E2%E0%EB%E8%F1 %FC+100%25+%28%E2%EA%EB%FE%F7%E5%ED+%F0%E5%E6%E8%EC+%F2%EE%EB%FC%EA%EE +%F0%E5%E3%E8%F1%F2%F0%E0%F6%E8%E8%29;

Hat jemand diese Art von Angriff gesehen? Wissen sie was es ist? Ich habe versucht, dies mit HEX, Base64 und einige andere zu entschlüsseln, aber ich komme nicht mit irgendetwas außer diesem ASCII-Text auf:

èñïîëüçîâàí+íèêíåéì+"Rifsadasy";ïèêòîêîä+äåøèôðîâàí;çàðåãèñòðèðîâàëèñü+100%+(âêëþ÷åí+ðåæèì+òîëüêî+ðåãèñòðàöèè);

Antwort

3

Ich denke, der Stack-Überlauf einen Fehler in die rewriter nicht fällig ist. Es ist aufgrund eines Fehlers in die Muster in der Konfiguration der Filterkonfiguration verwendet.

Es ist eigentlich einfach, eine einzige Regex zu erstellen, die endlos loopt, und weder PCRE noch IIRF können dies verhindern. Es ist auch möglich, logische Schleifen in den Umschreibungsregeln zu erstellen, so dass Sie endlos umleiten oder neu schreiben können. Auch hier gibt es keine Möglichkeit, dass der Filter Sie daran hindert, sich selbst in den Fuß zu schießen. Du musst aufpassen.Diese Risiken bestehen, wenn Sie einen Rewriter verwenden, der von PCRE oder einer modularen Regex-Engine abhängt.

Der Stapelüberlauf findet in pcre_exec statt, wo der reguläre Ausdruck ausgeführt wird. Es ist ein degenerierter Fall, der aber in der Konfiguration behandelt werden sollte. Eine vorherige Regel hätte solche ungültigen Fälle ausfiltern sollen. Hier ist a post about using a rewriting filter as a security barrier.

Testen Sie früh und oft. Einige Leute denken, dass, weil die Filterregeln "nur Konfiguration" sind, es keine strengen Tests benötigt. Im Allgemeinen ist das keine sichere Annahme. Behandle die IIRF-Regeln wie jedes Code-Modul. Du benutzt nur eine andere Sprache.

+0

Cheeso! SO GLAD, dich hier zu sehen ... Ich brauche deine Hilfe. Mein Verständnis war die Einstellung IterationLimit verhindert, dass dies ein Problem wird. Wenn IterationLimit auf 5 oder 10 gesetzt wurde, wurde eine URL nach 10 Schreibvorgängen nicht mehr neu geschrieben. Beim erneuten Lesen der Einstellung dieser Einstellung scheint das Iterationslimit nur für einen Durchlauf der Regeln zu gelten. Sobald eine URL erneut an den Anfang des Regelsatzes gesetzt wird, wird das Iterationslimit zurückgesetzt. Ist das richtig? So oder so, jetzt weiß ich, um meine Regeln zu sezieren, um herauszufinden, wo die Schleife gefangen wird. – MaseBase

2

PCRE zwei Funktionen rekursiv wiederholt ruft , bis der Stapelspeicher leer ist. Sie können entweder versuchen, die Rewrite-DLL auf eine Version zu aktualisieren, die nicht fehlerbehaftet ist, oder versuchen, Ihre Rewrite-Regeln so zu ändern, dass der PCRE-Fehler nicht auftritt.

+0

Dies ist kein Fehler im Rewriter. Dies ist ein Fehler im Muster und in der Konfiguration. Der Stapelüberlauf findet in pcre_exec statt, wo der reguläre Ausdruck ausgeführt wird. Es ist ein degenerierter Fall, aber einer, der in der Konfiguration behandelt werden sollte (z. B. alle URLs mit% in ihnen fallen lassen). – Cheeso

+0

Jeder Regex-Parser, der davon überzeugt werden kann, einen Überlauf bei einer bestimmten Eingabe zu stapeln, hat einen Fehler. obwohl ich zustimme, dass es am einfachsten sein könnte, dies in der Konfiguration zu beheben –

+0

Jeder allgemeine Regex erlaubt das Wiederholen von Nullgruppen, was sofort die Möglichkeit von Endlosschleifen ermöglicht. Fazit: * Alle * Regex-Engines sind fehlerhaft! – Cheeso

2

sieht aus, als ob du pcre_exec rekursiv verwendest und all deinen Stack-Platz aufgebraucht hast. Ich würde überprüfen und sehen, welche regulären Ausdrücke Sie verwenden.

1

Basierend auf dieser Stack-Trace ganz unten, sieht es aus wie das Programm in unendliche Rekursion geht, mit zwei Funktionen, die sich gegenseitig aufrufen, ohne zu beenden. Dies führt zu einer Stapelüberlauf-Ausnahme, da der verfügbare Stapel schließlich ausgeht.

1

Können Sie herausfinden, welche URL in die unendliche Rekursion gesendet wird? Es sieht so aus, als hättest du zwei Rewrite-Regeln, die sich gegenseitig auslösen. Es sei denn, Sie haben die Quelle für IsapiRewrite4.dll, es wird nicht viel helfen - Sie können zum Assembly-Code gelangen - aber selbst wenn Sie die Quelle (Sie könnte dekompilieren), wird es nicht helfen, weil ich denke, dass Sie die URL sehen müssen wurde bestanden.

Hat es auch Speicher dump (oder könnten Sie es tun). Arg1, Arg2 oder Arg3 könnten ein Zeiger auf die URL sein?

+0

Ich habe die Quelle für IsapieRewrite4.dll. Es ist Open Source, verfügbar auf der [IIRF-Website] (http://www.codeplex.com/IIRF) – MaseBase

+0

1. Erstellen Sie einen Build mit einem pdb 2. Stellen Sie die DLL mit der pdb im selben Verzeichnis 3. repro Problem 4 (vielleicht debuggen diag pdb), wenn nicht, lade IIS mit der dll auf deinem lokalen Rechner und der pdb im selben Verzeichnis. Suchen Sie die Funktion in dem Fehler. 5. Fügen Sie der Funktion Protokollierung hinzu, damit Sie wissen, welche URL neu geschrieben wird - sehen Sie, ob Sie herausfinden können, wie oft die Funktion auf dem Stack ist (lokaler Variablenzähler für Threads) und ob sie mehr als ein paar Mal vorhanden ist. Protokollieren, was passiert. 5. Führen Sie die neue DLL in der Produktion aus. –

+0

Danke Lou ... wenn ich das Problem wiederholen könnte, würde ich diese Frage nicht posten. Außerdem habe ich versucht, die DLL mit der PDB zu deployen, aber die Debug-Diagnose hat die Symbole nicht gelesen, sie sagt, sie kann sie nicht finden. – MaseBase

1

Also ich glaube, ich habe den Ursache Fehler gefunden. Obwohl ich nicht sicher bin, ob das immer noch ein Fehler im IIRF ISAPI Filter ist? Es sollte zumindest nicht so oft die Rewrite-Funktionen durchlaufen, dass es einen Stack-Overflow verursacht.

Ich kann den Fehler, den ich im Ereignisprotokoll sah, reproduzieren, indem ich diese URL auf meinem Server anfordere: [original_url]/Forum + Ergebnis: +% E8% F1% EF% EE% EB% FC% E7% EE % E2% E0% ED +% ED% E8% EA% ED% E5% E9% EC +% 22Rifsadasy% 22;% EF% E8% EA% F2% EE% EA% EE% E4 +% E4% E5% F8% E8% F4% F0% EE% E2% E0% ED;% E7% E0% F0% E5% E3% E8% F1% F2% F0% E8% F0% EE% E2% E0% EB% E8% F1% FC + 100 % 25 +% 28% E2% EA% EB% FE% F7% E5% ED +% F0% E5% E6% E8% EC +% F2% EE% EB% FC% EA% EE +% F0% E5% E3% E8 % F1% F2% F0% E0% F6% E8% E8% 29;

Also habe ich eine Rewrite-Regel erstellt, um einen 404-Status für diese URL zurückzugeben.

Aber ich musste wissen, ob dies eine Art von Angriff war, kann ich noch nicht ganz sicher sein, aber hier ist, was ich denke, die verschlüsselte Zeichenfolge sagt. Die URL wurde von IP-Adressen in Russland kommen, hier so ist, was ich habe, es zu übersetzen getan:

  1. Hex -zu-- ASCII:

    èñïîëüçîâàí + íèêíåéì + "Rifsadasy"; ïèêòîêîä + äåøèôðîâàí; çàðåãèñòðèðîâàëèñü + 100% + (âêëþ ÷ åí ðåæèì + + + òîëüêî ðåãèñòðàöèè)

  2. Dann Cyrillic Russisch:

    использован + никнейм + "Rifsadasy"; пиктокод + дешифрован; зарегистрировались + 100% + (включен + режим + только + регистрации)

  3. Dann Russisch nach Englisch:

    verwendet Spitzname "Rifsadasy"; piktokod entschlüsseln; registriert 100 (nur Modus)
    oder ähnlich
    Es wird никнейм "Rifsadasy" verwendet; пиктокод wird es decodiert; registriert wurden 100 (Registrierung des Modus nur enthalten ist)

+0

Sie haben das Richtige getan. Lehnen Sie diese langen URLs ab, schützen Sie Ihren Server. – Cheeso