Bugzilla will be upgraded to version 5.0. The upgrade date is tentatively scheduled for 2 December 2018, pending final testing and feedback.
Bug 1223095 - access to uninitialized memory in getaddrinfo if nscd is running
access to uninitialized memory in getaddrinfo if nscd is running
Status: CLOSED ERRATA
Product: Red Hat Enterprise Linux 6
Classification: Red Hat
Component: glibc (Show other bugs)
6.5
All All
medium Severity medium
: rc
: ---
Assigned To: Florian Weimer
Sergey Kolosov
Mark Flitter
:
Depends On:
Blocks: 1172231 1269194 1361283
  Show dependency treegraph
 
Reported: 2015-05-19 16:11 EDT by Paulo Andrade
Modified: 2017-03-21 06:34 EDT (History)
11 users (show)

See Also:
Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Resolution for getaddrinfo accessing uninitialised data On systems with nscd enabled, the getaddrinfo function in glibc could access uninitialized data and return false address information. This update avoids accessing uninitialized data and ensures that correct addresses are returned.
Story Points: ---
Clone Of:
Environment:
Last Closed: 2017-03-21 06:34:44 EDT
Type: Bug
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)
gaitest.c (270 bytes, text/plain)
2015-05-19 16:19 EDT, Paulo Andrade
no flags Details


External Trackers
Tracker ID Priority Status Summary Last Updated
Sourceware 16743 None None None 2016-02-04 07:29 EST
Red Hat Product Errata RHSA-2017:0680 normal SHIPPED_LIVE Moderate: glibc security and bug fix update 2017-03-21 08:36:34 EDT

  None (edit)
Description Paulo Andrade 2015-05-19 16:11:00 EDT
The problem also happens in rhel-7.x. Checking in rhel-7,
the memory is allocated at:

sysdeps/posix/getaddrinfo.c:706
		  if (__libc_use_alloca (alloca_used
					 + air->naddrs * sizeof (struct gaih_addrtuple)))
		    addrmem = alloca_account (air->naddrs
					      * sizeof (struct gaih_addrtuple),
					      alloca_used);

Simple debug attaching gdb from valgrind:

==30081== Conditional jump or move depends on uninitialised value(s)
==30081==    at 0x4F10C22: gaih_inet (getaddrinfo.c:1200)
==30081==    by 0x4F147AC: getaddrinfo (getaddrinfo.c:2420)
==30081==    by 0x4005C8: main (gaitest.c:10)
...
(gdb) bt
#0  gaih_inet (name=name@entry=0x400660 "localhost", service=<optimized out>, req=req@entry=0xffefffd30, pai=0x51f62a8, pai@entry=0xffefffbe0, 
    naddrs=naddrs@entry=0xffefffbd0) at ../sysdeps/posix/getaddrinfo.c:1200
#1  0x0000000004f147ad in __GI_getaddrinfo (name=0x400660 "localhost", service=0x0, hints=0xffefffd30, pai=0xffefffd68)
    at ../sysdeps/posix/getaddrinfo.c:2420
#2  0x00000000004005c9 in main () at gaitest.c:10
(gdb) p addrmem
$1 = (struct gaih_addrtuple *) 0xffefff8b0
(gdb) p at->next
$2 = (struct gaih_addrtuple *) 0xffefff8b0
(gdb) p* at->next
$3 = {next = 0x0, name = 0x0, family = -16778416, addr = {15, 0, 0, 0}, scopeid = 0}
(gdb) p* req
$4 = {ai_flags = 2, ai_family = 2, ai_socktype = 0, ai_protocol = 0, ai_addrlen = 0, ai_addr = 0x0, ai_canonname = 0x0, ai_next = 0x0}
(gdb) p $rsp
$5 = (void *) 0xffefff890
Comment 1 Paulo Andrade 2015-05-19 16:19:55 EDT
Created attachment 1027400 [details]
gaitest.c

Test case.

strace will show random values, like this:

connect(3, {sa_family=XXX /* AF_??? */, sa_data="\0\0\377\177\0\0\0\0\0\0\0\0\0\0"}, 16) = -1 EAFNOSUPPORT (Address family not supported by protocol)

where XXX is some random value.

Valgrind will tell all sorts of uninitialized memory use.
Comment 3 Carlos O'Donell 2015-05-19 17:12:32 EDT
Moving this to rhel-6.8 since we're outside the rhel-6.7 development window. We'll have to look at this more carefully and decide how to fix it.
Comment 5 Florian Weimer 2016-02-04 07:29:53 EST
I can confirm that the upstream fix addresses this issue:

commit a071766ebfd853179ac39f9773f894029bf86d36
Author: Andreas Schwab <schwab@suse.de>
Date:   Thu Mar 20 15:05:25 2014 +0100

    Fix use of half-initialized result in getaddrinfo when using nscd (bug 16743)
    
    This fixes a bug in the way the results from __nscd_getai are collected:
    for every returned result a new entry is first added to the
    gaih_addrtuple list, but if that result doesn't match the request this
    entry remains uninitialized.  So for this non-matching result an extra
    result with uninitialized content is returned.
    
    To reproduce (with nscd running):
    
        $ getent ahostsv4 localhost
        127.0.0.1       STREAM localhost
        127.0.0.1       DGRAM
        127.0.0.1       RAW
        (null)          STREAM
        (null)          DGRAM
        (null)          RAW

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=a071766ebfd853179ac39f9773f894029bf86d36
Comment 7 Mike McCune 2016-03-28 18:25:24 EDT
This bug was accidentally moved from POST to MODIFIED via an error in automation, please see mmccune@redhat.com with any questions
Comment 14 errata-xmlrpc 2017-03-21 06:34:44 EDT
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://rhn.redhat.com/errata/RHSA-2017-0680.html

Note You need to log in before you can comment on or make changes to this bug.