Ich arbeite gerade an einem Sicherheitsskript und es scheint, dass ich ein Problem mit PHP und der Art und Weise, wie PHP Speicher verwendet, erhalte.
meine.php:
%Vor%Und jetzt führe ich das Skript aus:
%Vor%Bevor das Skript beendet wird (während des Schlafens), erzeuge ich eine Core-Datei, die das SIGSEV-Signal an das Skript sendet
%Vor%Ich überprüfe die Corefile:
%Vor%Hier ist ein Auszug des Ergebnisses:
%Vor%Ich verstehe, dass die Erinnerung gerade mit dem Ungesetzten freigegeben und nicht "zerstört" wird. Die Daten werden nicht wirklich entfernt (ein Aufruf der free () -Funktion)
Wenn jemand also den Speicher des Prozesses selbst nach der Skriptausführung ablegt, könnte er $ my_secret_key lesen (bis der Speicherplatz von einem anderen Prozess überschrieben wird)
Gibt es eine Möglichkeit, dieses Speichersegment des gesamten Speicherbereichs nach der Ausführung des PHP-Skripts zu überschreiben?
Danke an alle für Ihre Kommentare.
Ich habe schon jetzt, wie Speicher vom System verwaltet wird.
Auch wenn PHP nicht malloc und free verwendet (aber einige bearbeitete Versionen wie emalloc oder efree), scheint es (und ich verstehe, warum), dass es einfach unmöglich ist, dass PHP nach der Freigabe von nicht erlaubtem Speicher "trasht".
> Die Frage war eher Neugierde und jeder Kommentar scheint zu bestätigen, was ich vorher tun wollte: schreibe ein kleines Stück Code in eine speicherbewusste Sprache (c?), um mit diesem speziellen Teil umzugehen, indem du einen einfachen String mit malloc vergibst Überschreiben mit XXXXXX nachdem THEN freigegeben wurde.Danke an alle
J
Sie scheinen zu wenig Verständnis dafür zu haben, wie Speicherverwaltung im Allgemeinen und speziell in PHP funktioniert.
Eine Diskussion der verschiedenen Hauptpunkte ist überflüssig, wenn Sie bedenken, was das Sicherheitsrisiko hier ist:
Also, wenn jemand den Speicher des Prozesses ausgibt, selbst nach der Skriptausführung
Wenn jemand auf den Speicher eines Programms zugreifen kann, das unter einer anderen UID läuft, dann haben sie Root-Zugriff und können das Ziel auf so viele andere Arten kompromittieren - und es ist egal, ob es PHP-Skript, ssh, ein Oracle-DBMS ist. ...
Wenn jemand auf den Speicher zugreifen kann, der zuvor von einem Prozess belegt wurde, der jetzt beendet wurde, dann haben sie nicht nur Root, sie haben bereits den Kernel kompromittiert.
Sie haben offenbar eine wichtige Lektion über die Bedeutung von Computern durch "Löschoperationen" verpasst.
Sehen Sie, es ist niemals machbar, dass der Computer den Speicher ausfüllt, sondern stattdessen "vergisst", dass sie diesen Speicher verwenden.
Mit anderen Worten, wenn Sie Speicher löschen möchten, müssen Sie ihn definitiv überschreiben, genau wie @hakre vorgeschlagen hat.
Das heißt, ich sehe kaum den Sinn Ihres Skripts. PHP ist einfach nicht für die Art von Dingen gemacht, die Sie tun. Sie sind wahrscheinlich besser dran mit einer kleinen dedizierten Lösung als mit PHP. Aber das ist nur meine Meinung. Ich denke.
Ich weiß nicht, ob das funktioniert, aber wenn Sie in Ihren Tests können, fügen Sie bitte diese Zeilen hinzu, um das Ergebnis zu sehen:
%Vor%Und ich frage mich, ob oder nicht läuft
%Vor%macht einen Unterschied. Sogar die Werte sind frei, sie können sich immer noch im Speicher befinden (der Skripte pid oder sogar irgendwo anders im Speicherbereich).
Ich würde versuchen, ob das Überschreiben von Speicher mit einigen Daten Ihre ursprünglichen Positionen von Variablen schließlich löschen würde:
%Vor%Sobald php den Speicher freigibt, nehme ich an, dass mehr Zuweisungen den gleichen Speicherort erhalten. Es ist jedoch kaum ausfallsicher.