LinuxÄÚºËAF_PACKETÔ­ÉúÌ×½Ó×Ö·ì϶£¨CVE-2020-14386£©·ÖÎö

°ä²¼¹¦·ò 2020-09-22

·ì϶²¼¾°


½üÈÕ£¬ £¬£¬£¬£¬£¬£¬£¬OpenwallÉçÇøÉϹ«¿ªÁËÒ»¸öLinuxÄÚºËAF_PACKETÔ­ÉúÌ×½Ó×ÖÄÚ´æ·ÛËé·ì϶¡£¡£ ¡£¡£¡£¡£Æ¾¾Ýϸ½ÚÃèÊö£¬ £¬£¬£¬£¬£¬£¬£¬¸Ã·ì϶³Ê´Ë¿Ìnet/packet/af_packet.cÖУ¬ £¬£¬£¬£¬£¬£¬£¬ÓÉÕûÊýÒç³öµ¼ÖÂÔ½½çд£¬ £¬£¬£¬£¬£¬£¬£¬Äܹ»Í¨¹ýËü½øÐÐȨÏÞÌáÉý¡£¡£ ¡£¡£¡£¡£¸Ã·ì϶·çÏÕÆÀ¼¶Îª¸ß£¬ £¬£¬£¬£¬£¬£¬£¬±àºÅΪCVE-2020-14386¡£¡£ ¡£¡£¡£¡£


ÊÜÓ°Ïì²úÆ·»ººÍ½â´ëÊ©


1¡¢ÊÜÓ°Ïì²úÆ·


¸Ã·ì϶ӰÏìLinux¿¯Ðаæ¸ßÓÚ4.6µÄÄں˰汾£¬ £¬£¬£¬£¬£¬£¬£¬Ô̺¬£º

  • Ubuntu Bionic (18.04) and newer

  • Debian 9

  • Debian 10

  • CentOS 8/RHEL 8

2¡¢»º½â´ëÊ©


£¨1£©½¨²¹ÏµÍ³

ÉÏÓÎÄں˲¹¶¡ÈçÏ£º

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=acf69c946233259ab4d64f8869d4037a198c7f06


£¨2£©¹Ø¹ØCAP_NET_RAWÖ°ÄÜ

Õë¶ÔRHEL8£¬ £¬£¬£¬£¬£¬£¬£¬¾ßÌ幨¹Ø²½ÖèÈçÏ£º

# echo"user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf

# sysctl -p/etc/sysctl.d/userns.conf


£¨3£©Õë¶ÔһЩÊÜÓ°ÏìµÄÈÝÆ÷²úÆ·£¬ £¬£¬£¬£¬£¬£¬£¬Í¬Ñù²ÉÈ¡¹Ø¹ØCAP_NET_RAWÖ°ÄܽøÐлº½â

Kubernetes Pod°²È«Õ½Êõ£ºÅäÖÃPod°²È«Õ½ÊõÒÔɾ³ýÔËÐÐÈÝÆ÷ÖеÄCAP_NET_RAWÖ°ÄÜ£¬ £¬£¬£¬£¬£¬£¬£¬²Î¿¼Á´½Ó£ºhttps://cloud.google.com/kubernetes-engine/docs/security-bulletins¡£¡£ ¡£¡£¡£¡£


ÓйظÅÏë


1¡¢AF_PACKETÌ×½Ó×Ö


