LinuxÄÚºËSCTPЭÒ驶´·ÖÎöÓ븴ÏÖ

Ðû²¼Ê±¼ä 2019-05-30
©¶´Åä¾°


LinuxÄÚºËSCTPЭÒéʵÏÖÖдæÔÚÒ»¸öÄþ¾²Â©¶´CVE-2019-8956£¨CNVD-2019-06182¡¢CNNVD-201902-823£©£¬¿ÉÒÔµ¼Ö¾ܾø·þÎñ¡£¸Ã©¶´´æÔÚÓÚnet/sctp/socket.cÖеÄsctp_sendmsg()º¯Êý£¬¸Ãº¯ÊýÔÚ´¦ÖÃSENDALL±êÖ¾²Ù×÷¹ý³Ìʱ´æÔÚuse-after-free©¶´¡£


SCTPЭÒé¼ò½é


Á÷¿ØÖÆ´«ÊäЭÒ飨Stream Control Transmission Protocol£¬SCTP£©ÊÇÒ»ÖÖ¿É¿¿µÄ´«ÊäЭÒ飬ËüÔÚÁ½¸ö¶ËµãÖ®¼äÌṩÎȶ¨¡¢ÓÐÐòµÄÊý¾Ýͨ±¨·þÎñ£¨·Ç³£ÀàËÆÓÚ TCP£©£¬¶øÇÒ¿ÉÒÔ±£»¤Êý¾ÝÏûÏ¢½çÏÞ£¨ÀýÈç UDP£©¡£ÓëTCPºÍ UDP²îÒ죬SCTP ÊÇͨ¹ý¶àËÞÖ÷£¨Multi-homing£©ºÍ¶àÁ÷£¨Multi-streaming£©¹¦Ð§ÌṩÕâЩÊÕÒæµÄ£¬ÕâÁ½ÖÖ¹¦Ð§¾ù¿ÉÌá¸ß¿ÉÓÃÐÔ¡£


¶àËÞÖ÷£¨Multi-homing£©ÎªÓ¦Ó÷¨Ê½ÌṩÁË±È TCP ¸ü¸ßµÄ¿ÉÓÃÐÔ¡£¶àËÞÖ÷Ö÷»ú¾ÍÊÇһ̨¾ßÓжà¸öÍøÂç½Ó¿ÚµÄÖ÷»ú£¬Òò´Ë¿ÉÒÔͨ¹ý¶à¸ö IP µØÖ·À´·ÃÎÊÕą̂Ö÷»ú¡£ÔÚ TCP ÖУ¬Á¬½Ó£¨connection£© ÊÇÖ¸Á½¸ö¶ËµãÖ®¼äµÄÒ»¸öͨµÀ£¨ÔÚÕâÖÖÇé¿öÏ£¬¾ÍÊÇÁ½Ì¨Ö÷»úµÄÍøÂç½Ó¿ÚÖ®¼äµÄÒ»¸öÌ×½Ó×Ö£©¡£SCTP ÒýÈëÁË¡°ÁªºÏ£¨association£©¡±µÄ¿´·¨£¬ËüÒ²ÊÇ´æÔÚÓÚÁ½Ì¨Ö÷»úÖ®¼ä£¬µ«¿ÉÒÔʹÓÃÿ̨Ö÷»úÉϵĶà¸ö½Ó¿Ú½øÐÐЭ×÷¡£

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


©¶´Ô­Àí


©¶´²¹¶¡´úÂëÈçÏ£¬²¹¶¡´úÂ뽫list_for_each_entry»»³ÉÁËlist_for_each_entry_safe¡£


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


ºê½ç˵list_for_each_entry¹¦Ð§ÊDZéÀúep->asocsÁ´±íÖеÄasoc½Úµã¡£ºê½ç˵list_for_each_entryºÍlist_for_each_entry_safeÈçÏÂËùʾ£º


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


ºê½ç˵list_for_each_entry_safeÖÐÌí¼ÓÁËÒ»¸ön£¬¸ÃnÓÃÀ´´æ·ÅposÖ¸ÏòµÄ½ÚµãµÄÏÂÒ»¸ö½ÚµãλÖá£Ê¹Óøúê¿ÉÒÔ¶ÔÁ´±í½øÐÐɾ³ý²Ù×÷¡£


ÏÂÃæ¶Ôsctp_sendmsgº¯Êýµ÷ÓÃÁ´½øÐзÖÎö¡£sctp_sendmsgÊÇ»ùÓÚSCTPЭÒéµÄsendmsgÀàÐͺ¯Êý£¬ÓÃÓÚ·¢ËÍSCTPÊý¾Ý°ü¡£Òªº¦ÊµÏÖÈçÏ£º


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


ÐÐ2038£¬´ÓmsgÖнâÎö³ösinfo£»ÐÐ2043£¬»ñÈ¡µ½sflags¡£


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


