• Lennert Buytenhek's avatar
    ieee802154: Fix sockaddr_ieee802154 implicit padding information leak. · 8a70cefa
    Lennert Buytenhek authored
    The AF_IEEE802154 sockaddr looks like this:
    
    	struct sockaddr_ieee802154 {
    		sa_family_t family; /* AF_IEEE802154 */
    		struct ieee802154_addr_sa addr;
    	};
    
    	struct ieee802154_addr_sa {
    		int addr_type;
    		u16 pan_id;
    		union {
    			u8 hwaddr[IEEE802154_ADDR_LEN];
    			u16 short_addr;
    		};
    	};
    
    On most architectures there will be implicit structure padding here,
    in two different places:
    
    * In struct sockaddr_ieee802154, two bytes of padding between 'family'
      (unsigned short) and 'addr', so that 'addr' starts on a four byte
      boundary.
    
    * In struct ieee802154_addr_sa, two bytes at the end of the structure,
      to make the structure 16 bytes.
    
    When calling recvmsg(2) on a PF_IEEE802154 SOCK_DGRAM socket, the
    ieee802154 stack constructs a struct sockaddr_ieee802154 on the
    kernel stack without clearing these padding fields, and, depending
    on the addr_type, between four and ten bytes of uncleared kernel
    stack will be copied to userspace.
    
    We can't just insert two 'u16 __pad's in the right places and zero
    those before copying an address to userspace, as not all architectures
    insert this implicit padding -- from a quick test it seems that avr32,
    cris and m68k don't insert this padding, while every other architecture
    that I have cross compilers for does insert this padding.
    
    The easiest way to plug the leak is to just memset the whole struct
    sockaddr_ieee802154 before filling in the fields we want to fill in,
    and that's what this patch does.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarLennert Buytenhek <buytenh@wantstofly.org>
    Acked-by: default avatarAlexander Aring <alex.aring@gmail.com>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    8a70cefa
socket.c 23.3 KB