Lably
Skip to content

Secure coding

  • 7 min read
  • 4 chapters

Related on Lably

Through Software, Computer security and Parsing

Some scholars have suggested that in order to effectively confront threats related to cybersecurity, proper security should be coded or “baked in” to the systems. With security being designed into the software, this ensures that there will be protection against insider attacks and reduces the threat to application security.

Buffer-overflow prevention

Buffer overflows, a common software security vulnerability, happen when a process tries to store data beyond a fixed-length buffer. For example, if there are 8 slots to store items in, there will be a problem if there is an attempt to store 9 items. In computer memory the overflowed data may overwrite data in the next location which can result in a security vulnerability (stack smashing) or program termination (segmentation fault).

An example of a C program prone to a buffer overflow is

<span id="mwHQ"></span><span class="kt" id="mwHg">int</span><span class="w" id="mwHw"> </span><span class="nf" id="mwIA">vulnerable_function</span><span class="p" id="mwIQ">(</span><span class="kt" id="mwIg">char</span><span class="w" id="mwIw"> </span><span class="o" id="mwJA">*</span><span class="w" id="mwJQ"> </span><span class="n" id="mwJg">large_user_input</span><span class="p" id="mwJw">)</span><span class="w" id="mwKA"> </span><span class="p" id="mwKQ">{</span> <span class="w" id="mwKg"> </span><span class="kt" id="mwKw">char</span><span class="w" id="mwLA"> </span><span class="n" id="mwLQ">dst</span><span class="p" id="mwLg">[</span><span class="n" id="mwLw">SMALL</span><span class="p" id="mwMA">];</span> <span class="w" id="mwMQ"> </span><span class="n" id="mwMg">strcpy</span><span class="p" id="mwMw">(</span><span class="n" id="mwNA">dst</span><span class="p" id="mwNQ">,</span><span class="w" id="mwNg"> </span><span class="n" id="mwNw">large_user_input</span><span class="p" id="mwOA">);</span> <span class="p" id="mwOQ">}</span>

If the user input is larger than the destination buffer, a buffer overflow will occur. To fix this unsafe program, use strncpy to prevent a possible buffer overflow.

