Herkunft von nicht initialisiertem Speicher?



  • Auskenner schrieb:

    Ich bin daher der Meinung, dass der Speicher nicht genullt wird und man daher tatsächlich alte Daten von vorherigen Prozessen bekommt.

    Prozesse bekommen grundsätzlich nur virtuellen Speicher, drin stehen kann aber nur was in physikalischem Speicher.
    Man muss also nur gucken wo/wie das Mapping zwischen virtuellen Adressen und physikalischem Speicher gemacht wird, und was da zu dem Thema steht.
    Und gemacht wird es mit VirtualAlloc , und da steht:

    Reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, unless MEM_RESET is specified.

    MEM_RESET ist nur für Speicher verwendbar der vorher bereits committed war, d.h. in unserem Fall irrelevant.

    Mir wäre auch kein anderer Weg bekannt mit dem man Speicher in einen Prozess mappen kann, der diesen nicht mit Null initialisiert.

    Spezielle Funktionen für Passwörter etc. machen trotzdem Sinn:

    1. Es kann angreifer im selben Prozess geben, bzw. welche die über Admin Rechte aus nem anderen Prozess den Speicher lesen. Wenn nun etwas, was man dekodieren und dann ganz kurz prüfen musste, für ewig irgendwo im Speicher des Prozesses rumgammelt, dann wäre das schlecht.
    2. Es gibt Treiber, und da die in Ring 0 laufen, können die so-ziemlich-alles.
    3. Es gibt Dinge wie das Pagefile, und da sollten diese Daten auch nicht unbedingt drinnen landen.

    Windows hat übrigens sogar einen speziellen Systemprozess, der nur dafür zuständig ist Speicher, der gerade für nix gebraucht wird, mit Nullen vollzuschreiben. Wobei das auch durchaus für andere Dinge gut ist. z.B. dafür dass nicht unnötig Speicher auf dem Host belegt wird, wenn Windows in einer VM läuft.



  • DocShoe schrieb:

    Die gängigsten Speicherverwaltungsfunktionen unter Windows sind die Funktionen HeapAlloc , GlobalAlloc und LocalAlloc . Keine dieser Funktionen nullt den Speicher automatisch, aber das lässt sich über ein Flag im Aufruf steuern. Allein die Tatsache, dass eine dieser Funktionen ungenullten Speicher anfordern kann bedeutet, dass zumindest Windows bei der Speicherallokation den Speicher nicht automatisch nullt.

    Klar. Du kannst aber nie Speicher bekommen wo "Müll" aus einem anderen Prozess drinnen steht. Wichtiger Unterschied.

    Bevor der Heap Speicher "austeilen" kann, muss er nämlich erstmal einen Bereich virtueller Adressen für den Prozess mittels VirtualAlloc & co mit Speicher "hinterlegen". Und dabei wird genullt.


  • Mod

    Ok, dann haben wir jetzt eine harte Quelle fuer Linux und fuer Windows (ich setze einfach mal voraus, dass hustbaer sich besser auskennt, als Auskenner). Das beruhigt.



  • hustbaer schrieb:

    Auskenner schrieb:

    Ich bin daher der Meinung, dass der Speicher nicht genullt wird und man daher tatsächlich alte Daten von vorherigen Prozessen bekommt.

    Prozesse bekommen grundsätzlich nur virtuellen Speicher, drin stehen kann aber nur was in physikalischem Speicher.
    Man muss also nur gucken wo/wie das Mapping zwischen virtuellen Adressen und physikalischem Speicher gemacht wird, und was da zu dem Thema steht.
    Und gemacht wird es mit VirtualAlloc , und da steht:

    Reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, unless MEM_RESET is specified.

    MEM_RESET ist nur für Speicher verwendbar der vorher bereits committed war, d.h. in unserem Fall irrelevant.

    Mir wäre auch kein anderer Weg bekannt mit dem man Speicher in einen Prozess mappen kann, der diesen nicht mit Null initialisiert.

    Spezielle Funktionen für Passwörter etc. machen trotzdem Sinn:

    1. Es kann angreifer im selben Prozess geben, bzw. welche die über Admin Rechte aus nem anderen Prozess den Speicher lesen. Wenn nun etwas, was man dekodieren und dann ganz kurz prüfen musste, für ewig irgendwo im Speicher des Prozesses rumgammelt, dann wäre das schlecht.
    2. Es gibt Treiber, und da die in Ring 0 laufen, können die so-ziemlich-alles.
    3. Es gibt Dinge wie das Pagefile, und da sollten diese Daten auch nicht unbedingt drinnen landen.

    Windows hat übrigens sogar einen speziellen Systemprozess, der nur dafür zuständig ist Speicher, der gerade für nix gebraucht wird, mit Nullen vollzuschreiben. Wobei das auch durchaus für andere Dinge gut ist. z.B. dafür dass nicht unnötig Speicher auf dem Host belegt wird, wenn Windows in einer VM läuft.

    Danke für die Erläuterung.



  • SeppJ schrieb:

    Ok, dann haben wir jetzt eine harte Quelle fuer Linux und fuer Windows (ich setze einfach mal voraus, dass hustbaer sich besser auskennt, als Auskenner). Das beruhigt.

    Ich kenne mich vermutlich diesbezüglich besser aus als Auskenner.
    Das heisst aber nicht, dass es nicht doch noch andere Wege geben könnte wie man Speicher in einen Prozess mappen kann. Ich hab ja nur geschrieben Mir wäre auch kein anderer Weg bekannt -- heisst ja nicht dass es dann keinen geben kann.



  • hustbaer schrieb:

    SeppJ schrieb:

    Ok, dann haben wir jetzt eine harte Quelle fuer Linux und fuer Windows (ich setze einfach mal voraus, dass hustbaer sich besser auskennt, als Auskenner). Das beruhigt.

    Ich kenne mich vermutlich diesbezüglich besser aus als Auskenner.
    Das heisst aber nicht, dass es nicht doch noch andere Wege geben könnte wie man Speicher in einen Prozess mappen kann. Ich hab ja nur geschrieben Mir wäre auch kein anderer Weg bekannt -- heisst ja nicht dass es dann keinen geben kann.

    Mega interessnat sowas. Wo zur Hölle hast du sowas gelernt?
    Ich will sowas auch lernen ^^





  • Und wie kommt man dazu sowas zu suchen? Ich meine sitzt ihr daheim, habt nichts zu tun und denkt: "Och das Buch hab ich schon 5 mal gelesen, ich geh mal aug msdn.com und lese ein wenig?"

    Man muss also nur gucken wo/wie das Mapping zwischen virtuellen Adressen und physikalischem Speicher gemacht wird, und was da zu dem Thema steht.
    Und gemacht wird es mit VirtualAlloc,

    Steht sowas in msdn?


  • Mod

    Sqw4n schrieb:

    Man muss also nur gucken wo/wie das Mapping zwischen virtuellen Adressen und physikalischem Speicher gemacht wird, und was da zu dem Thema steht.
    Und gemacht wird es mit VirtualAlloc,

    Steht sowas in msdn?

    Ja. Das habe ich gestern (nach Bashars Frage nach Quellen) selber recht schnell bei Google gefunden. Suchbegriffe dafuer duerften so etwas wie "Windows memory page allocate" oder vergleichbares gewesen sein. Auf diese Begriffe kommt man natuerlich nur, wenn man grob weiss, was virtual memory ist und dass moderne OS das benutzen, aber das sollte bei der Fragestellung hier im Thread wohl vorausgesetzt sein. Wenn man sich damit nicht auskennt, dann muss man natuerlich erst einmal Wikipedia oder aehnliches studieren, wie Speicherverwaltung ueberhaupt grob funktioniert.

    Ich war mir eben bloss nicht sicher, ob das wirklich die einzige low-level Methode der Windowsspeicherverwaltung ist. Natuerlich ist hustbaers Aussage (wie er schon selber schreibt), dass er keine andere kennt, keine absolute Versicherung. Aber hustbaer kennt sich ziemlich gut mit der Materie aus. Wenn er sagt, dass er keine andere Methode kennt, dann gibt es sehr wahrscheinlich keine anderen Methoden. Bloss irgendwelche undokumentierten NSA-Hintertueren.



  • Sqw4n schrieb:

    hustbaer schrieb:

    SeppJ schrieb:

    Ok, dann haben wir jetzt eine harte Quelle fuer Linux und fuer Windows (ich setze einfach mal voraus, dass hustbaer sich besser auskennt, als Auskenner). Das beruhigt.

    Ich kenne mich vermutlich diesbezüglich besser aus als Auskenner.
    Das heisst aber nicht, dass es nicht doch noch andere Wege geben könnte wie man Speicher in einen Prozess mappen kann. Ich hab ja nur geschrieben Mir wäre auch kein anderer Weg bekannt -- heisst ja nicht dass es dann keinen geben kann.

    Mega interessnat sowas. Wo zur Hölle hast du sowas gelernt?
    Ich will sowas auch lernen ^^

    zieh dir mal Understanding the Linux Kernel rein, dort wird auf die Speicherverwaltung von Linux ziemlich genau eingegangen.
    Und auch wenn Linux und Windows zwei unterschiedliche Betriebssysteme sind, so sind doch viele Grundprinzipien gleich.
    Einen Vorteil hat Linux aber: der Sourcecode ist offen, wenn du wissen willst wie dies und jenes funktioniert schaust du z.B. bei http://lxr.linux.no vorbei und siehst dir die relevante Funktion an.



  • @Sqw4n
    Das sind Sachen die man sich im Laufe der Jahre erfragt/ergoogelt wenn einen das Thema ausreichend interessiert.

    Ich lese aber nicht einfach willkürlich irgendwas in der MSDN - ich such mir die Sachen schon sehr spezifisch aus. Wie Computer und Betriebssysteme so grundsätzlich funktionieren hat mich aber schon immer interessiert. Und dazu gehört auch wie z.B. Prozess-Isolation und virtueller Speicher funktioniert. Oder wo der Speicher "eigentlich herkommt" wenn man malloc bzw. new aufruft. Das sind einfach so grundlegende Dinge. Viele nehmen sowas einfach als gegeben, aber mich interessiert es halt wie das unter der Haube funktioniert.

    Genau so kannst du nen Auto-Freak fragen woher er weiss wie die ganzen Auto-Sachen eigentlich so funktionieren, von denen wir reinen Auto-Verwender auch nur ne sehr nebulöse Vorstellung haben (wenn überhaupt). Das interessiert die halt 😉



  • Ich kann zu ZwAllocateVirtualMemory leider auch keine Info zu dem Thema finden. Bloss nen ReactOS Unit-Test der prüft ob die Seiten die ZwAllocateVirtualMemory zurückgibt zero-filled wurden:

    http://jira.reactos.org/secure/attachment/18911/ZwAllocateVirtualMemory.c

    Was natürlich noch lange nicht heisst dass das auf Windows auch so sein muss. Bei dem Aufwand den MS in den letzten Jahren betrieben hat um die Sicherheit von Windows bzw. Windows-Programmen zu verbessern, würde es mich aber wirklich sehr wundern wenn es nicht so wäre. Also wenn es ein Loch gäbe, über den man an ohne die entsprechenden Berechtigungen an "Speicherüberreste" von anderen Prozessen kommen könnte.



  • hustbaer schrieb:

    Genau so kannst du nen Auto-Freak fragen woher er weiss wie die ganzen Auto-Sachen eigentlich so funktionieren, von denen wir reinen Auto-Verwender auch nur ne sehr nebulöse Vorstellung haben (wenn überhaupt). Das interessiert die halt 😉

    Einspruch, ein Auto aus den 70ern, also noch ohne das viele Elektronikgeraffel ist bestenfalls nur so komplex wie HTML.

    Komplex wird das erst auf Maschinenebene, wenn man sich z:B. fragt, welche Stahlsorte oder Materialen man für den Motorblock verwenden soll, da kann man dann ne Doktorarbeit drüber schreiben, aber so etwas lernt in der Regel kein Hobby Auto-Freak.

    Die ganze IT ist da allein vom Umfang her schon wesentlich komplexer.

    Das ein Ottomotor bei einem 4 Takter in 4 Schritten arbeitet:
    Ansaugen, verdichten & zünden, arbeiten und ausstoßen das weiß ich auch.
    Und bei n>=4 Taktern ist es nur noch eine Überschneidung, aber im wesentlich das gleiche.

    Wie so ein Getriebe funktioniert, das kriege ich auch noch hin. Wer früher als Kind mit Legotechnik gespielt hat, der kann sich das schon so vorstellen.



  • Korrektur, meinte:

    Auskenner schrieb:

    Komplex wird das erst auf Maschinenbauebene,... usw.



  • Bashar schrieb:

    OK, das scheint wohl tatsächlich so gängig zu sein. Ich hab zwar immer noch keine Quelle, aber auf Stackoverflow sagen das alle, dann wird es wohl stimmen 😕

    Wenn man eine Aussage oft genug wiederholt, stimmt sie. 😃



  • https://www.us-cert.gov/ncas/alerts/TA14-098A schrieb:

    A vulnerability in OpenSSL could allow a remote attacker to expose sensitive data, possibly including user authentication credentials and secret keys, through incorrect memory handling in the TLS heartbeat extension.

    Leider kenne ich mich nicht besonders gut aus damit. Aber heut hab ich die Meldung gesehen und es scheint so, also würde es doch irgendwie gehen.
    Oder besteht da kein Zusammenhang?



  • Ich glaub, das ist nur innerhalb des Prozesses.



  • Sqwan schrieb:

    https://www.us-cert.gov/ncas/alerts/TA14-098A schrieb:

    A vulnerability in OpenSSL could allow a remote attacker to expose sensitive data, possibly including user authentication credentials and secret keys, through incorrect memory handling in the TLS heartbeat extension.

    Leider kenne ich mich nicht besonders gut aus damit. Aber heut hab ich die Meldung gesehen und es scheint so, also würde es doch irgendwie gehen.
    Oder besteht da kein Zusammenhang?

    Also wenn du diese Meldung erst seit heute kennst, dann ist das sehr schlecht.
    Weil es bedeutet, dass du nicht weißt, welche Katastrophe sich im Internet in den letzten 2 Tagen offenbart hat.
    Insofern sage ich dir erst einmal Guten Morgen.

    Nun zu deiner Frage.
    In diesem Fall sind es nur die Daten des Prozesses und der reservierte Speicherbereich des Prozesses selbst und nicht die, die sich außerhalb eines Prozesses finden.



  • Auskenner schrieb:

    Also wenn du diese Meldung erst seit heute kennst, dann ist das sehr schlecht.
    Weil es bedeutet, dass du nicht weißt, welche Katastrophe sich im Internet in den letzten 2 Tagen offenbart hat.
    Insofern sage ich dir erst einmal Guten Morgen.

    1. Danke, das Datum kann ich selbst lesen
    2. Wer sagt dir das ich das seit heute weiß?
    3. Das hab ich wohl schon vor 2 Tagen gelesen. Die Katastrophe is aber an mir vorbei gegangen.
    4. Solltest du dir deine Aroganz sparen und dich registrieren. Dann fang an über Sachen zu schreiben die du verstehst oder num so viel mit wie du kannst. Hier jedenfalls schreibst du nur Blech, der prompt von leuten, die zwar auch teilweise arrogant rüberkommen aber wenigstens Ahnung haben, widerlegt.

    Auskenner schrieb:

    Nun zu deiner Frage.In diesem Fall sind es nur die Daten des Prozesses und der reservierte Speicherbereich des Prozesses selbst und nicht die, die sich außerhalb eines Prozesses finden.

    Quelle?



  • Sqwan schrieb:

    2. Wer sagt dir das ich das seit heute weiß?

    Du:

    Aber heut hab ich die Meldung gesehen

    3. Das hab ich wohl schon vor 2 Tagen gelesen.

    Nein, hast du nicht, wie du bereits eingeräumt hast. Siehe oben.

    4. Solltest du dir deine Aroganz sparen

    Danke für das Lob.

    Hier jedenfalls schreibst du nur Blech, der prompt von leuten, die zwar auch teilweise arrogant rüberkommen aber wenigstens Ahnung haben, widerlegt.

    getroffene Hunde bellen.
    Warum fühlst du dich getroffen?

    Quelle?

    Brauche ich nicht, das weiß ich.
    Du kannst es aber den Sicherheitsmeldungen zu diesem Bug entnehmen, da steht es eigentlich schon drin.


Anmelden zum Antworten