[sr #107527] Use of dangerous/banned functions (Analysis)

Jeffrey Walton INVALID.NOREPLY at gnu.org
Fri Nov 19 04:03:43 CET 2010


URL:
  <http://savannah.gnu.org/support/?107527>

                 Summary: Use of dangerous/banned functions (Analysis)
                 Project: GnuTLS
            Submitted by: noloader
            Submitted on: Fri 19 Nov 2010 03:03:42 AM GMT
                Category: None
                Priority: 5 - Normal
                Severity: 3 - Normal
                  Status: None
                 Privacy: Public
             Assigned to: None
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
        Operating System: None

    _______________________________________________________

Details:

SR #107522 flagged the general use of unsafe string handling functions. SR
#107525 detailed particular instances of the use of unsafe string handling
functions; and highlighted GnuTLS's inability to detect failure.

This SR will analyze the code around a cluster of calls to strcpy in serv.c.
The lines of interest in peer_print_info (from the SR $107525 audit) are:

451: size_t len = 5 * 1024 + strlen (header);
457: http_buffer = malloc (len);
...

461: strcpy (http_buffer, HTTP_BEGIN);
462: strcpy (&http_buffer[sizeof (HTTP_BEGIN) - 1], DEFAULT_DATA);
463: strcpy (&http_buffer[sizeof (HTTP_BEGIN) + sizeof (DEFAULT_DATA) - 2],
HTTP_END);
465: *ret_length = sizeof (DEFAULT_DATA) + sizeof (HTTP_BEGIN) + sizeof
(HTTP_END) - 3;

=====
header, ehich is subsequently used in a call to strlen, is not checked for
validity. In addition, there does not appear to be documentation for
peer_print_info, so its unclear if Null/Empty values are acceptable to the
function.

>From the Open Group Base Specifications for strlen(), it appears no
constraints are placed on the string 's' and no errors are defined for the
function, which implies all arguments - including NULL - are acceptable. Yet a
test program faults on GNU Linux with a NULL argument:

Program received signal SIGSEGV, Segmentation fault.
__strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:31
31	../sysdeps/x86_64/multiarch/../strlen.S: No such file or directory.
	in ../sysdeps/x86_64/multiarch/../strlen.S
(gdb) bt full
#0  __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:31
No locals.
#1  0x000000000040066b in peer_print_info_kindof (header=0x0, 
    ret_length=0x7fffffffe2ac) at replace-strcpy.c:43
        http_buffer = 0x400755 "H\205\355t\034\061\333\017\037@"
        len = 140737488348072
#2  0x000000000040062b in main (argc=1, argv=0x7fffffffe398)
    at replace-strcpy.c:14
        written = 0
        response = 0x7fffffffe390 "\001"

(Sorry for not checking ISO C - I don't have a licensed copy of the
standard).

=====
The header in line 451 is passed in to peer_print_info. Based on the header
length, a buffer is allocated. The 5 * 1024 appears to be a heuristic.

=====
At line 457, memory is obtained for a HTTP response. The call to malloc is
checked for failure.

=====
The strcpy's at lines 461, 462, and 463 assume success since the function
cannot convey failures. The assumption is then propagated to the caller via
the dereference/assignment at line 465.

=====
The dereference at line 465 assumes the pointer is valid.

=====
If the invocation of peer_print_info is unsuccessful, ret_length could be in
an indeterminate state from the caller's perspective.

=====
An improved strategy might include changing calls to strcpy with calls to
snprintf since snprintf offers deterministic failure:

  if(ret_length)
    *ret_length = -1;

  size_t len = 5 * 1024 + strlen (header);
  ...

  size_t len2 = 0; /* scratch */
  int count = 0, written = 0;

  len2 = strlen(DEFAULT_DATA);
  if(!(len - written >= len2)) { /*handle failure*/ }

  count = snprintf(&http_buffer[written], len-written, "%s", DEFAULT_DATA);
  if(count < 0) { /*handle failure*/ }
  written += count;
  ...

  if(ret_length)
    *ret_length = written;



    _______________________________________________________

File Attachments:


-------------------------------------------------------
Date: Fri 19 Nov 2010 03:03:42 AM GMT  Name: peer_print_info_kindof.c  Size:
3kB   By: noloader

<http://savannah.gnu.org/support/download.php?file_id=22057>

    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/support/?107527>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/





More information about the Gnutls-devel mailing list