Frage

Ich will erstellen Sie eine Zuweisung liefert Speicher mit den folgenden Parametern:

  • kann nicht auf die Festplatte ausgelagert werden.
  • ist unglaublich schwer zu Zugang über einen angehängten debugger

Die Idee ist, dass dies vertrauliche Informationen enthalten (wie Lizenz-Informationen), die sollte für den Benutzer unzugänglich.Ich habe das getan üblichen online-Forschung, und fragte ein paar andere Leute, aber ich kann nicht finden, ein guter Ort, zu starten, die auf dieses problem.

Updates

Josh erwähnt mit VirtualAlloc zum set Schutz auf dem Speicherplatz.Ich habe erstellt eine benutzerdefinierte Zuweisung ( siehe unten ) habe ich festgestellt, die mit der VirtualLock Funktion begrenzt die Menge an Arbeitsspeicher, die ich zuordnen kann.Dies scheint durch design though.Da ich es für die kleine Objekten, ist dies kein problem.

//
template<class _Ty>
class LockedVirtualMemAllocator : public std::allocator<_Ty>
{
public:
    template<class _Other>
    LockedVirtualMemAllocator<_Ty>& operator=(const LockedVirtualMemAllocator<_Other>&)
    {   // assign from a related LockedVirtualMemAllocator (do nothing)
        return (*this);
    }

    template<class Other>
    struct rebind {
        typedef LockedVirtualMemAllocator<Other> other;
    };

    pointer allocate( size_type _n )
    {
        SIZE_T  allocLen = (_n * sizeof(_Ty));
        DWORD   allocType = MEM_COMMIT;
        DWORD   allocProtect = PAGE_READWRITE;
        LPVOID pMem = ::VirtualAlloc( NULL, allocLen, allocType, allocProtect );
        if ( pMem != NULL ) {
            ::VirtualLock( pMem, allocLen );
        }
        return reinterpret_cast<pointer>( pMem );
    }
    pointer allocate( size_type _n, const void* )
    {
        return allocate( _n );
    }

    void deallocate(void* _pPtr, size_type _n )
    {
        if ( _pPtr != NULL ) {
            SIZE_T  allocLen = (_n * sizeof(_Ty));
            ::SecureZeroMemory( _pPtr, allocLen );
            ::VirtualUnlock( _pPtr, allocLen );
            ::VirtualFree( _pPtr, 0, MEM_RELEASE );
        }
    }
};

und verwendet wird,

 //a memory safe std::string
 typedef std::basic_string<char, std::char_traits<char>, 
                           LockedVirtualMemAllocato<char> > modulestring_t;

Ted Percival erwähnt mlock, aber ich habe keine Implementierung gefunden werden.

Ich fand Practical Cryptography " von Neil Furguson und Bruce Schneier ganz hilfreich sein.

War es hilfreich?

Lösung

Sie können nicht wirklich Schutz vor memory access.Wahrscheinlich können Sie verhindern, paging, wenn Sie als admin oder als das system, aber Sie können nicht verhindern, dass der admin oder system von Lesen Sie Ihr Gedächtnis.Auch wenn Sie irgendwie völlig andere Prozesse blockieren von lese Speicher (die Sie nicht können), einem anderen Prozess könnte eigentlich noch Spritzen einen neuen thread in Ihrem Prozess und liest den Speicher auf diese Weise.

Selbst wenn Sie könnte irgendwie komplett sperren, Ihren Prozess und garantieren, dass das OS würde nie lassen Sie jemand anderes Zugang zu Ihrem Prozess, Sie habe noch nicht den vollen Schutz.Die gesamte OS könnte in einer virtuellen Maschine läuft, könnte angehalten und überprüft zu jeder Zeit.

Sie nicht schützen Sie den Speicherinhalt vom Besitzer des Systems.Hollywood und die Musikindustrie haben Schmerzen wurden, für das seit Jahren.Wenn es möglich wäre, Sie würde schon sein, es zu tun.

