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£¬£¬£¬£¬£¬£¬£¬£¬¾ßÌ幨¹Ø²½ÖèÈçÏ£º
# 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£¬£¬£¬£¬£¬£¬£¬£¬²¢ÇÒÒª±£ÕÏÒ³Ãæ¶ÔÆë£¬£¬£¬£¬£¬£¬£¬£¬ÈçÏÂͼËùʾ£º


²¶»ñµÄ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×é³ÉµÄ£¬£¬£¬£¬£¬£¬£¬£¬µ«ÊÇÓ³ÉäºóËüÃÇÔÚÓû§¿Õ¼äÖÐÊÇÂ½ÐøµÄ¡£¡£¡£¡£¡£¡£
·ì϶·ÖÎö

ÐÐ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


¾©¹«Íø°²±¸11010802024551ºÅ