LinuxÄÚºËTCPЭÒé¶à¸öSACK¹¦Ð§¾Ü¾ø·þÎñ©¶´·ÖÎö

Ðû²¼Ê±¼ä 2019-06-21
©¶´Åä¾°


2019Äê6ÔÂ18ÈÕ£¬RedhatÐû²¼Äþ¾²Í¨¸æ£¬LinuxÄÚºËTCP/IPЭÒéÕ»´æÔÚ3¸öÄþ¾²Â©¶´£¨CVE-2019-11477/CVE-2019-11478/CVE-2019-11479£©£¬ÕâЩ©¶´Óë×î´ó·Ö¶Î´óС£¨MSS£©ºÍTCPÑ¡ÔñÐÔÈ·ÈÏ£¨SACK£©¹¦Ð§Ïà¹Ø£¬ÔÊÐíÔ¶³Ì¹¥»÷Õß½øÐоܾø·þÎñ¹¥»÷¡£


Òªº¦¿´·¨



Êý¾Ý°üÖØ´«È·ÈÏ»úÖÆ


TCPÊý¾Ý°ü´«Êä¹ý³ÌÖУ¬À´×Ô»¬¶¯´°¿ÚµÄÊý¾Ý°ü¶ªÊ§¿ÉÄܶÔTCPÍÌÍÂÁ¿·¢ÉúÓ°Ïì¡£TCPʹÓÃÀÛ»ýÈ·ÈÏ£¨ACK£©·½°¸½â¾ö¸ÃÎÊÌ⣬ÆäÖв»½ÓÊÕ²»ÔÚ»¬¶¯´°¿Ú×ó±ßÔµµÄ½ÓÊնΣ¬Õâ»áÇ¿ÖÆ·¢ËÍ·½ÆÚ´ýÍù·µÊ±¼äÒÔÕÒ³öÿ¸ö¶ªÊ§µÄÊý¾Ý°ü£¬»òÕß²»ÐëÒªµØÖØд«ÊäÒÑÕýÈ·½ÓÊյĶΣ¬´Ó¶ø½µµÍÕûÌåÍÌÍÂÁ¿¡£


Ñ¡ÔñÐÔÈ·ÈÏ£¨SACK£©ÊÇÒ»ÖÖÔÚ¶à¸öÅ×ÆúµÄ¶ÎµÄÇé¿öϽâ¾ö´ËÐÐΪµÄ¼Æı¡£Í¨¹ýÑ¡ÔñÐÔÈ·ÈÏ£¬Êý¾Ý½ÓÊÕ·½¿ÉÒÔÏò·¢ËÍ·½Í¨ÖªÒÑÀֳɵ½´ïµÄËùÓжΣ¬Òò´Ë·¢ËÍ·½Ö»ÐèÖØд«Êäʵ¼Ê¶ªÊ§µÄ¶Î¡£¾ßÌåÑ¡ÔñÐÔÈ·ÈϹý³Ì£¬ÈçÏÂͼËùʾ¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


×î´ó·Ö¶Î´óС£¨Maximum Segment Size£©


MSS£¨Maximum Segment Size£¬×î´ó±¨ÎĶδóС£©µÄ¿´·¨ÊÇÖ¸TCP²ãËùÄܹ»½ÓÊÕµÄ×î´ó·Ö¶Î¾Þϸ£¬¸ÃÖµÖ»°üÂÞTCP¶ÎµÄÊý¾Ý²¿ÃÅ£¬²»°üÂÞOption²¿ÃÅ¡£ÁíÍ⣬ÔÚTCPÊײ¿ÓÐÒ»¸öMSSÑ¡ÏÔÚÈý´ÎÎÕÊÖ¹ý³ÌÖУ¬TCP·¢ËͶËʹÓøÃÑ¡Ïî¸æË߶Է½×Ô¼ºËùÄܽÓÊܵÄ×î´ó·Ö¶Î¾Þϸ¡£


TSO£¨TCP Segmentation Offload£©


TSOÊÇÒ»ÖÖÀûÓÃÍø¿¨À´¶Ô´óÊý¾Ý°ü½øÐÐ×Ô¶¯·Ö¶Î£¬½µµÍCPU¸ºÔصļ¼Êõ¡£ÆäÖ÷ÒªÊÇÑӳٷֶΡ£


GSO(Generic Segmentation Offload)