Andere Tipps

Auf Unix-Systemen, die Sie verwenden können mlock(2) sperren Speicher-Seiten in den RAM, verhindern, dass Sie sich als ausgelagerter.

mlock() und mlockall() beziehungsweise Schloss Teil oder alle der Berufung Prozess ' s virtual address space in RAM, zu verhindern, dass der Speicher aus wird ausgelagert an den swap-Bereich.

Es gibt ein limit, wie viel Speicher jeder Prozess abschließen können, kann es angezeigt werden ulimit -l und ist, gemessen in Kilobyte.Auf meinem system, der Standardwert ist 32 kB pro Prozess.

Wenn Sie die Entwicklung für Windows, gibt es Möglichkeiten, Sie können den Zugriff auf den Speicher, aber absolut Sperrung der andere ist nicht machbar.Wenn Sie hoffen, ein Geheimnis zu bewahren, Geheimnis, Lesen Writing Secure Code - welche IP Adressen dieses problem ausführlich, aber beachten Sie, dass Sie haben keine Möglichkeit zu wissen, wenn Ihr code ausgeführt wird, die auf einer realen Maschine oder eine virtuelle Maschine.Es gibt eine Reihe von Win32-API-Zeug zum Umgang mit Krypto-Griffe dieser Art von Sache, einschließlich der sicheren Lagerung des Schreckens - das Buch spricht über, dass.Sie können sich an der online - Microsoft CyproAPI für details;die OS-Designern erkennen dieses problem und die Notwendigkeit, halten Sie die Klartext-secure (Lesen Sie wieder Writing Secure Code).

Die Win32 API-Funktion VirtualAlloc die OS-level memory allocator.Es ermöglicht Ihnen, Zugang und Schutz;was Sie tun können, ist, den Zugang zu PAGE_GUARD oder PAGE_NOACCESS, und drehen Sie den Zugang zu etwas freundlicher, während Ihr Programm liest, und setzen Sie es danach, aber das ist nur eine Geschwindigkeits-Buckel, wenn jemand versucht, wirklich schwer zu peek an Ihrem Geheimnis.

In Zusammenfassung, Blick auf die Krypto-APIs auf Ihrer Plattform, Sie werde das problem ansprechen besser als etwas, das Sie hacken selbst.

Wir nehmen das ein bisschen zu einer Zeit:

Ich will erstellen Sie eine Zuweisung, die bietet Speicher mit den folgenden Attribute:

Das ist fair genug.

* cannot be paged to disk.

Das wird schwer werden.Soweit ich informiert bin, können Sie nicht deaktivieren Virtuellen Paging als es ist behandelt durch die OS.Wenn es einen Weg gibt, dann werden Sie Höhlenforschung in den Eingeweiden des OS.

* is incredibly hard to access through an attached debugger

Sie konnte es durch PGP und speichern Sie verschlüsselt im Speicher und entschlüsseln, wie gebraucht.Massive performance-Einbußen.

Die Idee ist, dass dies enthalten sensible Daten (wie Lizenz Informationen), die werden sollten, für den Benutzer unzugänglich.Ich habe fertig die üblichen online-Forschung, und fragte, paar andere Leute, aber ich kann nicht finden, ein guter Ort, zu starten, die auf dieser problem.

Bewahren Sie alle sensiblen Informationen aus der Maschine.Ernst.Don nicht speichern sensibler Daten im Speicher.Schreiben Sie ein benutzerdefiniertes löschen, routine, wird automatisch entfernen Sie alle Daten von alle Zuordnungen, die Sie durchführen.Niemals erlauben, den Allgemeinen Zugang zu einer Maschine mit empfindlichen material auf es.Wenn Sie db-Zugriff, stellen Sie sicher, dass alle Zugriff ist desinfiziert, bevor Sie abfeuern.Nur Personen mit speziellen log-ins zugreifen dürfen.Keine Allgemeine Gruppe zugreifen.

