Laden...

Arbeitsspeicher und Sicherheit

Erstellt von Jack_AI vor 15 Jahren Letzter Beitrag vor 14 Jahren 2.357 Views
J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 15 Jahren
Arbeitsspeicher und Sicherheit

Hallo.

Mir ist die Sicherheit meiner C#-Programme sehr wichtig.

Nun ist mir eingefallen, dass sich z.B. per Zeigern aus C++ der Arbeitsspeicher auslesen und manipulieren lässt. Deshalb würde ich gerne wissen, wie ich meine Variablen vor Manipulation schützen kann. Hat das etwas mit der Sichtbarkeit (private, public, ...) von Variablen zu tun?

Grüße und Danke im Voraus,
Jack

1.130 Beiträge seit 2007
vor 15 Jahren
  1. Bei .net-programmen liegen die Variablen wegen dem garbage collector nicht an einer festgelegten position.
  2. Speicherschutz: http://de.wikipedia.org/wiki/Multitasking#Pr.C3.A4emptives_Multitasking
    Man kann allerdings ein Speicherabbild erstellen lassen (z.B. durch Systemfehler) oder die Auslagerungsdatei auslesen.

Mit C++ Zeigern kann man soweit ich weiß nicht ohne weiteres den Arbeitsspeicher anderer Prozesse auslesen.

private und public:
In beiden Fällen liegt der Wert im Arbeitsspeicher. Es macht also keinen unterschied im Hinblick auf Speicherabbilder/Zeiger.
Man kann aus dem selben Prozess heraus sogar mit Reflection private Variablen auslesen (wenn man einen Verweis auf das Objekt hat, das sie enthält):http://bytes.com/forum/thread524679.html

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo. Jack_AI,

gegen das auslesen des eigenen Arbeitsspeichers kann man sich soweit ich weiß nicht schützen, aber man kann versuchen, sicherheitsrelevante Informationen möglichst nur verschlüsselt abzulegen bzw. entschlüsselte Versionen davon schnellstmöglich wieder zu löschen.

Siehe auch SecureString

herbivore

87 Beiträge seit 2006
vor 14 Jahren

Hallöle,