<span id="mwPQ"></span><span class="kt" id="mwPg">int</span><span class="w" id="mwPw"> </span><span class="nf" id="mwQA">secure_function</span><span class="p" id="mwQQ">(</span><span class="kt" id="mwQg">char</span><span class="w" id="mwQw"> </span><span class="o" id="mwRA">*</span><span class="w" id="mwRQ"> </span><span class="n" id="mwRg">user_input</span><span class="p" id="mwRw">)</span><span class="w" id="mwSA"> </span><span class="p" id="mwSQ">{</span> <span class="w" id="mwSg"> </span><span class="kt" id="mwSw">char</span><span class="w" id="mwTA"> </span><span class="n" id="mwTQ">dst</span><span class="p" id="mwTg">[</span><span class="n" id="mwTw">BUF_SIZE</span><span class="p" id="mwUA">];</span> <span class="w" id="mwUQ"> </span><span class="c1" id="mwUg">// copy a maximum of BUF_SIZE bytes</span> <span class="w" id="mwUw"> </span><span class="n" id="mwVA">strncpy</span><span class="p" id="mwVQ">(</span><span class="n" id="mwVg">dst</span><span class="p" id="mwVw">,</span><span class="w" id="mwWA"> </span><span class="n" id="mwWQ">user_input</span><span class="p" id="mwWg">,</span><span class="w" id="mwWw"> </span><span class="n" id="mwXA">BUF_SIZE</span><span class="p" id="mwXQ">);</span> <span class="w" id="mwXg"> </span><span class="c1" id="mwXw">// set the last character in the buffer to NUL.</span> <span class="w" id="mwYA"> </span><span class="n" id="mwYQ">dst</span><span class="p" id="mwYg">[</span><span class="n" id="mwYw">BUF_SIZE</span><span class="w" id="mwZA"> </span><span class="mi" id="mwZQ">-1</span><span class="p" id="mwZg">]</span><span class="w" id="mwZw"> </span><span class="o" id="mwaA">=</span><span class="w" id="mwaQ"> </span><span class="sc" id="mwag">'\0'</span><span class="p" id="mwaw">;</span> <span class="p" id="mwbA">}</span>

Another secure alternative is to dynamically allocate memory on the heap using malloc.

<span id="mwcQ"></span><span class="kt" id="mwcg">char</span><span class="w" id="mwcw"> </span><span class="o" id="mwdA">*</span><span class="w" id="mwdQ"> </span><span class="nf" id="mwdg">secure_copy</span><span class="p" id="mwdw">(</span><span class="kt" id="mweA">char</span><span class="w" id="mweQ"> </span><span class="o" id="mweg">*</span><span class="w" id="mwew"> </span><span class="n" id="mwfA">src</span><span class="p" id="mwfQ">)</span><span class="w" id="mwfg"> </span><span class="p" id="mwfw">{</span> <span class="w" id="mwgA"> </span><span class="kt" id="mwgQ">size_t</span><span class="w" id="mwgg"> </span><span class="n" id="mwgw">len</span><span class="w" id="mwhA"> </span><span class="o" id="mwhQ">=</span><span class="w" id="mwhg"> </span><span class="n" id="mwhw">strlen</span><span class="p" id="mwiA">(</span><span class="n" id="mwiQ">src</span><span class="p" id="mwig">);</span> <span class="w" id="mwiw"> </span><span class="kt" id="mwjA">char</span><span class="w" id="mwjQ"> </span><span class="o" id="mwjg">*</span><span class="w" id="mwjw"> </span><span class="n" id="mwkA">dst</span><span class="w" id="mwkQ"> </span><span class="o" id="mwkg">=</span><span class="w" id="mwkw"> </span><span class="p" id="mwlA">(</span><span class="kt" id="mwlQ">char</span><span class="w" id="mwlg"> </span><span class="o" id="mwlw">*</span><span class="p" id="mwmA">)</span><span class="w" id="mwmQ"> </span><span class="n" id="mwmg">malloc</span><span class="p" id="mwmw">(</span><span class="n" id="mwnA">len</span><span class="w" id="mwnQ"> </span><span class="o" id="mwng">+</span><span class="w" id="mwnw"> </span><span class="mi" id="mwoA">1</span><span class="p" id="mwoQ">);</span> <span class="w" id="mwog"> </span><span class="k" id="mwow">if</span><span class="w" id="mwpA"> </span><span class="p" id="mwpQ">(</span><span class="n" id="mwpg">dst</span><span class="w" id="mwpw"> </span><span class="o" id="mwqA">!=</span><span class="w" id="mwqQ"> </span><span class="nb" id="mwqg">NULL</span><span class="p" id="mwqw">)</span><span class="w" id="mwrA"> </span><span class="p" id="mwrQ">{</span> <span class="w" id="mwrg"> </span><span class="n" id="mwrw">strncpy</span><span class="p" id="mwsA">(</span><span class="n" id="mwsQ">dst</span><span class="p" id="mwsg">,</span><span class="w" id="mwsw"> </span><span class="n" id="mwtA">src</span><span class="p" id="mwtQ">,</span><span class="w" id="mwtg"> </span><span class="n" id="mwtw">len</span><span class="p" id="mwuA">);</span> <span class="w" id="mwuQ"> </span><span class="c1" id="mwug">// append null terminator </span> <span class="w" id="mwuw"> </span><span class="n" id="mwvA">dst</span><span class="p" id="mwvQ">[</span><span class="n" id="mwvg">len</span><span class="p" id="mwvw">]</span><span class="w" id="mwwA"> </span><span class="o" id="mwwQ">=</span><span class="w" id="mwwg"> </span><span class="sc" id="mwww">'\0'</span><span class="p" id="mwxA">;</span> <span class="w" id="mwxQ"> </span><span class="p" id="mwxg">}</span> <span class="w" id="mwxw"> </span><span class="k" id="mwyA">return</span><span class="w" id="mwyQ"> </span><span class="n" id="mwyg">dst</span><span class="p" id="mwyw">;</span> <span class="p" id="mwzA">}</span>

In the above code snippet, the program attempts to copy the contents of src into dst, while also checking the return value of malloc to ensure that enough memory was able to be allocated for the destination buffer.

Sign in to keep reading

3 more chapters are free with a Lably account.

More in Computing and communication