It appears sockaddr_in.sin_zero is not zeroed during certain operations returning IPv4 socket names, namely: - getsockopt(...SO_ORIGINAL_DST...) (2.4 and 2.6) see getorigdst() in net/ipv4/netfilter/ip_conntrack_core.c (+ in net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c in 2.6?!) - getsockname() and getpeername() (and accept()) (2.4 only) see inet_getname() in net/ipv4/af_inet.c and several unitialized bytes of kernel stack (sizeof(sin_zero) == 6 to be precise) leak to the userspace. http://marc.theaimsgroup.com/?l=linux-netdev&m=114148078223594&w=2
Created attachment 126477 [details] Example code for showing the problem
committed in stream U4 build 34.14. A test kernel with this patch is available from http://people.redhat.com/~jbaron/rhel4/
This issue is on Red Hat Engineering's list of planned work items for the upcoming Red Hat Enterprise Linux 4.4 release. Engineering resources have been assigned and barring unforeseen circumstances, Red Hat intends to include this item in the 4.4 release.
looks to be fixed in 40.1.EL, same results as in 2.1 [mgahagan@dhcp59-204 bz186242]$ ./bug 2345 data: 02 00 89 e1 ac 10 3b ce 00 00 00 00 00 00 00 00 data: 02 00 09 29 ac 10 3b cc 00 00 00 00 00 00 00 00 getsockname(as): Protocol not available
An advisory has been issued which should help the problem described in this bug report. This report is therefore being closed with a resolution of ERRATA. For more information on the solution and/or where to find the updated files, please follow the link below. You may reopen this bug report if the solution does not work for you. http://rhn.redhat.com/errata/RHSA-2006-0575.html