On a side note, welche anderen Methoden sind da der Zugriff auf den Arbeitsspeicher eines anderer Prozess als das anbringen einer debugger?

Nehmen einen dump des Speichers.

installieren Libsodium, verwenden Mittelzuweisung durch #einschließlich <sodium.h>

Bewacht heap-Zuweisungen

Langsamer als malloc() und Freunde, Sie benötigen 3 oder 4 zusätzliche Seiten im virtuellen Speicher an.

void *sodium_malloc(size_t size);

Speicher zu speichern sensible Daten mit sodium_malloc() und sodium_allocarray().Sie müssen zuerst anrufen sodium_init() vor der Verwendung dieser Haufen Wachen.

void *sodium_allocarray(size_t count, size_t size);

Die sodium_allocarray() die Funktion gibt einen Zeiger aus dem zählen von Objekten, die sind die Größe der bytes des Speichers jeder zugegriffen werden kann.Es bietet die gleichen Garantien wie sodium_malloc() aber schützt auch vor arithmetische überläufe, wenn count * size überschreitet SIZE_MAX.

Diese Funktionen hinzufügen guard-Seiten rund um die geschützten Daten zu machen es weniger wahrscheinlich zu sein, zugänglich in einem heartbleed-wie Szenario.

Darüber hinaus der Schutz für den memory-Regionen zugeordnet sind, kann geändert werden, indem die Verriegelung Speicher-Operationen: sodium_mprotect_noaccess(), sodium_mprotect_readonly() und sodium_mprotect_readwrite().

Nach sodium_malloc Sie können verwenden sodium_free() zum entsperren und freigeben von Speicher.An diesem Punkt in Ihrer Implementierung berücksichtigen Nullung der Speicher nach der Verwendung.

null die Speicher nach der Verwendung

void sodium_memzero(void * const pnt, const size_t len);

Nach Gebrauch, sensible Daten überschrieben werden sollen, aber memset() und hand-written code kann automatisch entfernt werden, indem ein optimierender compiler oder vom linker.

Die sodium_memzero () - Funktion versucht, um effektiv zu null-len bytes ab pnt, auch wenn Optimierungen angewendet werden, um den code.

sperren der Speicher-Zuweisung

int sodium_mlock(void * const addr, const size_t len);

Die sodium_mlock() Funktion sperren zumindest len bytes des Arbeitsspeichers ab addr.Dies kann helfen zu vermeiden, tauschen Sie sensible Daten auf der Festplatte.

int sodium_mprotect_noaccess(void *ptr);

Die sodium_mprotect_noaccess () - Funktion macht eine region zugewiesen, mit sodium_malloc() oder sodium_allocarray() zugegriffen werden.Es kann nicht geschrieben oder gelesen werden, aber die Daten sind erhalten.Diese Funktion kann benutzt werden, um vertrauliche Daten zugegriffen werden, außer wenn diese tatsächlich benötigt werden für einen bestimmten Vorgang.

int sodium_mprotect_readonly(void *ptr);

Die sodium_mprotect_readonly () - Funktion markiert einen Bereich zugewiesen mit sodium_malloc() oder sodium_allocarray() as read-only.Versuch zum ändern der Daten verursachen wird, den Prozess zu beenden.

int sodium_mprotect_readwrite(void *ptr);

Die sodium_mprotect_readwrite() Funktion markiert einen Bereich zugewiesen mit sodium_malloc() oder sodium_allocarray() so lesbar und beschreibbar, nachdem er bereits geschützt, mit sodium_mprotect_readonly() oder sodium_mprotect_noaccess().

Was Sie fordern ist behandelt auf OS-Ebene.Sobald die Daten in das Programm ein, haftet es an die ausgelagert werden.

Für den Zugriff auf den Arbeitsspeicher, eine motivierte Person Anhängen können einen hardware-debugger.

@graham

Sie konnte es durch PGP und speichern Sie verschlüsselt im Speicher und entschlüsseln, wie gebraucht.Massive performance-Einbußen.

