LinuxÄÚºËTCPºÍ̸¶à¸öSACKÖ°Äܻؾø·þÎñ·ì϶·ÖÎö
°ä²¼¹¦·ò 2019-06-212019Äê6ÔÂ18ÈÕ£¬£¬£¬Redhat°ä²¼°²È«²¼¸æ£¬£¬£¬LinuxÄÚºËTCP/IPºÍ̸ջ´æÔÚ3¸ö°²È«·ì϶£¨CVE-2019-11477/CVE-2019-11478/CVE-2019-11479£©£¬£¬£¬ÕâЩ·ì϶Óë×î´ó·Ö¶Î¾Þϸ£¡£¡£¨MSS£©ºÍTCPÑ¡ÔñÐÔÈ·ÈÏ£¨SACK£©Ö°ÄÜÓйأ¬£¬£¬ÔÊÐíÔ¶³Ì¹¥»÷Õß½øÐлؾø·þÎñ¹¥»÷¡£¡£¡£
¹Ø¼ü¸ÅÄî
Êý¾Ý°üÖØ´«È·ÈÏ»úÖÆ
TCPÊý¾Ý°ü´«Êä¹ý³ÌÖУ¬£¬£¬À´×Ô»¬¶¯´°¿ÚµÄÊý¾Ý°üÃÔʧ¿ÉÄܶÔTCPÍÌÍÂÁ¿²úÉúÓ°Ïì¡£¡£¡£TCPʹÓÃÀÛ»ýÈ·ÈÏ£¨ACK£©¹æ»®½â¾ö¸ÃÎÊÌ⣬£¬£¬ÆäÖв»½Ó¹Ü²»ÔÚ»¬¶¯´°¿Ú×ó±ßÔµµÄ½Ó¹Ü¶Î£¬£¬£¬Õâ»áÇ¿ÖÆ·¢ËÍ·½ÆÚ´ýÍù·µ¹¦·òÒÔÕÒ³öÿ¸öÃÔʧµÄÊý¾Ý°ü£¬£¬£¬»òÕß²»Óø¹µØÖØÐ´«ÊäÒÑÕýÈ·½Ó¹ÜµÄ¶Î£¬£¬£¬´Ó¶ø½µµÍÕûÌåÍÌÍÂÁ¿¡£¡£¡£
×î´ó·Ö¶Î¾Þϸ£¡£¡£¨Maximum Segment Size£©
MSS£¨Maximum Segment Size£¬£¬£¬×î´ó±¨ÎĶξÞϸ£¡£¡£©µÄ¸ÅÄîÊÇÖ¸TCP²ãËù¿ÉÄܽӹܵÄ×î´ó·Ö¶Î¾Þϸ£¡£¡£¬£¬£¬¸ÃÖµÖ»Ô̺¬TCP¶ÎµÄÊý¾Ý²¿ÃÅ£¬£¬£¬²»Ô̺¬Option²¿ÃÅ¡£¡£¡£±ðµÄ£¬£¬£¬ÔÚTCPÊײ¿ÓÐÒ»¸öMSSÑ¡Ï£¬£¬ÔÚÈý´ÎÎÕÊÖ¹ý³ÌÖУ¬£¬£¬TCP·¢ËͶËʹÓøÃÑ¡Ïî֪ͨ¶Ô·½×Ô¼ºËùÄܽÓÊܵÄ×î´ó·Ö¶Î¾Þϸ¡£¡£¡£
TSO£¨TCP Segmentation Offload£©
TSOÊÇÒ»ÖÖÀûÓÃÍø¿¨À´¶Ô´óÊý¾Ý°ü½øÐÐ×Ô¶¯·Ö¶Î£¬£¬£¬½µµÍCPU¸ºÔصļ¼Êõ¡£¡£¡£ÆäÖØÒªÊÇÑÓ³¤·Ö¶Î¡£¡£¡£
GSO(Generic Segmentation Offload)
·ì϶µÀÀí
CVE-2019-11477
¸Ãtcp_skb_cb½á¹¹Ìå´æ·Å×ÅTCPÿ¸öÊý¾Ý°üµÄ½ÚÖÆÐÅÏ¢£¬£¬£¬Æ¾¾Ý×¢½â¿ÉÖª£¬£¬£¬tcp_gso_segs/sizeÖ»ÓÃÓÚд¶ÓÁйý³ÌÖС£¡£¡£
½á¹¹Ìå×îºóÒ»¸ö³ÉÔ±ÊÇfrags[MAX_SKB_FRAGS]Êý¾Ý¡£¡£¡£MAX_SKB_FRAGSÉêÃ÷ÈçÏÂËùʾ£º
Êý¾Ý·ÖƬ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¶ÓÁÐÖнøÐÐÖØ´«¡£¡£¡£
skb_shift()ºÍtcp_shifted_skb()Á½¸öº¯ÊýÖØÒªÊµÏÖ¸ÃÖ°ÄÜ¡£¡£¡£ÖØ´«¹ý³ÌÖжà¸öskb¶ÓÁй鲢µ½Ò»¸öskb¶ÓÁÐÖУ¬£¬£¬ÈôÊÇÌî³ä17¸ö·ÖƬµ½×î´óÈÝÁ¿£¬£¬£¬ 17*32*1024/8=69632£¬£¬£¬ÒѾ´óÓÚ65535£¬£¬£¬µ¼ÖÂÎÞ·ûºÅÕûÊýÒç³ö¡£¡£¡£
ÐÐ1299£¬£¬£¬ÅжÏtcp_gso_segsºÍpcountµÄ¾Þϸ£¡£¡£¬£¬£¬ÈôÊÇtcp_gas_segsСÓÚpcount£¬£¬£¬BUG_ON¶ÏÑÔ´¥·¢µ¼ÖÂÄں˱ÀÀ£¡£¡£¡£
²¹¶¡Æ½±ðÀëÅжÏÁËskb->len+shift_len²»ÄÜ´óÓÚ65535*8×Ö½ÚºÍtcp_skb_pcount(to) + pcount²»ÄÜ´óÓÚ65535¡£¡£¡£µÚÒ»¸öÅжϣ¬£¬£¬skb->lenÊǰµÊ¾sk_buff½á¹¹ÌåÖаµÊ¾payload³¤¶È£¬£¬£¬shift_len°µÊ¾Òª¹é²¢µ½skbÖеÄpayload¡£¡£¡£
CVE-2019-11478
²¹¶¡ÔÚ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Öµ¡£¡£¡£
Ó°Ïì°æ±¾¼°²¹¶¡ÐÞ¸´
ʵʱ¸üÐÂ×îв¹¶¡»ò½ûÓÃSACKºÍ¹ýÂ˼«Ð¡MSSµÄÊý¾Ý°ü¡£¡£¡£
|
CVE-2019-11477 |
Ó°Ïì°æ±¾£º
|
|
½ûÓÃsack£º
|
|
|
²¹¶¡£¡£¡£º
|
|
|
CVE-2019-11478 |
Ó°Ïì°æ±¾£º
|
|
½ûÓÃsack£º
|
|
|
²¹¶¡£¡£¡£º
|
|
|
CVE-2019-11479 |
Ó°Ïì°æ±¾£º
|
|
¹ýÂ˺ÅÁ
¹Ø±Õtcp_mtu_probing£º
|
|
|
²¹¶¡£¡£¡£º
|


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