ÐÐ2055£¬ÅжÏsflagsÊÇ·ñΪSCTP_SENDALL¡£Èç¹û´æÔÚ£¬½øÈëlist_for_each_entryÑ­»·ÖУ¬ÒÀ´Î±éÀúep->asocsÁ´±í¡£ÕâÀïµÄasocs¾ÍÊÇ´æ·Å¶à¸öassociationÁ¬½ÓµÄÁ´±í¡£SCTP_SENDALL±êÖ¾´ú±íÏòasocsÁ´±íÖеÄËùÓÐassociationÁ¬½Ó·¢ËÍÊý¾Ý°ü¡£ËùÒÔasocsÁ´±íÖÐÖÁÉÙÒª´æÔÚÒ»¸öassociation½Úµã¡£½øÈësctp_sendmsg_check_sflagsº¯Êýºó£¬¸Ãº¯ÊýʵÏÖÈçÏ£º


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


Ê×ÏÈ£¬¼ì²éasocÊÇ·ñ´¦ÓÚCLOSED״̬£¬¼ì²éasocÊÇ·ñ´¦ÓÚ¼àÌý״̬£¬¼ì²éasocÊÇ·ñshutdown¡£


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


½ÓÏÂÀ´£¬¼ì²ésflagsÊÇ·ñΪSCTP_ABORT£¬Æ¾¾ÝrfcÎĵµ¿ÉÖªABORTµÄÓ÷¨ÒÔ¼°ABORTÖ¸ÁîµÄÊý¾Ý°ü¸ñʽ¡£SCTP_ABORT±êÖ¾´ú±íÖÐÖ¹Ò»¸öassociationÁ¬½Ó£¬Õâ¸öÒ²Êǵ¼Ö©¶´µÄÒªº¦¡£


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


ÐÐ1863£¬sctp_make_abort_user½á¹¹ABORTÖ¸ÁîµÄchunk£»ÐÐ1868£¬µ÷ÓÃsctp_primitive_ABORT·¢ËÍÖÐÖ¹Ò»¸öassociationµÄchunk¡£


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


ͨ¹ýµ÷ÊÔ¿ÉÖªµ÷ÓÃsctp_sf_do_9_1_prm_abortº¯Êý½øÐÐABORT²Ù×÷£¬¸Ãº¯Êý½«»á½øÐÐÈçϲÙ×÷£º


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


Ìí¼ÓÒ»Ìõɾ³ýasocµÄcommands£¬È»ºó·µ»ØSCTP_DISPOSITION_ABORT¡£Õý³£·µ»Ø£¬¼ÌÐø·ÖÎö£¬·µ»Øµ½sctp_do_smº¯ÊýÖС£


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


ÐÐ1188Õý³£·µ»Øºó£¬ÐÐ1191µ÷ÓÃsctp_side_effectsº¯Êýƾ¾Ý״̬»ú¶ÔÓ¦µÄ״̬½øÐвÙ×÷¡£


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


ÐÐ1246£¬½«asocÖÿÕ£¬ABORT±êÖ¾´ú±íÖÐÖ¹Ò»¸öassociation²Ù×÷½áÊø¡£´Ósctp_sendmsg_check_sflagsº¯Êý·µ»Øµ½sctp_sendmsgº¯ÊýÖУ¬ºêlist_for_each_entryÑ­»·ÖбéÀú»ñÈ¡µÚÒ»¸öasoc½Úµãʱ£¬½øÈësctp_sendmsg_check_sflagsº¯Êý½«µÚÒ»¸öasocÖÿÕ£¬È»ºóÔÙ½øÐбéÀúºóÃæ½Úµãʱ£¬¾Í·¢ÉúÁËÁãµØÖ·ÒýÓõ¼Ö©¶´·¢Éú¡£


©¶´¸´ÏÖ


½«sflagsÉèÖóÉSENDALL | ABORT£¬±£Ö¤½øÈëlist_for_each_entryÑ­»·ºÍsctp_sendmsg_check_sflags()º¯Êý¼´¿É¡£ÔÚ4.20ÄÚºËÏÂÑéÖ¤ÈçÏ¡£ÓÉÓڸ鶴ÊÇNULL-PTR deref£¬¼´ÊÇÁãµØÖ·½âÒýÓã¬ÎÞ·¨½øÒ»²½ÀûÓá£

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


ÐÞ¸´½¨Òé


¸Ã©¶´Ó°ÏìLinux Kernel 4.19.xºÍ4.20.x£¬½¨Òé¸üе½version 4.20.8 »ò4.19.21¡£²¹¶¡Á´½ÓÈçÏ£ºhttps://git.kernel.org/linus/ba59fb0273076637f0add4311faa990a5eec27c0