ÍøÂçºÍ̸ջÖУ¬ £¬£¬£¬£¬£¬£¬£¬Ô­Ê¼Ì×½Ó×ÖÊÇÒ»¸öÌØÊâµÄÌ×½Ó×ÖÀàÐÍ£¬ £¬£¬£¬£¬£¬£¬£¬´ÓʵÏÖÉÏÄܹ»·ÖΪÁ½À࣬ £¬£¬£¬£¬£¬£¬£¬Ò»ÀàΪÁ´Â·²ãԭʼÌ×½Ó×Ö£»£»£»£»£»£»£»ÁíÒ»ÀàÎªÍøÂç²ãԭʼÌ×½Ó×Ö¡£¡£ ¡£¡£¡£¡£Á´Â·²ãԭʼÌ×½Ó×Ö¿ÉÖ±½ÓÓÃÓڽӹܺͷ¢ËÍÁ´Â·²ãµÄMACÖ¡£¡£ ¡£¡£¡£¡£¬ £¬£¬£¬£¬£¬£¬£¬ÔÚ·¢ËÍʱ±ØÒªÅ²ÓÃÕß×ÔÐлú¹ØºÍ·â×°MACÊײ¿¡£¡£ ¡£¡£¡£¡£Á´Â·²ãԭʼÌ×½Ó×ÖŲÓÃsocket()º¯Êý´´½¨¡£¡£ ¡£¡£¡£¡£µÚÒ»¸ö²ÎÊýÖ¸¶¨µØÖ·´ØÀàÐÍΪAF_PACKET£¬ £¬£¬£¬£¬£¬£¬£¬µÚ¶þ¸ö²ÎÊýÌ×½Ó×ÖÀàÐÍΪSOCK_RAW»òSOCK_DGRAM£¬ £¬£¬£¬£¬£¬£¬£¬µ±ÀàÐÍÖ¸¶¨ÎªSOCK_RAWʱ£¬ £¬£¬£¬£¬£¬£¬£¬Ì×½Ó×ֽӹܺͷ¢Ë͵ÄÊý¾Ý¶¼ÊÇ´ÓMACÊײ¿ÆðÍ·µÄ¡£¡£ ¡£¡£¡£¡£ÔÚ·¢ËÍʱ±ØÒªÓÉŲÓÃÕß´ÓMACÊײ¿ÆðÍ·»ú¹ØºÍ·â×°±¨ÎÄÊý¾Ý¡£¡£ ¡£¡£¡£¡£


2¡¢PACKET_MMAP


½öÒÀ¸½AF_PACKET¹ýÂËÊý¾Ý°üÊǼ«¶ÈµÍЧµÄ£¬ £¬£¬£¬£¬£¬£¬£¬ÄÚºËÓÖÌṩÁËPACKET_MMAPÖ§³Ö¡£¡£ ¡£¡£¡£¡£PACKET_MMAPÔÚÄں˿ռäÖзÖÅäÒ»¿é»·ÐÎÄں˻º³åÇø£¬ £¬£¬£¬£¬£¬£¬£¬Óû§¿Õ¼äͨ¹ýmmap½«¸ÃÄں˻º³åÇøÓ³Éä³öÀ´¡£¡£ ¡£¡£¡£¡£ÊÕµ½µÄÊý¾Ý°ü¿½±´µ½»·ÐÎÄں˻º³åÇøÖУ¬ £¬£¬£¬£¬£¬£¬£¬Óû§²ãÄܹ»Ö±½Ó²Ù×÷Êý¾Ý£¬ £¬£¬£¬£¬£¬£¬£¬Í¨¹ýÄں˿ռäºÍÓû§¿Õ¼ä¹²ÏíµÄ»º³åÇøÆðµ½Ï÷¼õÊý¾Ý¿½±´µÄ×÷Ó㬠£¬£¬£¬£¬£¬£¬£¬Ìá¸ß´¦ÖÃЧÄÜ¡£¡£ ¡£¡£¡£¡£


PACKET_MMAPʵÏÖ¹ý³Ì


