Standard-C-Verwendung von getenv und sichere Praktiken
Ich bin versucht, zu schreiben C-code, die einige ENV-Variablen, die in einer UNIX-Umgebung. Die Frage ist: Könnte das Lesen der Variablen (zum Beispiel getenv()) verursachen buffer overflow? Außerdem, wie finde ich die Grenze des env-variable Größe für meine Plattform ? Zum Beispiel die header-Datei?
Schließlich, was sind die sicherste code Praktiken, die in der Lesung Umgebung geliefert Variablen?
Eine der sichersten ist nicht vorausgesetzt, Sie werden immer finden, dass die variable ' r suchen, da die env-Variablen können gesetzt werden/unsetted durch den shell-Benutzer.
"ist mit getenv() sicher nicht zu bekommen übergelaufen" Nicht zu überlaufen was? Sie haben nicht geliefert, ein Puffer, so dass
Ich überarbeitete die Frage
Beachten Sie, dass die C-Norm sagt string zeigte auf möglicherweise überschrieben werden durch einen nachfolgenden Aufruf
"ist mit getenv() sicher nicht zu bekommen übergelaufen" Nicht zu überlaufen was? Sie haben nicht geliefert, ein Puffer, so dass
getenv
muss aufpassen, dass sich.Ich überarbeitete die Frage
Beachten Sie, dass die C-Norm sagt string zeigte auf möglicherweise überschrieben werden durch einen nachfolgenden Aufruf
getenv()
, das ist nicht das, was die meisten Menschen erwarten, dass (noch ist es gängige Praxis in Unix-Systemen für das problem zu sein). So streng, Sie brauchen, um eine Kopie aller Umgebungsvariablen zurückgegeben getenv()
vor dem Aufruf getenv()
wieder. Es gibt keine header, die direkt definiert einen Grenzwert für die Größe des env-var-Namen oder-Werte. Auf POSIX, der ARG_MAX
limit (was Häufig ist 256 KiB) ist die Gesamtgröße der "Umwelt-plus-Argumente', aber das ist ziemlich groß und nicht immer eine Feste Begrenzung.InformationsquelleAutor user1944224 | 2013-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen eine Umgebungsvariable mit
getenv()
wird nicht zu einem Puffer-überlauf.Unter Linux geerbt hat, Umgebungsvariablen und Ihre Werte befinden sich in den Adressbereich des Prozesses durch den kernel während
exec()
. Diegetenv()
- Funktion gibt einen Zeiger auf diese vorhandenen Daten. Da es nicht das kopieren von Daten, einen Puffer gibt es nicht, und es kann keinen Puffer-überlauf.Wenn Sie versuchen, geben zu viele Umgebungsvariablen, um einen neuen Prozess, der
exec()
signal für dieE2BIG
Fehler.Sicherheitsbedenken
Gibt es nicht wirklich einen buffer overflow sorgen mit Umgebungsvariablen.
Den Sicherheitsbedenken Zentrum rund um die Tatsache, dass Sie sollten nicht Vertrauen in die Inhalte der Umwelt. Wenn Ihr Programm setuid (oder setgid, etc.) dann die Umwelt ist eine Angriffsmethode. Der Benutzer kann
PATH
oderLD_PRELOAD
oder anderen Variablen, die in bösartiger Weise.Aber es ist selten zu schreiben, mit setuid-Programme. Das ist eine gute Sache, da gibt es so viele Gründe, warum es schwierig ist, um setuid-Programme sicher.
getenv
gibt einechar*
und nicht einconst char*
. Dies bedeutet, dass es möglich sein sollte, schreiben Sie an die Adresse zurückgegeben (und somit könnte es zu einem Pufferüberlauf).Sie sind eigentlich nicht zu schreiben. Es wäre
const char *
aber es ist eine alte API und machen esconst
jetzt würde brechen Programme.Natürlich, Sie können schreiben, wenn Sie wirklich wollen, um die Umwelt zu ändern, die Art und Weise. Aber der buffer overflow, würde Ihr code nicht in
getenv()
.Es könnte sinnvoll sein, zu empfehlen
setenv
deine Antwort. 🙂Das ist irrelevant für die Frage. Die Frage ist, über Lesen Umgebungsvariablen. Zitat: "Könnte das Lesen der Variablen (zum Beispiel getenv()) verursachen buffer overflow?"
InformationsquelleAutor Dietrich Epp
Diesem Programm vorbei ist das argument der getenv () - Funktion seine Gültigkeit bedeutet, bekommen die
Ausgabe
Dies ist nicht die Umgebungsvariable mittels getenv () - Funktion NULL zurück.
main()
wie inint main(void)
. Auf die gesamte, vermeiden Sie Globale Variablen wiebuf
; doppelt vermeiden, nicht verwendete Globale Variablen (wiebuf
). Ich empfehle, mitreturn(0);
am Endemain()
. Sortieren Sie die Einrückung. Verwenden Sie ein Leerzeichen zwischen#include
und<stdio.h>
; das ist der Weg, die standard schreibt solche Zeilen. Streng, Sie könnten am Ende mit einem null-Zeiger vongetenv()
, in welchem Falle der Druck, ist es nicht zuverlässig. Alles in allem, ein bisschen chaotisch und leichtsinnig.Die getenv () - Funktion argument ist ein Zeiger und Zeiger wies auf eine Schnur, und wenn falsch bedeutet getenv () - Funktion NULL zurück.also, was ist die falsche Methode? ich kann nicht verstehen,
Ich bin mir nicht sicher, was Sie Fragen, aber wenn Sie das tun:
printf("NONEXISTENT=%s\n", getenv("NONEXISTENT"));
und die Umgebungsvariable$NONEXISTENT
nicht vorhanden ist, erhalten Sie möglicherweise ein core dump. Einige Versionen vonprintf()
sind vor Ort ein null-Zeiger ist und etwas ausdrucken, wie(null)
(das ist von Mac OS X 10.7.5), aber es könnte Abstürzen statt. Für die Sicherheit, die Sie brauchen, um so etwas wie:char *env = getenv("NONEXISTENT"); printf("NONEXISTENT=%s\n", var, (env == 0) ? "<undefined>" : env));
zu gewährleisten, gibt es kein Absturz. Drucken einer null-pointer als string ist Undefiniertes Verhalten, um unter allen Umständen vermieden werden.InformationsquelleAutor loganaayahee
Hängt davon ab, was du meinst, durch "Lesen". Einfach anrufen
getenv
verursachen keine Probleme. Allerdings, wenn Sie versuchen, kopieren Sie den zurückgegebenen string in einen Puffer, von einer Art, und Sie prüfen nicht die Grenze des Puffers, Sie könnten einen buffer-overflow. Die zurückgegebene Zeichenfolge durchgetenv
groß sein kann, mit keine Obergrenze anderer als der verfügbare Speicher, der Ihr system zuzuordnen entscheidet die Umwelt.Dies ist nicht anders als jeder andere string input, den Sie bekommen kann -- hüten Sie sich vor der Verwendung
strcpy
undsprintf
da Sie nicht überprüfen Sie die Größe des Ausgabe-Puffers.InformationsquelleAutor Chris Dodd
Müssen Sie vorsichtig sein mit der Umwelt, insbesondere, wenn Sie wollen, übergeben Sie an Kind-Prozesse. Zum Beispiel, die Umwelt, enthalten soll, ist nur ein Wert für jede variable, aber es ist einfach, eins zu erstellen, die mehrere enthält, löschen Sie das erste, und übergeben Sie das Ergebnis an, ein anderer wird ausgesetzt werden. Wenn Sie möchten, zu bereinigen, die Umwelt für die Kinder schaffen es aus dem nichts und nicht durch löschen von Werten aus, die Sie haben. David Wheeler hat einen Leitfaden für die sichere Programmierung in Unix/Linux seine website.
InformationsquelleAutor vonbrand