GSOÊÇЭÒéÕ»ÊÇ·ñÍƳٷֶΣ¬ÔÚ·¢Ë͵½Íø¿¨Ö®Ç°ÅжÏÍø¿¨ÊÇ·ñÖ§³ÖTSO£¬Èç¹ûÍø¿¨Ö§³ÖTSOÔòÈÃÍø¿¨·Ö¶Î£¬·ñÔòЭÒéÕ»·ÖÍê¶ÎÔÙ½»¸øÇý¶¯¡£Èç¹ûTSO¿ªÆô£¬GSO»á×Ô¶¯¿ªÆô¡£


©¶´Ô­Àí


CVE-2019-11477


ƾ¾Ý²¹¶¡¿ÉÖª£¬¸Ã©¶´ÊÇÓÉÒ»¸ö16bitÎÞ·ûºÅÊýÒç³öµ¼ÖµÄ£¬¸ÃÎÞ·ûºÅÊý´æÔÚÈçϽṹÌåÖС£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


¸Ãtcp_skb_cb½á¹¹Ìå´æ·Å×ÅTCPÿ¸öÊý¾Ý°üµÄ¿ØÖÆÐÅÏ¢£¬Æ¾¾Ý×¢ÊÍ¿ÉÖª£¬tcp_gso_segs/sizeÖ»ÓÃÓÚдÐÐÁйý³ÌÖС£


LinuxÄÚºËTCP/IPЭÒéջʵÏÖÖУ¬Ã¿¸öÊý¾Ý»º³åÇøÊÇÓÉÒ»¸ösk_buff½á¹¹Ìåͳһ¹ÜÀíµÄ¡£ÔÚÒ»¸öÍêÕûµÄÊý¾Ý»º³åÇøÖÐskb_endºóÃæ½ôËæ×ÅÒ»¸öskb_shared_info½á¹¹ÌåÊý¾Ý£¬skb_shared_info½á¹¹ÌåÈçÏÂËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


½á¹¹Ìå×îºóÒ»¸ö³ÉÔ±ÊÇfrags[MAX_SKB_FRAGS]Êý¾Ý¡£MAX_SKB_FRAGSÉùÃ÷ÈçÏÂËùʾ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


PAGE_SIZEΪ4KBÇé¿öÏ£¨¼´Ò»¸öÄÚ´æÒ³ÃæΪ4KB´óС£©£¬MAX_SKB_FRAGSȡֵΪ65536/4096 + 1¼´17£¬Òò´ËÒ»¸öskbÖÐ×î¶àÈÝÄÉ17¸öÊý¾Ý·ÖƬ¡£¶ÔÓÚx86ϵͳ£¬Ã¿¸öÊý¾Ý·ÖƬ×î¶à¿ÉÒԼǼ32KBÊý¾ÝµÄ¾Þϸ¡£
Êý¾Ý·ÖƬskb_frag_struct½á¹¹ÌåÈçÏÂËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÔÚÕû¸öЭÒéÕ»²Ù×÷¹ý³ÌÖУ¬Êý¾Ý°ü¼ÈÒª½øÐÐIP±»·ÖƬµÄ£¬ÓÖÒª½øÐÐTCP·Ö¶Î¡£´«ÊäÊý¾Ýʱ£¬Ð­ÒéÕ»»áƾ¾ÝGSOÖµ£¬MSSÖµÒÔ¼°»¬¶¯´°¿ÚÈýÕßÖ®¼äµÄ¾Þϸ¹ØϵÅжÏÊÇ·ñ½øÐзÖƬ¡£²¢Í¨¹ýtcp_set_skb_tso_segs()º¯ÊýÉèÖÃGSO£¬¾ßÌåʵÏÖÈçÏÂͼËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


Èç¹ûskb->len´óÓÚmss_now£¬ÐÐ1207£¬½«tcp_gso_segsÉèÖÃΪskb->len/mss_now¡£ÐÐ1208£¬½«tcp_gso_sizeÉèÖÃΪmss_now¡£