ͨ¹ýsetsockopt()º¯ÊýÉèÖû·Ðλº³åÇø£¬ £¬£¬£¬£¬£¬£¬£¬option²ÎÊýÉèÖÃΪPACKET_RX_RING»òPACKET_TX_RING¡£¡£ ¡£¡£¡£¡£ÎªÁË·½±ãÄÚºËÓëÓû§²ãÖÎÀíºÍ½»»¥»·Ðλº³åÇøÖеÄÊý¾ÝÖ¡£¡£ ¡£¡£¡£¡£¬ £¬£¬£¬£¬£¬£¬£¬Äں˽ç˵ÁËTPACKET_HEADER½á¹¹Ì壬 £¬£¬£¬£¬£¬£¬£¬¸Ã½á¹¹Ìå´æ´¢×ÅһЩԪÐÅÏ¢ÈçÌ×½Ó×ÖµØÖ·ÐÅÏ¢¡¢¹¦·ò´ÁÒÔ¼°»·Ðλº³åÇøÖÎÀíÐÅÏ¢µÈ¡£¡£ ¡£¡£¡£¡£ÈôÊÇͨ¹ýsetsockopt()º¯ÊýÉèÖÃÁËPACKET_VNET_HDRÑ¡Ï £¬£¬£¬£¬£¬£¬£¬»¹ÐèÔö³¤Ò»¸övirtio_net_hdr½á¹¹Ìå¡£¡£ ¡£¡£¡£¡£Ò»¸öÊý¾ÝÖ¡Ô̺¬Á½¸ö²¿ÃÅ£¬ £¬£¬£¬£¬£¬£¬£¬µÚÒ»²¿ÃÅΪTPACKET_HEADER£¬ £¬£¬£¬£¬£¬£¬£¬µÚ¶þ²¿ÃÅΪData£¬ £¬£¬£¬£¬£¬£¬£¬²¢ÇÒÒª±£ÕÏÒ³Ãæ¶ÔÆë£¬ £¬£¬£¬£¬£¬£¬£¬ÈçÏÂͼËùʾ£º

ĿǰTPACKET_HEADER´æÔÚÈý¸ö°æ±¾£¬ £¬£¬£¬£¬£¬£¬£¬Ã¿¸ö°æ±¾³¤¶ÈÂÔÓÐ·ÖÆç¡£¡£ ¡£¡£¡£¡£¶ÔÓÚv1ºÍv2£¬ £¬£¬£¬£¬£¬£¬£¬ÊÕ·¢»·Ðλº³åÇøÓÃtpacket_req½á¹¹ÌåÖÎÀí£¬ £¬£¬£¬£¬£¬£¬£¬¸Ã½á¹¹ÌåÔ̺¬ËĸöÊý¾ÝÓò£º±ðÀëΪÄÚ´æ¿éµÄ´óÓ׺ÍÊýÁ¿¡¢Ã¿¸öÊý¾ÝÖ¡µÄ´óÓ׺ÍÊý¾ÝÖ¡×ÜÊý¡£¡£ ¡£¡£¡£¡£ÈçÏÂͼËùʾ£º



²¶»ñµÄframe±»»®·ÖΪ¶à¸öblock£¬ £¬£¬£¬£¬£¬£¬£¬Ã¿¸öblockÊÇÒ»¿éÎïÀíÉÏÂ½ÐøµÄÄÚ´æÇøÓò£¬ £¬£¬£¬£¬£¬£¬£¬ÓÐtp_block_size/tp_frame_size¸öframe£¬ £¬£¬£¬£¬£¬£¬£¬blockµÄ×ÜÊýÊÇtp_block_nr¡£¡£ ¡£¡£¡£¡£ÀýÈ磬 £¬£¬£¬£¬£¬£¬£¬tp_block_size = 4096£¬ £¬£¬£¬£¬£¬£¬£¬tp_frame_size = 2048£¬ £¬£¬£¬£¬£¬£¬£¬tp_block_nr = 4£¬ £¬£¬£¬£¬£¬£¬£¬tp_frame_nr = 8¡£¡£ ¡£¡£¡£¡£µÃµ½µÄ»º³åÇø½á¹¹ÈçÏÂͼËùʾ£º



ÿ¸öframe±ØÐë·ÅÔÚÒ»¸öblockÖУ¬ £¬£¬£¬£¬£¬£¬£¬Ã¿¸öblock±£ÁôÕûÊý¸öframe£¬ £¬£¬£¬£¬£¬£¬£¬Ò²¾ÍÊÇ˵һ¸öframe²»ÄÜÓâÔ½Á½¸öblock¡£¡£ ¡£¡£¡£¡£ÔÚÓû§²ãÓ³Éä»·Ðλº³åÇøÄܹ»Ö±½ÓʹÓÃmmap()º¯Êý¡£¡£ ¡£¡£¡£¡£¹ÌÈ»»·Ðλº³åÇøÔÚÄÚºËÖÐÊÇÓɶà¸öblock×é³ÉµÄ£¬ £¬£¬£¬£¬£¬£¬£¬µ«ÊÇÓ³ÉäºóËüÃÇÔÚÓû§¿Õ¼äÖÐÊÇÂ½ÐøµÄ¡£¡£ ¡£¡£¡£¡£


