getpass -> passwort aus speicher löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
michel_
User
Beiträge: 6
Registriert: Freitag 3. Juni 2011, 17:03

Ich verwende in einem Python Skript die getpass.getpass() Funktion um ein Passwort einzugeben:

Code: Alles auswählen

pass = getpass.getpass("")
Das PW möchte ich im Anschluss unwiderruflich aus dem Speicher löschen, ist das in Python möglich?

Was ich bisher im Netz gefunden hab hörte sich eher nach "Nein" an, da Python keinen direkten Speicherzugriff hat.

Momentan überschreib ich die Variable 'pass' in der ich das Ergebnis der Funktion speichere einfach und hoffe das nichts übrig bleibt. Der Rückgabewert der Funktion an sich schwirrt dabei denke ich aber immer noch irgendwo rum?


EDIT:
hab gerade was gefunden, mit ctypes soll es möglich sein den speicher zu leeren:
http://stackoverflow.com/questions/9826 ... 525#983525

Was haltet ihr von dem Skript?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

michel_ hat geschrieben: Was ich bisher im Netz gefunden hab hörte sich eher nach "Nein" an, da Python keinen direkten Speicherzugriff hat.
Das ist auch richtig so.
michel_ hat geschrieben: Momentan überschreib ich die Variable 'pass' in der ich das Ergebnis der Funktion speichere einfach und hoffe das nichts übrig bleibt. Der Rückgabewert der Funktion an sich schwirrt dabei denke ich aber immer noch irgendwo rum?
Wenn das Passwort intern durch einen String repräsentiert wird, dürfte das "Überschreiben" genau gar nichts nützen, da Strings immutable sind. Insofern dürfte ein neuer Speicherbereich durch den Interpreter allokiert werden, wenn Du einen neuen String an den Namen bindest. Allerdings sind das auch Implementierungsdetails, auf die man sich eh nicht verlassen kann und sollte.

Du kannst aber per `del` den Namen löschen und dadurch indirekt erreichen, dass das bis dato an diesen Namen gebundene Objekt vom Garbage Collector gelöscht wird. Aber Vorsicht: Das klappt nur, wenn das Objekt an keinen anderen Namen mehr gebunden ist:

Code: Alles auswählen

In [94]: pw = getpass.getpass("PW:")
PW:

In [95]: pw
Out[95]: 'secret'

In [96]: backup = pw

In [97]: del pw

In [98]: backup
Out[98]: 'secret'
`pass` ist übrigens ein Schlüsselwort und kann nicht als Name verwendet werden - Dein gezeigter Code kann also nicht funktionieren ;-)

Ich denke aber mal, dass Du Dir da zu viel Gedanken machst. Wo siehst Du dabei ein Sicherheitsrisiko, welches in anderen technischen Lösungen nicht auch vorhanden wäre?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
michel_
User
Beiträge: 6
Registriert: Freitag 3. Juni 2011, 17:03

pass war auch nicht meine verwendete variable, hab das nur kurz zusammengewurschdeld *G*

muss grade leider unterwegs ich schreib morgen nochmal was dazu... danke schonmal für die hilfe!
LivingOn
User
Beiträge: 33
Registriert: Montag 11. August 2008, 07:53

Der Garbage Collector gibt auch nur den allozierten Speicher frei, überschreibt aber nicht dessen Inhalt. Somit wird das Passwort auch weiterhin im Speicher lesbar sein.

Ich möchte Hyperion aber zustimmen, Du machst Dir wahrscheinlich zu viele Gedanken. Der Speicherbereich ist an deinem Useraccount gebunden und andere "gleichberechtigte" Benutzer können ihn nicht auslesen. Einzig der Administrator hat Zugriff und gegen den hast Du so oder so verloren ;-)
michel_
User
Beiträge: 6
Registriert: Freitag 3. Juni 2011, 17:03

Dann enthüll ich mal den Sinn des Skripts:

Beim Systemstart wird dabei ein Passwort eingegeben, mit welchem mehrere TrueCrypt Volumen per Kommandozeilenbefehl (über os.system an die cmd von windows geschickt) eingehängt werden sollen.

TrueCrypt selbst verwende ich dafür nicht, da ich keine Lust habe jedes Volumen separat mit Passwort einzubinden (jedes volumen hat das gleiche PW bzw. eines welches sich per skript ergänzt)

Wenn das Passwort aber irgendwo hängen bleibt ist die ganze Datenverschlüsselung sowieso für die Katz...
deets

