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£©¡±µÄ¸ÅÄËüÒ²ÊÇ´æÔÚÓÚÁ½Ì¨Ö÷»úÖ®¼ä£¬µ«Äܹ»Ê¹ÓÃÿ̨Ö÷»úÉϵĶà¸ö½Ó¿Ú½øÐкÏ×÷¡£ ¡£¡£

OG¶«·½Ìü¡¤(Öйú´ó½)


·ì϶µÀÀí


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


ÏÂÃæ¶Ôsctp_sendmsgº¯ÊýŲÓÃÁ´½øÐзÖÎö¡£ ¡£¡£sctp_sendmsgÊÇ»ùÓÚSCTPºÍ̸µÄsendmsgÀàÐͺ¯Êý£¬ÓÃÓÚ·¢ËÍSCTPÊý¾Ý°ü¡£ ¡£¡£¹Ø¼üʵÏÖÈçÏ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1863£¬sctp_make_abort_user»ú¹ØABORTÖ¸ÁîµÄchunk£»ÐÐ1868£¬Å²ÓÃsctp_primitive_ABORT·¢ËͶôÖÆÒ»¸öassociationµÄchunk¡£ ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


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


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ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£¬¼´ÊÇÁãµØÖ·½âÒýÓã¬ÎÞ·¨½øÒ»²½ÀûÓᣠ¡£¡£

OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÞ¸´½¨Òé


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