LinuxÄÚºËSCTPÐÒéÎó²îÆÊÎöÓ븴ÏÖ
Ðû²¼Ê±¼ä 2019-05-30LinuxÄÚºË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£©¹¦Ð§ÌṩÕâЩÊÕÒæµÄ£¬£¬£¬£¬£¬£¬ÕâÁ½ÖÖ¹¦Ð§¾ù¿ÉÌá¸ß¿ÉÓÃÐÔ¡£¡£
Îó²îÔÀí
Îó²î²¹¶¡´úÂëÈçÏ£¬£¬£¬£¬£¬£¬²¹¶¡´úÂ뽫list_for_each_entry»»³ÉÁËlist_for_each_entry_safe¡£¡£
ºê½ç˵list_for_each_entry_safeÖÐÌí¼ÓÁËÒ»¸ön£¬£¬£¬£¬£¬£¬¸ÃnÓÃÀ´´æ·ÅposÖ¸ÏòµÄ½ÚµãµÄÏÂÒ»¸ö½ÚµãλÖᣡ£Ê¹Óøúê¿ÉÒÔ¶ÔÁ´±í¾ÙÐÐɾ³ý²Ù×÷¡£¡£
ÐÐ2038£¬£¬£¬£¬£¬£¬´ÓmsgÖÐÆÊÎö³ösinfo£»£»£»ÐÐ2043£¬£¬£¬£¬£¬£¬»ñÈ¡µ½sflags¡£¡£
ÐÐ2055£¬£¬£¬£¬£¬£¬ÅжÏsflagsÊÇ·ñΪSCTP_SENDALL¡£¡£ÈôÊDZ£´æ£¬£¬£¬£¬£¬£¬½øÈë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


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