Warum ist strncpy unsicher?
Ich bin auf der Suche, um herauszufinden, warum strncpy gilt als unsicher. Hat jemand irgendeine Art von Dokumentation, die auf dieser oder Beispiele für ein exploit, der es zu benutzen?
InformationsquelleAutor der Frage stimms | 2009-05-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf diese Website; es ist eine ziemlich ausführliche Erklärung. Grundsätzlich
strncpy()
erfordert nicht NUL Kündigung, und ist daher anfällig für eine Vielzahl von exploits.InformationsquelleAutor der Antwort Tim
Das ursprüngliche problem ist natürlich, dass strcpy(3) war nicht eine Speicher-sicheren Betriebso kann ein Angreifer liefern einen string länger als der Puffer überschrieben würde, code auf dem stack, und wenn das sorgfältig arrangiert wird, beliebigen code ausführen könnte vom Angreifer.
Aber strncpy(3) hat ein anderes problem, Sie liefern nicht die null-Terminierung in jedem Fall zum Ziel. (Stellen Sie sich eine Quell-Zeichenfolge länger als der Ziel-Puffer.) Künftige Operationen können erwarten konformen C nul-terminierte strings zwischen gleichgroßen Puffern und Fehlfunktion der nachgeschalteten wenn das Ergebnis kopiert noch Dritten Puffer.
Verwendung von strncpy(3) ist besser als strcpy(3) aber Dinge wie strlcpy(3) sind noch besser.
InformationsquelleAutor der Antwort DigitalRoss
Sicher strncpy verwenden, müssen Sie entweder (1) manuell-stick ein null-Zeichen auf den Ergebnis-Puffer, (2) wissen, dass der Puffer endet mit einer null im Voraus und pass (Länge-1) , strncpy, oder (3) wissen, dass der Puffer nie kopiert werden, mithilfe einer Methode, die nicht gebunden, deren Länge an die Länge des Puffers.
Es ist wichtig zu beachten, dass strncpy wird null-füllen Sie alles in den Puffer Vergangenheit die kopierte Zeichenfolge, während andere Länge-begrenzt strcpy Variante nicht. Dies kann in einigen Fällen eine Leistung in Anspruch, aber in anderen Fällen ist ein Sicherheits-Vorteil. Zum Beispiel, wenn man verwendet strlcpy kopieren "supercalifragilisticexpalidocious" in einen Puffer und dann zu kopieren "es", die Puffer halten würde "^ercalifragilisticexpalidocious^" ("^" vertreten eine null-byte). Wenn der Puffer kopiert wird, um ein fixed-size-format, die zusätzliche Daten-tag zusammen mit ihm.
InformationsquelleAutor der Antwort supercat
Die Frage beruht auf einer "geladen" - Prämisse, die macht die Frage selbst ungültig.
In der unteren Zeile ist hier, dass
strncpy
ist nicht als unsicher und wurde nie als unsicher. Den nur Ansprüche von "Unsicherheit" verbunden werden können, dass die Funktion die breiten Forderungen der Allgemeinen Unsicherheit der C-Speicher-Modell und C-Sprache selbst. (Aber das ist natürlich ein ganz anderes Thema).Im Bereich der C-Sprache der Irrglaube, dass eine Art "Unsicherheit" innewohnt
strncpy
ist abgeleitet von der verbreiteten dubiosen Muster mitstrncpy
für "sichere Zeichenfolge kopieren", d.h. etwas, das diese Funktion nicht hat, und nie gedacht gewesen. Eine solche Nutzung ist in der Tat sehr fehleranfällig. Aber selbst wenn Sie einen Gleichstellungs-Zeichen zwischen "sehr fehleranfällig" und "unsicher", es ist immer noch eine usage-problem (D. H. ein Mangel an Bildung-problem) nichtstrncpy
problem.Grundsätzlich kann man sagen, dass das einzige problem mit
strncpy
ist eine unglückliche Benennung, die macht-Neuling, Programmierer davon ausgehen, dass Sie verstehen, was diese Funktion tut, anstatt wirklich zu Lesen der Beschreibung. Blick auf den Namen der Funktion ein unfähiger Programmierer geht davon aus, dassstrncpy
ist eine "sichere version" vonstrcpy
während in Wirklichkeit diese zwei Funktionen sind völlig unabhängig.Genau den gleichen Anspruch an die division operator für ein Beispiel. Wie die meisten von Euch wissen, ist eine der am meisten Häufig gestellte Fragen über die Sprache C geht, wie "bin ich davon ausgegangen, dass
1/2
bewerten zu0.5
aber ich habe0
statt. Warum?" Doch wir können nicht behaupten, dass der divisionsoperator ist unsicher, nur weil die Sprache Anfänger neigen dazu, zu interpretieren sein Verhalten.Für ein anderes Beispiel, wir rufen Sie nicht pseudo-random number generator-Funktionen "unsicher", nur weil unfähige Programmierer sind oft unangenehm überrascht von der Tatsache, dass Ihr Ausgang ist nicht wirklich zufällig.
Genau so ist es mit
strncpy
Funktion. Genauso wie es Zeit braucht, für die Anfänger-Programmierer zu lernen, was pseudo-Zufallszahlen-Generatoren tatsächlich tun, es dauert Zeit zu lernen, wasstrncpy
tatsächlich tut. Es braucht Zeit, um zu lernen, dassstrncpy
ist ein Konvertierung Funktion, bestimmt für die Umwandlung null-terminiert Saiten fester Breite strings. Es braucht Zeit, um zu lernen, dassstrncpy
absolut nichts zu tun hat mit "safe-string kopieren" und können nicht sinnvoll für diesen Zweck verwendet.Zugegeben, es dauert in der Regel viel länger für eine Sprache, die Schüler lernen den Zweck von
strncpy
als Dinge zu klären mit dem Divisionszeichen. Allerdings ist dies eine Grundlage für eine "Unsicherheit" Forderungen gegenstrncpy
.P. S. Das CERT-Dokument verknüpft, in der akzeptierten Antwort gewidmet ist genau das: zu zeigen, die Unsicherheiten der typische inkompetente Missbrauch von
strncpy
Funktion als "sichere" version vonstrcpy
. Es ist in keiner Weise beabsichtigt, zu behaupten, dassstrncpy
sich irgendwie unsicher.InformationsquelleAutor der Antwort AnT
Schlimmsten situation tritt auf, wenn Quell-und Ziel-Puffer-Speicher überschneidungen zu einander. So vermeiden Sie die Verwendung von strncpy, wenn Sie fühlen sich überlappende situation kann auftreten, in Ihrem Programm. Statt strncpy Sie können verwenden Sie memmove-Funktion in der überlagerung Szenario.
Unten beschreibe ich ein einfaches Beispiel, die beschreibt, strncpy in der overlaping Szenario.
Hier bin ich der Annahme, die Ausgabe sollte 122345 aber hier Ausgabe 122222,das ist das größte fallback-Szenario von strncpy.
Dieses problem kann gelöst werden, indem die memove Funktion.
Jetzt bin ich immer der Wunsch Ausgabe 122345.
Weitere detail können Sie unter diesem link http://aticleworld.com/how-to-use-strncpy-and-how-to-write-your-own-strncpy/
InformationsquelleAutor der Antwort amlendra mishra
Den Gefahren von strncpy, _snprintf, und wcsncpy sollte ebenso bekannt, aber anscheinend sind Sie nicht. Diese Funktionen können Sie festlegen, die Größe des Puffers, der aber – und das ist wirklich wichtig – Sie garantieren keine null-Terminierung. Wenn Sie Fragen, diese Funktionen zu schreiben, die mehr Zeichen als füllen der Puffer dann werden Sie aufhören – so dass die buffer-overrun – aber Sie wird nicht null beendet den Puffer. Um diese Funktionen verwenden, Sie richtig zu tun haben, diese Art von Unsinn.
Entnehmen Sie bitte folgenden link für Ihre Referenz!!!
https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/
InformationsquelleAutor der Antwort Guna Sekaran J