·ì϶·ÖÎö


¸Ã·ì϶¾ßÌå³Ê´Ë¿Ìtpacket_rcv()º¯ÊýÖУ¬ £¬£¬£¬£¬£¬£¬£¬¸Ãº¯ÊýÊÇ»ùÓÚPACKET_MMAPµÄÊý¾Ý°ü½Ó¹Üº¯Êý¡£¡£ ¡£¡£¡£¡£¾ßÌåÖ°ÄÜʵÏÖÈçÏ´úÂëËùʾ£º



ÐÐ2226µ½ÐÐ2228£¬ £¬£¬£¬£¬£¬£¬£¬ÈôÊÇsk_typeΪSOCK_DGRAM£¬ £¬£¬£¬£¬£¬£¬£¬°µÊ¾²»±ØÒª×ÔÐлú¹ØMACÊײ¿£¬ £¬£¬£¬£¬£¬£¬£¬ÓÉÄÚºËÌî³ä£¬ £¬£¬£¬£¬£¬£¬£¬ÔòmacoffµÅ×Únetoff£¬ £¬£¬£¬£¬£¬£¬£¬´óÓ×ΪTPACKET_ALIGN(tp_hdr_len)+ 16 + tp_reserve¡£¡£ ¡£¡£¡£¡£ÈôÊÇsk_typeΪSOCK_RAW£¬ £¬£¬£¬£¬£¬£¬£¬Ôò½øÈëÐÐ2230£¬ £¬£¬£¬£¬£¬£¬£¬°µÊ¾±ØÒª×ÔÐлú¹ØMACÊײ¿¡£¡£ ¡£¡£¡£¡£ÐÐ2231µ½ÐÐ2233£¬ £¬£¬£¬£¬£¬£¬£¬Ê×ÏÈÍÆËãnetoff£¬ £¬£¬£¬£¬£¬£¬£¬´óÓ×ΪTPACKET_ALIGN(tp_hdrlen +(maclen < 16 ?16 : maclen)) + tp_reserve¡£¡£ ¡£¡£¡£¡£ÐÐ2234µ½ÐÐ2237£¬ £¬£¬£¬£¬£¬£¬£¬ÈôÊÇÉèÖÃÁËPACKET_VNET_HDRÑ¡Ï £¬£¬£¬£¬£¬£¬£¬»¹Ðè¼ÓÉÏÒ»¸övirtio_net_hdr½á¹¹ÌåµÄ´óС£¡£ ¡£¡£¡£¡£¬ £¬£¬£¬£¬£¬£¬£¬¶øºóÉèÖÃdo_vnetÎªÕæ¡£¡£ ¡£¡£¡£¡£ÐÐ2238£¬ £¬£¬£¬£¬£¬£¬£¬ÍÆËãmacoff¡£¡£ ¡£¡£¡£¡£


ÓÉÓÚmacoff¡¢netoffÒÔ¼°maclen±»½ç˵Ϊunsigned shortÀàÐÍ£¬ £¬£¬£¬£¬£¬£¬£¬×î´óֵΪ0xffff¡£¡£ ¡£¡£¡£¡£¶øtp_reserve±»½ç˵Ϊunsigned intÀàÐÍ£¬ £¬£¬£¬£¬£¬£¬£¬×î´óֵΪ0xffffffff£¬ £¬£¬£¬£¬£¬£¬£¬²¢ÇÒ´óÓ×Äܹ»Í¨¹ýsetsockopt()º¯Êý½øÐÐÉèÖ㬠£¬£¬£¬£¬£¬£¬£¬ÈçÏ´úÂëËùʾ£º