Èç¹ûÆôÓÃÁËSACK£¬ÔÚ·¢Éú¶ª°üºó£¬½ÓÊն˻᷵»ØSACK¿é£¬SACK¿éÖмǼ×ŶªÊ§°üµÄÐòÁбàºÅ¡£·¢ËͶ˻á½âÎöSACK¿éÖмǼµÄ¶ªÊ§°üÐòÁбàºÅ£¬²¢ÖØд«Ê䣬¶øÇÒÔÚÒ»¸ö»¬¶¯´°¿ÚÖпÉÄÜ°üÂÞ¶à¸öSACK¿é£¬SACK¿éÖÐÒ²¿ÉÄÜ°üÂÞ¶à¸öskbÐÐÁС£ÔÚTCPÖØ´«Êý¾Ý°ü¹ý³ÌÖУ¬¿ÉÒÔ½«¶à¸öskbÐÐÁкϲ¢µ½Ò»¸öskbÐÐÁÐÖнøÐÐÖØ´«¡£


tcp_shift_skb_data()º¯ÊýʵÏÖÕâ¸ö¹¦Ð§¡£ÊµÑ齫¿çÔ½¶à¸öskbµÄSACK¿éÕÛµþΪһ¸öskb¡£Òªº¦´úÂëÈçÏ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


skb_shift()ºÍtcp_shifted_skb()Á½¸öº¯ÊýÖ÷ҪʵÏָù¦Ð§¡£ÖØ´«¹ý³ÌÖжà¸öskbÐÐÁкϲ¢µ½Ò»¸öskbÐÐÁÐÖУ¬Èç¹ûÌî³ä17¸ö·ÖƬµ½×î´óÈÝÁ¿£¬ 17*32*1024/8=69632£¬ÒѾ­´óÓÚ65535£¬µ¼ÖÂÎÞ·ûºÅÕûÊýÒç³ö¡£


ÔÚskb_shift ()º¯ÊýÖУ¬tcp_gso_segsÒç³öºó£¬½øÈëtcp_shifted_skb()º¯Êýºó£¬ÈçÏÂËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÐÐ1299£¬ÅжÏtcp_gso_segsºÍpcountµÄ¾Þϸ£¬Èç¹ûtcp_gas_segsСÓÚpcount£¬BUG_ON¶ÏÑÔ´¥·¢µ¼ÖÂÄÚºËÍ߽⡣


ƾ¾Ý²¹¶¡¿ÉÖª£¬skb_shift()±»tcp_skb_shift()È¡´ú£¬Ö»ÊǼÓÁËÁ½¸öÅжÏ£¬ÈçÏÂËùʾ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


²¹¶¡ÖзֱðÅжÏÁËskb->len+shift_len²»ÄÜ´óÓÚ65535*8×Ö½ÚºÍtcp_skb_pcount(to) + pcount²»ÄÜ´óÓÚ65535¡£µÚÒ»¸öÅжÏ£¬skb->lenÊÇÌåÏÖsk_buff½á¹¹ÌåÖÐÌåÏÖpayload³¤¶È£¬shift_lenÌåÏÖÒªºÏ²¢µ½skbÖеÄpayload¡£


CVE-2019-11478


¸Ã©¶´Ò²ÊÇÕûÊýÒç³ö£¬ÔÚÊý¾Ý°üÖØд«Êä¹ý³ÌÖУ¬½«´«ÊäÐÐÁзֶÎΪ¶à¸ö΢СµÄskbs£¬ÅòÕÍskbÖÐдÐÐÁÐÄÚ´æ·¢ÉúÒç³ö¡£ÔÚ´¦ÖÃSACK¿éÖаüÂÞµÄskb²¢½«ÆäºÏ²¢ºó£¬Æ¾¾ÝGSOÅжϽøÐÐÊÇ·ñ·ÖƬ£¬Èç¹ûÐèÒª£¬µ÷ÓÃtcp_fragement()º¯Êý½øÐзÖƬ¡£Æ¾¾Ý²¹¶¡¿ÉÖª£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


