Ist das ganze Message System nicht ein riesen Security Loch?



  • dot schrieb:

    Scorcher24 schrieb:

    dot schrieb:

    http://en.wikipedia.org/wiki/User_Interface_Privilege_Isolation 😉

    Das hindert aber immer noch kein Programm daran mein Programm zu überwachen, Nachrichten zu schicken etc.

    Ähm, doch!?

    Ähm, nein? Ich kann an jedes Programm Nachrichten schicken von dem ich das HWND habe.



  • Scorcher24 schrieb:

    dot schrieb:

    Scorcher24 schrieb:

    dot schrieb:

    http://en.wikipedia.org/wiki/User_Interface_Privilege_Isolation 😉

    Das hindert aber immer noch kein Programm daran mein Programm zu überwachen, Nachrichten zu schicken etc.

    Ähm, doch!?

    Ähm, nein? Ich kann an jedes Programm Nachrichten schicken von dem ich das HWND habe.

    Nur wenn du entsprechende Rechte hast!?



  • Scorcher24 schrieb:

    Und ja, du kannst selber Nachrichten an dich selber auslösen, was manchmal sehr sinnvoll ist. Man kann aber nie rausfinden, von wem die stammt.

    Klar kann man das. Aber in der Regel kommen Nachrichten doch von außen: Maus wurde bewegt, Maustaste wurde gedrückt, Taste auf Tastatur wurde gedrückt usw. Ich halte es für relativ uninteressant, woher GENAU die Nachricht kommt. Ich weiß ja auch nie, ob da nun Lieschen oder Fritz den Button gedrückt hat, auf den mein Programm nun reagieren soll.



  • @Belli
    Ach ne, so uninteressant ist das nicht.
    Man kann viel zu viel über Window-Messages machen als dass es in allen Fällen total uninteressant wäre.

    Wenn MS das nicht speziell abgesichert hätte könnte ein Programm auch seinen eigenen Elevation-Dialog wegklicken.



  • Hallo,

    mit diesem kleinen Testprogramm konnte ich eine andere Anwendung fernsteuern:

    #include <windows.h>
    
    #include <iostream.h>
    
    int main( void )
    {
    	HWND opfer = FindWindow( MAKEINTRESOURCE(32770), "CRESD MIDI Tools 2.0" );
    
    	if( opfer )
    	{
    		cout << "Opfer gefunden\n";
    		SendMessage( opfer, WM_COMMAND, IDCANCEL, NULL );
    	}
    	else
    		cout << "Pech gehabt\n";
    
    	return 0;
    

    Das zeigt ein potentieller Angreifer kann schon ziemlich viel Unfug treiben. Das ganze habe ich mit Windows 7 64-bit getestet. Beide Anwendungen waren aber 32-Bitanwendungen. Irgendwelche Schutzmassnahmen wurden nicht ergriffen.

    mfg Martin



  • Wenn es ein Programm schafft auf Deinem Rechner mit den gleichen Rechten ausgeführt zu werden, wie alle anderen Programm auch, dann hast Du ein Problem...



  • Jochen Kalmbach schrieb:

    Wenn es ein Programm schafft auf Deinem Rechner mit den gleichen Rechten ausgeführt zu werden, wie alle anderen Programm auch, dann hast Du ein Problem...

    Ja, aber es wäre ein leichtes für Kleinweich gewesen, der Windows Funktion GetMessage eine Möglichkeit mitzugeben, damit der Aufrufer herausfinden kann, woher die Message kommt. Man hört ja auch immer wieder, daß Angreifer eine Möglichkeit finden, in einen fremden Rechner einzudringen. Dann muß man ihnen nicht alle Türen und Tore öffnen. Man hätte es ihnen auch trotzdem möglichst schwer machen können.

    mfg Martin



  • Jochen Kalmbach schrieb:

    Wenn es ein Programm schafft auf Deinem Rechner mit den gleichen Rechten ausgeführt zu werden, wie alle anderen Programm auch, dann hast Du ein Problem...

    Ehm, entschuldige mal, so viele Rechte gibts hier nicht. Administrator und nicht Administrator. Ich bin der gleichen Meinung wie mgaeckler, hier gehört eine Möglichkeit rein herauszufinden, wer das ganze geschickt hat.



  • Jochen Kalmbach schrieb:

    Wenn es ein Programm schafft auf Deinem Rechner mit den gleichen Rechten ausgeführt zu werden, wie alle anderen Programm auch, dann hast Du ein Problem...

    Bei wem ist das denn nicht der Fall?



  • Scorcher24 schrieb:

    Jochen Kalmbach schrieb:

    Wenn es ein Programm schafft auf Deinem Rechner mit den gleichen Rechten ausgeführt zu werden, wie alle anderen Programm auch, dann hast Du ein Problem...

    Ehm, entschuldige mal, so viele Rechte gibts hier nicht. Administrator und nicht Administrator.

    Nope, hier kommen zusätzlich zu den Userrechten noch unterschiedliche Integrity Level zu tragen. Und wenn ein Prozess die Rechte hat, dir eine Nachricht zu schreiben, dann hat er sowieso auch die Rechte, direkt in deinem Speicher rumzumalen...

    Mir ist ehrlich gesagt nicht klar, wie genau du dir das vorstellst, dass ein Mechanismus, der es dir erlaubt irgendwie "nachzuschauen", von wem eine Nachricht gesendet wurde, irgendeine Form von Sicherheit bringt...



  • dot schrieb:

    Mir ist ehrlich gesagt nicht klar, wie genau du dir das vorstellst, dass ein Mechanismus, der es dir erlaubt irgendwie "nachzuschauen", von wem eine Nachricht gesendet wurde, irgendeine Form von Sicherheit bringt...

    Man kann Nachrichten, von Prozessen, die man nicht kennt, einfach verwerfen.

    mfg Martin



  • Da nun einmal Messages geschickt werden, interessiert es doch von wem.
    Also aus dem eigenen Prozess(en) oder von einem Fremdprozess.

    Die Frage ist: Wie erkennt man eine unerwünschte Message und fängt diese ab, bevor sie etwas
    schlimmes ausrichten kann? Was geben da die Hi/Lo-Werte von wparam und lparam her oder
    was gibt es sonst zum Schutz?



  • mgaeckler schrieb:

    dot schrieb:

    Mir ist ehrlich gesagt nicht klar, wie genau du dir das vorstellst, dass ein Mechanismus, der es dir erlaubt irgendwie "nachzuschauen", von wem eine Nachricht gesendet wurde, irgendeine Form von Sicherheit bringt...

    Man kann Nachrichten, von Prozessen, die man nicht kennt, einfach verwerfen.

    Ein Prozess, der in der Lage ist, dir Nachrichten zu schicken, kann aber auf viel einfachere Art und Weise sowieso schon in deinen Prozess rein (DLL Injection; anyone?). Und sobald du dich nichtmehr darauf verlassen kannst, dass dein Code nicht sowieso bereits durch den anderen Prozess modifiziert wurde, wird dir alles Testen eines Absenders nicht mehr helfen...



  • dot schrieb:

    Ein Prozess, der in der Lage ist, dir Nachrichten zu schicken, kann aber auf viel einfachere Art und Weise sowieso schon in deinen Prozess rein (DLL Injection; anyone?). Und sobald du dich nichtmehr darauf verlassen kannst, dass dein Code nicht sowieso bereits durch den anderen Prozess modifiziert wurde, wird dir alles Testen eines Absenders nicht mehr helfen...

    Dieser Einwand ist natürlich nicht unberechtigt, wobei ich allerdings jetzt nicht weiß, ob man DLL Injection mit normalen Benutzerrechten erzwingen kann. Das Beispiel von mir, habe ich mit normalen Benutzerrechten ausführen können.

    Es ist halt immer ein Problem, wenn man versucht ein System von einem Homecomputer in die professionelle Conmputerwelt zu migrieren. Hier merkt man halt ganz klar, wo die Wurzeln dieses Windows liegen.

    mfg Martin



  • Man kann Nachrichten, von Prozessen, die man nicht kennt, einfach verwerfen.

    Da nun einmal Messages geschickt werden, interessiert es doch von wem.
    Also aus dem eigenen Prozess(en) oder von einem Fremdprozess.

    Bringt nunmal nichts, zumindest nichts als Schutzmaßnahme. Wenn man überprüfen kann von wem die Message kommt gibt man halt vor das System zu sein...



  • mgaeckler schrieb:

    Es ist halt immer ein Problem, wenn man versucht ein System von einem Homecomputer in die professionelle Conmputerwelt zu migrieren. Hier merkt man halt ganz klar, wo die Wurzeln dieses Windows liegen.

    Was genau meinst du damit? Wie wäre dieses "Problem" denn deiner Meinung nach zu lösen, bzw. wie löst man es in dieser "professionellen Computerwelt"? Einen Absender mitschicken und immer Abfragen, ist jedenfalls in etwa so sinnvoll, wie rund um die Uhr einen Clown vor die Bank stellen, damit etwaige Einbrecher was zu lachen haben...



  • Ach, ihr könnt euch doch überhaupt Nichts vorstellen was nicht von M$ vorgekaut wurde.
    Man kann zum Beispiel in der MessageProc durchaus eine PID des Absenders mitgeben und 0 fürs System oder so. Das wird natürlich nicht vom schickenden Prozess beim Aufruf von SendMessage ausgefüllt, sondern automatisch vom System damit man eben nicht schummeln kann.
    Das Problem ist natürlich, dass so eine punktuelle Absicherung nichts bringt wo eh jeder Prozess in jedem Prozess beliebig drin rumschreiben kann. Das ist wahrscheinlich auch was mit Homecomputer vs professioneller Computer gemeint ist: Beim Homecomputer kann jeder Prozess alles machen, das macht vieles einfach. In professioneller Umgebung ist Sicherheit nicht völlig egal, und da kann man Windows vergessen. Linux übrigens auch.



  • DarkShadow44 schrieb:

    Man kann Nachrichten, von Prozessen, die man nicht kennt, einfach verwerfen.

    Da nun einmal Messages geschickt werden, interessiert es doch von wem.
    Also aus dem eigenen Prozess(en) oder von einem Fremdprozess.

    Bringt nunmal nichts, zumindest nichts als Schutzmaßnahme. Wenn man überprüfen kann von wem die Message kommt gibt man halt vor das System zu sein...

    Was ist das für eine Argumentation? Ein Schloß bei dem ich auch gleich den Schlüssel deponiere ist so sinnlos wie ein Kropf. Schreibst Du die Geheimzahl Deiner EC-Karte auf die Karte selber, weil sie eh nix nützt, da ein potentieller Angreifer, Dir ja eine Waffe an die Schläfe halten kann?

    Ach ich hab noch ein Argument für Dich: Da Du gegen einen Atombombenschlag nichts ausrichten kannst, mußt Du Dein Haus nicht mehr absprerren. Nützt ja eh nichts.

    Sorry mehr fällt mir dazu nicht mehr ein.

    mfg Martin



  • dot schrieb:

    Was genau meinst du damit? Wie wäre dieses "Problem" denn deiner Meinung nach zu lösen, bzw. wie löst man es in dieser "professionellen Computerwelt"? Einen Absender mitschicken und immer Abfragen, ist jedenfalls in etwa so sinnvoll, wie rund um die Uhr einen Clown vor die Bank stellen, damit etwaige Einbrecher was zu lachen haben...

    Windows wurde vor rund 30 Jahren auf einem Einzelplatzsystem ohne irgendwelche Schutzmassnahmen konzipiert. Damals war die schlimmste Bedrohung für so einen Rechner Bootsektor- und Linkviren. Dagegen konnte man sich relativ leicht schützen. Das merkt man einfach der Windows API einfach immer noch an, auch wenn es mittlerweile einige Schutzmassnahmen gibt. Bei X11 sieht das z.B. ganz anders aus. Da muß ein X11-Client sich mit einem X11-Server explizit verbinden, da kann nicht einfach ein fremder Prozess einer Anwendung eine Nachricht schicken, heh der Benutzer hat gerade auf Shutdown geklickt.

    MS hätte z.B. folgendes machen können:

    Jede Nachricht, die mit PostMessage oder SendMessage verschickt wird, wird vom System mit der InstanceID des Absenders ergänzt. Der Messagepuffer, der von GetMessage bzw. PeekMessage gefüllt wird, enthält nun diese InstanceID. Anwendungen, die nicht ferngesteuert werden wollen, könnten nun überprüfen, ob die InstanceID zum System gehört oder zu einer anderen Anwendung. Ganz einfach.

    Jetzt kommst sicherlich Du daher und sagst, aber MS könnte das schlampig implementiert haben und ein Angreifer, die Nachricht manipulieren, bevor sie ausgeliefert wird. Also nützt das nix. Mag sein, aber solche Fehler könnte MS beheben. Wenn die API das nicht hergibt, kann man auch nichts beheben ohne alle Anwendungen zu beeinflussen, denen das egal ist.

    mfg Martin



  • nwp3 schrieb:

    Ach, ihr könnt euch doch überhaupt Nichts vorstellen was nicht von M$ vorgekaut wurde.
    Man kann zum Beispiel in der MessageProc durchaus eine PID des Absenders mitgeben und 0 fürs System oder so. Das wird natürlich nicht vom schickenden Prozess beim Aufruf von SendMessage ausgefüllt, sondern automatisch vom System damit man eben nicht schummeln kann.
    Das Problem ist natürlich, dass so eine punktuelle Absicherung nichts bringt wo eh jeder Prozess in jedem Prozess beliebig drin rumschreiben kann. Das ist wahrscheinlich auch was mit Homecomputer vs professioneller Computer gemeint ist: Beim Homecomputer kann jeder Prozess alles machen, das macht vieles einfach. In professioneller Umgebung ist Sicherheit nicht völlig egal, und da kann man Windows vergessen. Linux übrigens auch.

    Danke, Du hast es verstanden. Genau so habe ich es gemeint.

    mfg Martin


Anmelden zum Antworten