Òò¶ø£¬ £¬£¬£¬£¬£¬£¬£¬ÔÚÍÆËãnetoffʱ£¬ £¬£¬£¬£¬£¬£¬£¬Äܹ»Í¨¹ý½ÚÔìtp_reserveÔì³ÉÕûÊýÒç³ö£¬ £¬£¬£¬£¬£¬£¬£¬½ø¶øÍÆËã³öÃýÎóµÄmacoff¡£¡£ ¡£¡£¡£¡£µ±Ö´Ðе½ÈçÏ´úÂëʱ£º



ÐÐ2287£¬ £¬£¬£¬£¬£¬£¬£¬Å²ÓÃvirtio_net_hdr_from_skb()º¯Êý´Ósk_buffÖп½±´Êý¾Ý£¬ £¬£¬£¬£¬£¬£¬£¬¸Ãº¯ÊýµÚ¶þ¸ö²ÎÊýΪh.raw + macoff ¨C sizeof(struct virtio_net_hdr)£¬ £¬£¬£¬£¬£¬£¬£¬h.rawΪtpacket_rcv_uhdrÀàÐ͵ÄÖ¸Õ룬 £¬£¬£¬£¬£¬£¬£¬Ö¸Ïò»·Ðλº³åÇøµÄframe£¬ £¬£¬£¬£¬£¬£¬£¬ÓÉÓÚmacoffÊǿɿصģ¬ £¬£¬£¬£¬£¬£¬£¬Äܹ»ÈÃmaoffÓ×ÓÚsizeof(struct virtio_net_hdr)£¬ £¬£¬£¬£¬£¬£¬£¬µ¼ÖÂÏòǰԽ½çд£¬ £¬£¬£¬£¬£¬£¬£¬×î¶à¿ÉдÈësizeof(struct virtio_net_hdr)¸ö×Ö½Ú¡£¡£ ¡£¡£¡£¡£Æ¾¾ÝÌṩµÄPoC£¬ £¬£¬£¬£¬£¬£¬£¬µ÷ÊÔ´úÂëÈçÏÂͼËùʾ£º



rdxÖдæ·Å×ÅTPACKET_ALIGN(tp_hdrlen+(maclen < 16 ? 16 : maclen))£¬ £¬£¬£¬£¬£¬£¬£¬´óÓ×Ϊ0x50¡£¡£ ¡£¡£¡£¡£rbp+0x4e4´¦´æ·Å×Åpo->tp_reserve£¬ £¬£¬£¬£¬£¬£¬£¬´óÓ×Ϊ0x0000ffb4¡£¡£ ¡£¡£¡£¡£Ïà¼Óºó£¬ £¬£¬£¬£¬£¬£¬£¬ÕûÊýÉÏÒçºó£¬ £¬£¬£¬£¬£¬£¬£¬rdxΪ0x0004¡£¡£ ¡£¡£¡£¡£µ±Ö´Ðе½Ô½½ç½Ó¼ûʱ£¬ £¬£¬£¬£¬£¬£¬£¬¾ßÌåÈçÏ£º



R9´æ·Å×Åh.rawÖ¸Õ룬 £¬£¬£¬£¬£¬£¬£¬rdx´æ·Å×Åmacoff£¬ £¬£¬£¬£¬£¬£¬£¬virtio_net_hdr½á¹¹Ìå´óÓ×Ϊ0xa¡£¡£ ¡£¡£¡£¡£ÈçÏÂͼËùʾ£º



²úÉúÄÚ´æ½Ó¼ûÃýÎó£¬ £¬£¬£¬£¬£¬£¬£¬Ôì³Éϵͳ±ÀÀ£¡£¡£ ¡£¡£¡£¡£


²Î¿¼Á´½Ó£º


[1] https://blog.csdn.net/sinat_20184565/article/details/82788387

[2] https://www.openwall.com/lists/oss-security/2020/09/03/3

[3] https://elixir.bootlin.com/linux/v5.6/source/Documentation/networking/packet_mmap.txt

[4] https://sysdig.com/blog/cve-2020-14386-falco/

[5] https://bugzilla.redhat.com/show_bug.cgi?id=1875699#c9