Speicher sicher löschen



  • Ich bin nicht ganz sicher, ob unten stehender Code wirklich den BSTR vollständig überschreibt und "löscht" (Speicher freigibt).

    void WipeBSTR(BSTR pData) {
    
        int i;
    
        for (i = 0; i < 30; i++) { 
    
            memset (pData, 0x00, SysStringByteLen(pData)); 
            memset (pData, 0xFF, SysStringByteLen(pData)); 
            memset (pData, 0x00, SysStringByteLen(pData)); 
        }
    
        SysFreeString(pData);
    
    }
    

    Mit vollständig meine ich nur den Datenstrang des BSTRs. Der "Header" enthält ja nur Informationen über die Länge ist also nicht so wichtig, oder ?



  • Hmmm... Mehrfaches überschreiben bringt eigentlich nur bei magnetischen Massenspeichern was, um unterschwellige Restmagnetisierungen zu vernichten.

    Bei deinem BSTR wird in den meisten Fällen nur in Level 1 Cache geschrieben. "Kopien" können immer noch liegen im Level 2 Cache, Main RAM und Swap File, und mit etwas "Glück" noch an verscheidenen Stellen.

    Was hast du eigentlich vor?



  • peterchen schrieb:

    Was hast du eigentlich vor?

    Ich möchte eigentlich nur sicher gehen, das der Speicherbereich, indem ein String mit sensiblen Daten "lag", überschrieben wird nach Gebrauch.
    Die Anzahl der WipePasses ist sicherlich etwas "sehr vorsichtig", aber man kann ja nie wissen.

    peterchen schrieb:

    Bei deinem BSTR wird in den meisten Fällen nur in Level 1 Cache geschrieben. "Kopien" können immer noch liegen im Level 2 Cache, Main RAM und Swap File, und mit etwas "Glück" noch an verscheidenen Stellen.

    Angenommen der User gibt ein Passwort ein, dieses speichere ich in der Variable BSTR pData. Dann, nachdem der User kurz auf OK, geklickt oder sonst irgendewtas getan hat, wird der Speicherbereich von Variable BSTR pData überschrieben und freigegeben. Somit hält sich doch nichts in anderen Bereichen auf, oder ?

    Die Swapdatei ist eine andere Sache (eine echtes Sicherheitsrisiko). Aber wird doch auch mit "Adressen" behandelt, so dass auch der Bereich überschrieben werden würde, oder nicht !?

    peterchen schrieb:

    Hmmm... Mehrfaches überschreiben bringt eigentlich nur bei magnetischen Massenspeichern was, um unterschwellige Restmagnetisierungen zu vernichten.

    Hat sich in kryptografischen Anwendgunen durchgesetzt und ist auf jeden Fall ein beruhigendes Gefühl. 😉



    1. Mir ist keine Methode bekannt, den vorherigen Zustand einer Speicerhzelle im DRAM auszulesen. Kann mich natürlich irren - in dem Fall schlägt aber folgendes zu:

    2. Wann Daten im Cache / Main / Swapfile landen, ist nicht vorhersagbar, und hängt auch von anderen laufenden Prozessen, dem Scheduler usw. ab.

    3. Dein Überschreiben wird mit hoher Wahrscheinlichkeit nur im 1st level Cache passieren - es sei denn, der Scheduler wechselt auf einen anderen thread, der könnte a) den Cache flushen oder b) den Speicherinhalt swappen

    Was überhaupt (Platformspezifisch) machbar ist:
    * Cache Flush erzwingen ==> änderungen werden durchgeschrieben
    * Über Memory Mapping die Daten in einer separaten Datei (nichtr der Swap-Datei) halten, und diese anschließend auch mehrfach überschreiben. Geht aber nicht mit BSTR weil SysAllocString halt auf dem Standard-Heap (und damit dem Swapfile) arbeitet

    Einmal überschreiben gegen einfachere Angriffe.
    Wenn du wirklich auf Nummer sicher gehen willst - Datei anlegen, In den Speicher Mappen, Paßworteingabe dort, im speicher überschreiben, Datei schließen + wipen.

    m.E. bringt das mehrfache überschreiben im Speicher nichts - zuviele unbekannte, und keine bekannte "Gefahr". Der einfachste "Angriff" ist ja eh mit dem Debugger...



  • Hi.

    Also ich würde sagen das du so große SOrgen garnicht haben musst.

    Der Blödsinn mit von wegen die Swapfile sei ja so gefährlich halte ich für unnötige Panikmacherrei.

    Die Swapdatei ist ja recht willkürlich aus einzelnen Pages zusammengewürfelt.
    Ich glaube kaum das jemand erfolg haben würde diese zu durchsuchen und dann auch noch genau die Speicherstelle erwicht in der das PW steht.

    Und selbiges gilt für den 1st und 2nd Level Cache, sofern man da drauf eh nicht per Software zugreifen kann. Das wird alles von der CPU verwaltet.

    Bestenfalls würde ich also einfach die Speicherstelle einmal mit Nullen überschreiben und fertig.
    Das sollte vollkommen genügen.



  • Also die SwapDatei ist schon nicht ganz ohne. Aber das ist ein anderes Thema. Außerdem hat sie auch wesentliche Vorteile.

    Ich habe aus euren (peterchen, TeeJay) Beiträgen entnommen, dass Speicher auslesen (voheriger Zustand) nicht so ohne weiteres möglich ist, nicht wahr ?

    @peterchen:
    FileMapping. Ja, wenn man sonst nichts zu tun hat. 😃
    Aber eigentlich ein nette Idee. 🙂
    Jedoch reichlich unpraktikabel und ein wenig aufwendig.

    Jedoch hätte ich noch kurz den Ursprung meiner Frage beantwortet. Ob mein Code den BSTR vollständig überschreibt oder ob ich etwas vergessen habe.
    Habe extra die Bytelänge genommen, da es ja ein Unicode String ist.



  • Hi.

    Also die Swapdatei noch einem bestimmten Speicherstück zu durchsuchen ist meiner Meinung nach (wenn überhaupt) nur mit sehr erheblichem Aufwand möglich.

    Und zu deiner Frage:
    Wenn du die Speicherstelle mit lauter Nullen überschrieben hast, so kannst du wohl davon ausgehen das dein String nicht mehr rekonstruierbar ist.

    Selbst wenn dein String anfangs nur im 1st oder 2nd Level-Cache überschrieben worden ist.....die beiden Caches sind ja immer noch recht klein, so das nach Ausführen einiges weiteren Programmcodes(Speich durch Taskwechsel zu anderen Programmen), dein String aus dem Cache in den Arbeitsspeicher übertragen wird um Platz für neue Daten zu machen.


Log in to reply