jetzt hab ich mir den SecureString mal angeschaut. Aber so richtig schlau werde ich nicht daraus.

  1. Warum muss man jedes char einzeln und keinen ganzen string auf einmal rein packen? das jetzt nich weiter ein prob, fix ne foreach schleife geschrieben und fertig, aber komisch is das trotzdem.

  2. Wie bekomme ich die chars, den ganzen string da wieder raus wenn ich den brauche? die ToString() Methode is nich überladen und bringt nur "System.Security.SecureString" von der Object.ToString() Methode. Jede andere Methode oder Eigenschaft scheint hier auch keine Hilfe zu sein.

  3. was mache ich wenn ich zahlen oder allgemein andere Objekte verschlüsselt
    ablegen will? (im RAM)

  4. wenn ich den SecureString irgendwann mal als einen nativen string hatte is der doch dann auch zwecks der String-Optimierung immer noch im RAM?

  5. selbst wenn der GC dann mal aufräumen sollte, heißt das ja noch lange nich das die stelle mit dem string im RAM auch ihre binären werte verloren hat, ähnlich wie das bei Festplatten und Dateien der Fall ist?

  6. zu 5. kann man dem GC sagen ersoll den freien Bereich im RAM (welcher noch zum assembly gehört mit binären 0 flushen oder sowas? so das zumindest wenn das Prog beendet wurde der RAM sauber ist?

Für mich bedeutet das immer das man da egl nich wirklich was machen kann. Ich glaube aber mal gelesen zu haben das es ab Vista wohl einen Dienst oder ähnlich gibt der den Zugriff auf den RAM welcher nicht selbst belegt oder von andern Prozessen verwendet wird unterbinden soll. Kann das jmd bestätigen??

MfG

TiltonJH

"In der Informatik geht es genauso wenig um Computer wie in der Astonomie um Teleskope."
Edsger W. Dijkstra

The Humble Programmer by Edsger W. Dijkstra

L
667 Beiträge seit 2004
vor 14 Jahren

Man kann sich schon schützen, man kann bspw. Linux benutzen 😉

"It is not wise to be wise" - Sun Tzu

1.361 Beiträge seit 2007
vor 14 Jahren

@Linux,
was für eine Antwort ^^

Ne mal im Ernst.
@6
Hier musst du dir keine Sorgen machen. Du bist nicht der erste, der an so etwas denkt. In Windows' sehr ausgeklügeltem Sicherheitskonzept (das mein ich ernst) wird dafür gesorgt, dass fremde Prozesse keine Memory-Pages bekommen, die schon ein anderer hatte - Zumindest nicht ohne diese vorher komplett mit Nullen gefüllt zu haben. (Stichwort: Zero page writer)

Solche sachen wie: PC resetten und danach das pageFile auslesen könnte man zum einen durch nicht-auslagern der sicherheitsrelevanten Memory-Seiten verhindern. Jedoch ist das Kind dann eigentlich eh schon in den Brunnen gefallen - wenn der Angeifer physischen Zugriff zum System hat.

Das mit dem Dienst kann ich im übrigen nicht bestätigen!
Wenn man Administrator unter Windows NT/XP/2k3/Vista/7/... hat man das DebugPrivilege, mit dem ich fremde Prozesse Debuggen und insbesondere deren Speicher lesen/schreiben darf.
Hat man dieses Privileg nicht (kein Admin), dann hat man auch keine Chance in fremden Adressräumen zu lesen - egal ob C#/C/C++ mit Pointern oder ohne.

Verschärfend gibt es aber WinVista noch sogenannte Protected Processes, in denen man selbst mit dem DebugPrivilege nicht lesen kann. Wurde speziell für das DRM eingeführt, damit ich eben nicht einen MediaPlayer, der gerade geschützte Inhalte abspielt, manipulieren kann. Jedoch darf man als Admin ja eigentlich alles. Also auch Treiber ins System einspielen, die im KernelMode diese Sperre umgehen...

Kurz und knapp: Ist der User wirklich als "User" unterwegs, brauchst du keine Angst haben. Ist er als "Admin" unterwegs, hast du eh verloren - in jeder Hinsicht. Du kannst es ihm lediglich erschweren.
(PS: Die Linux-Sicherheit hilft dir auch nicht, wenn man als root unterwegs ist)

beste Grüße
zommi

87 Beiträge seit 2006
vor 14 Jahren

@Lynix
klassische Antwort, das nächte mal wenn einer kommt und mit linux ein prob hat werde ich den vorschlag machen auf windows umzusteigen 😉

@zommi
danke für deine antwort, aber von angst kann hier keine rede sein, mir schon klar das schloss und riegel nicht helfen wenn der einbrecher schon im haus is und der beste tresor nix taugt wenn er immer offen steht usw... 😉

ich wollte nur mal fragen ob ich vlt was übersehn habe und das hab ich offensichtlich nicht, schön zu wissen. 😃

das bringt mich aber zurück zu den SecureString. welchen nutzen haben dann diese Objecte? bzw wie verwendet man die wenn man an den inhalt eh nich wieder ran kommt?

MfG
TiltonJH

"In der Informatik geht es genauso wenig um Computer wie in der Astonomie um Teleskope."
Edsger W. Dijkstra

The Humble Programmer by Edsger W. Dijkstra

3.971 Beiträge seit 2006
vor 14 Jahren

Vorweg, bitte hier keine Diskussion über Linux oder Windows entfachen. Bringt eh nix! Danke

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Gelöschter Account
vor 14 Jahren

das bringt mich aber zurück zu den SecureString. welchen nutzen haben dann diese Objecte? bzw wie verwendet man die wenn man an den inhalt eh nich wieder ran kommt?

der umgang mit dem securestring kannst du der msdn entnehmen.

Beachten Sie, dass SecureString keine Member besitzt, die den Wert von SecureString überprüfen, vergleichen oder konvertieren. Das Fehlen solcher Member erleichtert es, den Wert der Instanz vor versehentlicher oder böswilliger Verfügbarmachung zu schützen. Verwenden Sie geeignete Member der System.Runtime.InteropServices.Marshal-Klasse, z. B. die SecureStringToBSTR-Methode, um den Wert eines SecureString-Objekts zu ändern.

gilt auch für das vergleichen oder extrahieren. sinn macht es daher, das du den lesbaren echten wert nur dann kurzzeitig irgendwo in deinem speicher hast, wenn du ihn auch wirklich brauchst. jedesmal wenn du ihn dir wiederholst ist er wieder irgendwo anders im speicher usqw..