²¹¶¡ÔÚtcp_fragment()º¯ÊýÖмÓÈëÁË×îС¿Õ¼äÅжÏ¡£SkÊÇsock½á¹¹ÌåÀàÐÍ£¬Ã¿Ò»¸ötcpÁ´½Ó¶ÔÓ¦Ò»¸ö¡£ËùÒÔËùÓÐÒª·¢Ë͵ÄskbÊý¾Ý¾Þϸ¶¼ÒªÀÛ¼Óµ½sk->sk_wmem_queuedÖУ¬sk->sk_wmem_queuedÌåÏÖΪ¸ÃÌ×½Ó×ÖTCPдÐÐÁлº³åÇø¾Þϸ¡£Í¨³£ÔÚʹÓÃʱºòÐèÒªÅжϸÃÖµÊÇ·ñ¹»Óá£ÈçÏÂËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ƾ¾Ý×¢ÊÍ¿ÉÖª£¬ÅжÏ×îÐÂÅŶÓskb°üËùÐèµÄ×îС¿Éд¿Õ¼ä¡£²¹¶¡ÖУ¬ÅжÏÊ£Óà·¢ËÍ»º´æΪ´óÓÚ¼´Êǵ±Ç°·¢ËÍÐÐÁÐÕ¼ÓÿռäµÄÒ»°ë£¬¼´»¹ÓÐ1/3ÒÔÉϵĿÕÓà¿Õ¼äʱ£¬¶øÇÒСÓÚsk->sk_sndbuf·¢ËÍÉÏÏ޲ſÉÒÔÕý³£·¢ËÍ£¬·ñÔò¾ÍÅж¨TCPдÐÐÁÐÌ«´ó¡£


CVE-2019-11479


¸Ã©¶´ÓÉÓÚ¹ý¶ÈÏûºÄ×ÊÔ´µ¼Ö¾ܾø·þÎñ¡£Èç¹û¶ñÒâÊý¾Ý°ü½«MSSÑ¡ÏîÉèÖóɽÏСֵ£¬Õ⽫ÆÈʹЭÒéÕ»»¨·Ñ·Ç³£¸ßµÄÍøÂç»òCPU×ÊÔ´·¢ËÍÊý¾Ý°ü¿ªÏú¡£LinuxÄÚºËÖн«MSS_NOWÓ²±àÂëΪ48¡£Æ¾¾Ý²¹¶¡¿ÉÖª£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


½øÐÐÁËmax×î´óÖµÅжÏ£¬¶ø²»ÔÙÊÇÀιÌÓ²±àÂë¡£ÕâÀïµÄsysctl_tcp_min_snd_mss±»ÉèÖÃΪ65535£¬ÈçÏÂËùʾ£º


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÖÆÖ¹Á˹¥»÷ÕßʹÓü«Ð¡MSSÖµ¡£


Ó°Ïì°æ±¾¼°²¹¶¡ÐÞ¸´


¼°Ê±¸üÐÂ×îв¹¶¡»ò½ûÓÃSACKºÍ¹ýÂ˼«Ð¡MSSµÄÊý¾Ý°ü¡£


CVE-2019-11477

Ó°Ïì°æ±¾£º

  • Linux 2.6.29 ~ 4.19.13£¨stable kernel releases 4.4.182,  4.9.182, 4.14.127, 4.19.52, 5.1.11³ýÍ⣩

  • RHEL 8 (kernel, kernel-rt)£¬RHEL 7 (kernel, kernel-rt)£¬RHEL 6

½ûÓÃsack£º

  • sudo sysctl -w net.ipv4.tcp_sack=0

²¹¶¡£º

  • https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/commit/?id=3b4929f65b0d8249f19a50245cd88ed1a2f78cff

CVE-2019-11478

Ó°Ïì°æ±¾£º

  • Linux 2.6.29 ~ 4.19.13£¨stable kernel releases 4.4.182,  4.9.182, 4.14.127, 4.19.52, 5.1.11³ýÍ⣩

  • RHEL 8 (kernel, kernel-rt)£¬RHEL 7 (kernel, kernel-rt)£¬RHEL 6£¬RHEL 5

½ûÓÃsack£º

  • sudo sysctl -w net.ipv4.tcp_sack=0

²¹¶¡£º

  • https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/commit/?id=f070ef2ac66716357066b683fb0baf55f8191a2e

CVE-2019-11479

Ó°Ïì°æ±¾£º

  • Linux 2.6.29 ~ 4.19.13£¨stable kernel releases 4.4.182,  4.9.182, 4.14.127, 4.19.52, 5.1.11³ýÍ⣩

  • RHEL 8 (kernel, kernel-rt)£¬RHEL 7 (kernel, kernel-rt)£¬RHEL 6£¬RHEL 5

¹ýÂËÃüÁ

  • sudo iptables -A INPUT -p tcp -m tcpmss --mss 1:500 -j DROP

¹Ø±Õtcp_mtu_probing£º

  • sysctl net.ipv4.tcp_mtu_probing

²¹¶¡£º

  • https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/commit/?id=5f3e2bf008c2221478101ee72f5cb4654b9fc363

  • https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/commit/?id=967c05aee439e6e5d7d805e195b3a20ef5c433d6