Dann würden Sie haben zu halten, der Schlüssel im Speicher.Das würde es ein wenig schwieriger, aber definitiv nicht unmöglich.Wer motiviert ist, wird immer noch zu verwalten, um die Daten aus dem Speicher.

Ihre beste Wette ist, etwas umzusetzen ähnlich .NET SecureString-Klasse, und seien Sie sehr vorsichtig auf null, alle Klartext-Kopien Ihrer Daten, sobald Sie fertig sind (vergessen Sie nicht, zu bereinigen, auch wenn Ausnahmen ausgelöst werden).Ein guter Weg, dies mit std::string, und eine solche ist die Verwendung eines benutzerdefinierte Zuweisung.

Unter Windows, wenn Sie CryptProtectMemory (oder RtlEncryptMemory für ältere Systeme), die das Verschlüsselungs-Passwort ist gespeichert in non-pageable (kernel?) Speicher.In meinen Tests diese Funktionen sind verdammt schnell, esp.unter Berücksichtigung der Schutz, den Sie geben.

Auf anderen Systemen, die ich mag zu verwenden, Blowfish, da es eine gute Mischung zwischen Geschwindigkeit und Kraft.Im letzteren Fall haben Sie zufällig erstellen Sie Ihr eigenes Kennwort (16+ Byte Entropie für Blowfish) bei Programm-Start.Leider, es gibt nicht eine ganze Menge, die Sie tun können, um zu schützen, das Passwort, ohne OS-Unterstützung, obwohl Sie könnte verwenden die Allgemeinen obfuscation-Techniken zum einbetten von einem hart-codierten salt-Wert in Ihrer ausführbaren Datei, die Sie kombinieren können mit dem Passwort (jedes kleine bisschen hilft).

Insgesamt ist diese Strategie ist nur ein Teil eines umfassenderen defense-in-depth-Ansatz.Beachten Sie auch, dass einfache Fehler wie Pufferüberläufe und nicht die Desinfektion der Programm-Eingabe bleiben bei weitem die häufigsten Angriffsmethoden.

Sie schützen kann Speicher Inhalt vom Besitzer des Systems.Hollywood und die Musikindustrie haben Schmerzen wurden, für das seit Jahren.Wenn es möglich wäre, Sie würde schon sein, es zu tun.

Haben Sie schon einen Blick auf Vista (und höher) Geschützte Prozesse (direkte .doc download).Ich glaube, das Betriebssystem, den verstärkten Schutz ist mit freundlicher Genehmigung von der entertainment-Industrie.

@Derek:Ach, aber mit "trusted computing", die Sie verwenden können, memory curtaining!:-P</devils-advocate>

@roo

Ich hatte wirklich gehofft, dass es war möglich, und ich hatte bisher nur nicht gefunden.Ihr Beispiel nur mir klar gemacht, daß es genau das ist, was wir versuchen zu tun - erlauben nur den Zugriff auf Dateien, die im Zusammenhang mit unserem Programm und so erhalten Sie die IP.

Ich denke, ich muss akzeptieren, dass es keine wirklich sichere Methode zum speichern jemanden, der Dateien auf einem anderen computer, vor allem, wenn an einem gewissen Punkt der Zugriff ist erlaubt, die Datei durch den Eigentümer.

Das ist definitiv das problem.Sie können die store-etwas sicher, solange Sie nie den Zugriff gewähren, aber sobald Sie Zugriff gewähren, Ihr die Kontrolle ist Weg.Man kann es ein bisschen schwieriger, aber das ist alles.

@Chris

Ach, aber mit "trusted computing", die Sie verwenden können, memory curtaining!:-P

Aber dann haben Sie tatsächlich bereit zu zahlen, für einen computer einer anderen Person gehört.:p

@Derek Park

Er sagte nur schwieriger, aber nicht unmöglich.PGP würde es schwieriger, aber nicht unmöglich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top