zrozumienie zagrożeń sprintf(…)

OWASP says:

" funkcje biblioteki C, takie jak strcpy (), strcat (), sprintf () i vsprintf () operują na zakończonych null łańcuchach i nie sprawdzaj granic."

Sprintf zapisuje sformatowane dane do łańcucha int sprintf (char * str, const char * format,... );

Przykład:

sprintf(str, "%s", message); // assume declaration and 
                             // initialization of variables

Jeśli Rozumiem komentarz OWASP, to niebezpieczeństwa związane z używaniem sprintf są takie, że

1) if message's length > str 's length, there' s a buffer overflow

I

2) Jeśli wiadomość nie kończy się znakiem null z \0, to wiadomość może zostać skopiowana do str poza adres pamięci wiadomość, powodując przepełnienie bufora

Proszę potwierdzić / zaprzeczyć. Dzięki
 18
Author: Kevin Meredith, 0000-00-00

3 answers

Masz rację w obu problemach, choć tak naprawdę oba są tym samym problemem(który polega na dostępie do danych poza granicami tablicy).

Rozwiązaniem Twojego pierwszego problemu jest użycie snprintf, który przyjmuje rozmiar bufora jako argument.

Rozwiązaniem twojego drugiego problemu jest podanie argumentu maksymalnej długości s[n]printf. Na przykład:

char buffer[128];

snprintf(buffer, sizeof(buffer), "This is a %.4s\n", "testGARBAGE DATA");

// strcmp(buffer, "This is a test\n") == 0

Jeśli chcesz zapisać cały łańcuch znaków (np. w przypadku, gdy sizeof(buffer) jest za mały), uruchom snprintf dwukrotnie:

// Behaviour is different in SUSv2; see
// "conforming to" section of man 3 sprintf

int length = snprintf(NULL, 0, "This is a %.4s\n", "testGARBAGE DATA");

++length;           // +1 for null terminator
char *buffer = malloc(length);

snprintf(buffer, length, "This is a %.4s\n", "testGARBAGE DATA");

(prawdopodobnie możesz dopasować to do funkcji za pomocą va.)

 21
Author: strager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-26 14:52:18

Oba Twoje twierdzenia są poprawne.

Jest dodatkowy problem, o którym nie wspomniano. Nie ma kontroli typu na parametrach. W przypadku niedopasowania ciągu formatu i parametrów może dojść do niezdefiniowanego i niepożądanego zachowania. Na przykład:

char buf[1024] = {0};
float f = 42.0f;
sprintf(buf, "%s", f);  // `f` isn't a string.  the sun may explode here

To może być szczególnie nieprzyjemne do debugowania.

Wszystko to prowadzi wielu programistów C++ do wniosku, że nigdy nie należy używać sprintf i jego braci. Rzeczywiście, są udogodnienia, których możesz użyć, aby uniknąć wszystkich z powyższych problemów. Jeden, streams, jest wbudowany bezpośrednio w Język:

#include <sstream>
#include <string>

// ...

float f = 42.0f;

stringstream ss;
ss << f;
string s = ss.str();

...a inny popularny wybór dla tych, którzy, podobnie jak ja, nadal wolą używać sprintf pochodzi z boost Format libraries :

#include <string>
#include <boost\format.hpp>

// ...

float f = 42.0f;
string s = (boost::format("%1%") %f).str();

Czy powinieneś przyjąć mantrę "nigdy nie używaj sprintf"? Sam zdecyduj. Zazwyczaj jest najlepsze narzędzie do pracy i w zależności od tego, co robisz, może to być.

 9
Author: John Dibling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 22:04:53

Tak, to głównie kwestia przepełnienia bufora. Są to jednak obecnie dość poważne sprawy, ponieważ przepełnienia buforów są głównym wektorem ataku używanym przez krakerów systemowych do obejścia bezpieczeństwa oprogramowania lub systemu. Jeśli wystawisz coś takiego na wejście użytkownika, jest bardzo duża szansa, że przekazujesz Klucze do swojego programu (lub nawet samego komputera) krakersom.

Z perspektywy OWASP, udawajmy, że piszemy serwer WWW i używamy sprintf do analizy wejście, które przeglądarka nam przekazuje.

Przypuśćmy teraz, że ktoś złośliwy przekazuje naszej przeglądarce ciąg znaków znacznie większy niż zmieści się w wybranym przez nas buforze. Jego dodatkowe dane zastąpią pobliskie dane. Jeśli zrobi je wystarczająco duże, niektóre z jego danych zostaną skopiowane przez instrukcje serwera www, a nie jego dane. Teraz może zmusić nasz serwer do wykonania jego kodu .

 4
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 21:38:41