Are functions like strcpy, gets, etc. always dangerous? What if I write a code like this:
int main(void)
{
char *str1 = "abcdefghijklmnop";
char *str2 = malloc(100);
strcpy(str2, str1);
}
This way the function doesn't accept arguments(parameters...) and the str variable will always be the same length...which is here 16 or slightly more depending on the compiler version...but yeah 100 will suffice as of march, 2011 :). Is there a way for a hacker to take advantage of the code above? 10x!
Absolutely not. Contrary to Microsoft's marketing campaign for their non-standard functions, strcpy
is safe when used properly.
The above is redundant, but mostly safe. The only potential issue is that you're not checking the malloc
return value, so you may be dereferencing null (as pointed out by kotlinski). In practice, this likely to cause an immediate SIGSEGV and program termination.
An improper and dangerous use would be:
char array[100];
// ... Read line into uncheckedInput
// Extract substring without checking length
strcpy(array, uncheckedInput + 10);
This is unsafe because the strcpy may overflow, causing undefined behavior. In practice, this is likely to overwrite other local variables (itself a major security breach). One of these may be the return address. Through a return to lib C attack, the attacker may be able to use C functions like system
to execute arbitrary programs. There are other possible consequences to overflows.
However, gets
is indeed inherently unsafe, and will be removed from the next version of C (C1X). There is simply no way to ensure the input won't overflow (causing the same consequences given above). Some people would argue it's safe when used with a known input file, but there's really no reason to ever use it. POSIX's getline
is a far better alternative.
Also, the length of str1
doesn't vary by compiler. It should always be 17, including the terminating NUL.
You are forcefully stuffing completely different things into one category.
Functions gets
is indeed always dangerous. There's no way to make a safe call to gets
regardless of what steps you are willing to take and how defensive you are willing to get.
Function strcpy
is perfectly safe if you are willing to take the [simple] necessary steps to make sure that your calls to strcpy
are safe.
That already puts gets
and strcpy
in vastly different categories, which have nothing in common with regard to safety.
The popular criticisms directed at safety aspects of strcpy
are based entirely on anecdotal social observations as opposed to formal facts, e.g. "programmers are lazy and incompetent, so don't let them use strcpy
". Taken in the context of C programming, this is, of course, utter nonsense. Following this logic we should also declare the division operator exactly as unsafe for exactly the same reasons.
In reality, there are no problems with strcpy
whatsoever. gets
, on the other hand, is a completely different story, as I said above.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With