Wenn jemand den Prozess mit dem Passwort auslesen kann, dann hat er auch das Recht, auf deine gemounteten TrueCrypt-Volumes zuzugreifen. Womit das Ganze dann erst recht fuer die Katz' ist. Insofern - da machste dir zuviel Kopp.
michel_
User
Beiträge: 6
Registriert: Freitag 3. Juni 2011, 17:03

Wenn ich ehrlich bin geht es mir mehr darum, für den unwahscheinlichen Fall der Fälle wenn mal Besuch von der Exekutive ansteht, dass dann das PW nicht iregndwie noch auslesbar ist, wenn sie direkten Zugriff auf meine Hardware haben (sei der Rechner zu dem Zeitpunkt noch angeschaltet oder auch nicht).
deets

Auch da gilt ja dieselbe Ueberlegung: wenn jemand auf deinen Rechner zugreifen kann, dann kann er auch einfach ne USB-Platte anstoepseln und kopiert deine gemounteten Volumes rueber. Die Muehe, sich ein proprietaeres Skript vorzunehmen, das unter Umstaenden vielleicht ein paar interessante Bytes enthaelt - das macht doch keiner.

Ausserdem verstehe ich deine Bedenken eh nicht: das Skript beendet sich doch nach den mounts, oder nicht? Dann geht der Speicher zurueck an's OS, und gut ist.
michel_
User
Beiträge: 6
Registriert: Freitag 3. Juni 2011, 17:03

Das ist mir schon klar mit den Daten rüberkopieren wenn sie gemountet sind.

Darum gehts mir auch nicht.

Wie gesagt: Will lediglich auf der sicheren Seite vor der Exekutive sein, mehr nicht.

Ja das Skript beendet sich danach, dann wird der Speicher wieder frei... Nennen wir es "paranoid" dass ich das PW im Speicher selbst noch gerne löschen möchte *G*..
deets

Tut mir leid, aber fuer das Level an Paranoia hilft nur noch die Speicherriegel aus dem Rechner zu rupfen und in die Mikrowelle zu legen - gleich nachdem du das Passwort eingegeben hast.

Denn genausogut kann (und wird im Zweifel) Windows deine Tastatureingaben in irgendwelchen Puffern speichern. Und die kannst du ja auch nicht ueberschreiben.

Und wenn das Programm beendet ist, und der Speicher an das OS zurueckgegeben, dann braucht man dafuer schon einen Hacker der aus der DNA von Kevin Mitnick & Geohot gespliced wurde. Sowie einen Mentalisten, der dir ansieht, welches Programm du ausgefuehrt hast, um da irgendwelche mounts durchzufuehren. Dann noch ein Passwort, das auch nach einem Passwort aussieht - "geheim123" oder so, damit man es im Speicherdump auch erkennen kann. Ausserdem darf kein anderes Programm mehr gestartet werden. Ich koennte jetzt noch etwas weitermachen... aber ich behaupte mal, Oberwachtmeister Pasulke ist keines von diesen Dingen bewusst. Der rupft das Ding einfach von der Steckdose.

Anders gesagt: wenn du ein solcher hi-profile-Krimineller bist, dass sie ihre MAD oder BKA oder WasAuchImmer-Leute auf dich ansetzen, ist dein ganzes Zimmer schon laengst verwanzt und ein Keylogger installiert.
BlackJack

@michel_: Den Speicher überschreiben reicht nicht. Du müsstest auch dafür sorgen, dass der Speicher in dem das Passwort steht, nicht in die Auslagerungsdatei auf die Festplatte geschrieben werden kann. Denn dann ist es dort vielleicht sogar nach dem Ausschalten des Rechners auslesbar.

Starten über `os.system()` klingt danach als müsstest Du das Passwort als Argument übergeben!? Dann gibst Du es an das System weiter und das kopiert es in Speicherbereiche auf die Du keinen Zugriff hast. Die kannst Du selbst also auch gar nicht wieder löschen/überschreiben. Und sie könnten ausgelagert werden. Ausserdem ist das Passwort dann für die Zeit, die das Programm läuft, für jeden sichtbar der sich die Prozessliste anzeigen lassen kann. Sowas ist auf einem Mehrbenutzersystem tatsächlich ein Problem! Sollte man nicht machen.

Wenn die Exekutive *wirklich* hinter Dir her ist, kopieren sie Dir einfach ein bisschen KiPo auf den beschlagnahmten Rechner. Widerstand ist zwecklos. :twisted:
michel_
User
Beiträge: 6
Registriert: Freitag 3. Juni 2011, 17:03

OK, ich habe verstanden, und nein ich werde nicht gesucht ^^

Danke soweit für die Hilfe *G*
Antworten