ÄϹ¬NGÓéÀÖADLab£ºLinuxÄÚºËCVE-2017-11176Îó²îÆÊÎöÓ븴ÏÖ

Ðû²¼Ê±¼ä 2019-01-04
Îó²îÅä¾°

LinuxÄÚºËÖеÄPOSIX ÐÂÎÅÐÐÁÐʵÏÖÖб£´æÒ»¸öUAFÎó²îCVE-2017-11176¡£¡£¡£ ¡£¹¥»÷Õß¿ÉÒÔʹÓøÃÎó²îµ¼Ö¾ܾøÐ§ÀÍ»òÖ´ÐÐí§Òâ´úÂë¡£¡£¡£ ¡£±¾ÎĽ«´ÓÎó²î³ÉÒò¡¢²¹¶¡ÆÊÎöÒÔ¼°Îó²î¸´Ïֵȶà¸ö½Ç¶È¶Ô¸ÃÎó²î¾ÙÐÐÏêϸÆÊÎö¡£¡£¡£ ¡£

Îó²îÆÊÎö


PosixÐÂÎÅÐÐÁÐÔÊÐíÒì²½ÊÂÎñ֪ͨ £¬£¬µ±ÍùÒ»¸ö¿ÕÐÐÁа²ÅÅÒ»¸öÐÂÎÅʱ £¬£¬PosixÐÂÎÅÐÐÁÐÔÊÐí±¬·¢Ò»¸öÐźŻòÆô¶¯Ò»¸öÏ̡߳£¡£¡£ ¡£ÕâÖÖÒì²½ÊÂÎñ֪ͨŲÓÃmq_notifyº¯ÊýʵÏÖ £¬£¬mq_notifyΪָ¶¨ÐÐÁн¨Éè»òɾ³ýÒ첽֪ͨ¡£¡£¡£ ¡£ÓÉÓÚmq_notifyº¯ÊýÔÚ½øÈëretryÁ÷³ÌʱûÓн«sockÖ¸ÕëÉèÖÃΪNULL £¬£¬¿ÉÄܵ¼ÖÂUAFÎó²î¡£¡£¡£ ¡£


´Ó²¹¶¡´úÂë¿ÉÖª £¬£¬½«sockÉèÖÃΪNULL¼´¿É¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´¿´¿´Îó²îÒòÓÉ £¬£¬ÕâÀïÒÔ4.1.0°æ±¾Ô´ÂëΪÀý¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÔÚmq_notifyº¯ÊýÖÐ £¬£¬ u_notificationÊÇ´ÓÓû§²ã´«½øÀ´µÄ £¬£¬1193ÐÐÅжÏu_notificationÊÇ·ñΪ¿Õ £¬£¬ÈôÊÇ·Ç¿Õ £¬£¬Í¨¹ýcopy_from_user½«u_notificationÖеÄÊý¾Ý¿½±´µ½notificationÖÐ £¬£¬ÕâÀォÊý¾Ý´ÓÓû§²ã¿½±´µ½ÁËÄں˲ã¡£¡£¡£ ¡£ÈôÊÇ¿½±´Ê§°Ü £¬£¬Ö±½ÓÍ˳ö¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´ £¬£¬ncºÍsock»®·ÖÖÿÕ¡£¡£¡£ ¡£ÐÐ1203 £¬£¬ÈôÊÇu_notification²»Îª¿Õ £¬£¬Ê×ÏÈÒÀ´ÎÅжÏnotification.sigev_notify±ØÐèΪSIGEV_NONE»òSIGEV_SIGNAL»òSIGEV_THREAD¡£¡£¡£ ¡£ÈôÊÇnotification.sigev_notifyΪSIGEV_SIGNAL £¬£¬¾ÍÅжϸÃÐźÅÊÇ·ñÕýµ±¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ1212 £¬£¬ÈôÊÇnotification.sigev_notifyΪSIGEV_THREAD £¬£¬½øÈëÒªº¦´úÂë¿é¡£¡£¡£ ¡£ÐÐ1216 £¬£¬Í¨¹ýalloc_skb½¨ÉèÒ»¸önotify_skb £¬£¬ÓÃÓÚÎüÊÕÊý¾Ý¡£¡£¡£ ¡£ÐÐ1221 £¬£¬Í¨¹ýcopy_from_user½«notification.sigev_value.sival_ptrÖ¸ÏòµÄÊý¾Ý¿½±´µ½nc->dataÖС£¡£¡£ ¡£ÕâÀï±ØÐèÀÖ³É £¬£¬²»È»Ö±½ÓÍ˳ö£»£»ÐÐ1229 £¬£¬Å²ÓÃskb_putÉèÖÃÐÂÎÅÊý¾ÝÍ·²¿¡£¡£¡£ ¡£ÐÐ1231µ½ÐÐ1248ÊÇretryÑ­»·Ìå¡£¡£¡£ ¡£ÐÐ1232 £¬£¬Å²ÓÃfdgetº¯Êý»ñÈ¡ÎļþÐÎò·û¡£¡£¡£ ¡£ÐÐ1237 £¬£¬Å²ÓÃnetlink_getsockbyfilpº¯Êýͨ¹ýÎļþÐÎò·û»ñÈ¡netlink_sock £¬£¬Ïêϸ¿´Ò»ÏÂnetlink_getsockbyfilpº¯Êý¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ŲÓÃfile_inodeͨ¹ýfilpÕÒµ½¶ÔÓ¦µÄinode½Úµã £¬£¬È»ºóͨ¹ýSOCK_Iº¯Êý´¦Öóͷ£inode½Úµã¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÕâÀïͨ¹ýºêcontainer_ofÔÚsocket_alloc½á¹¹ÌåÖÐÕÒ³ösocket³ÉÔ±¡£¡£¡£ ¡£ÕâÀïÚ¹ÊÍһϠ£¬£¬SOCKET_I·µ»ØÖµÊÇsocket½á¹¹Ìå¡£¡£¡£ ¡£×Åʵsock½á¹¹ÌåÖеÚÒ»¸ö³ÉÔ±sock_commonÒ²ÊÇsocketÀàÐÍ £¬£¬ÊÇÒ»¸öÃÔÄã°æsocket¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÏÂÃæ¿´Ò»ÏÂsock_common½á¹¹Ìå¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ1609 £¬£¬»ñÈ¡µ½sockºó £¬£¬È»ºóÅжÏsock->sk_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£¡£¡£ ¡£ÐÐ1613 £¬£¬½Ó×ÅŲÓÃsock_holdÔöÌíÒýÓüÆÊý¡£¡£¡£ ¡£sock_holdº¯ÊýÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÕâÀïatomic_inc¾ÙÐÐsk_refcnt¼Ó1¡£¡£¡£ ¡£netlink_getsockbyfilpº¯Êý·µ»Øsock £¬£¬ÕâʱsockµÄÒýÓüÆÊý¼Ó1¡£¡£¡£ ¡£½ÓÏÂÀ´ £¬£¬ÐÐ1246 £¬£¬Å²ÓÃnetlink_attachskb¡£¡£¡£ ¡£ÕâÊǸöÒªº¦º¯Êý £¬£¬¸Ãº¯Êý¹¦Ð§Êǽ«skb°ó¶¨µ½netlink socketÉÏ £¬£¬ÏêϸҪº¦´úÂëÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ1683 £¬£¬Å²ÓÃsock_putïÔÌ­ÒýÓüÆÊýÒ»´Î £¬£¬×îºóreturn 1 £¬£¬º¯Êý·µ»Ø £¬£¬Ö±½Ógotoµ½retry±êÇ©µØ·½¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÕâÀïÐÐ1237ºÍÐÐ1246 £¬£¬ÕâÁ½´¦Å²ÓÃÕýºÃ¾ÙÐÐÁËÒýÓüÆÊýµÖÏû¡£¡£¡£ ¡£ÐÐ1247µÄifÓï¾äÖв¢Ã»Óн«sockÖÃ¿Õ £¬£¬ÔÙ¿´ÐÐ1233 £¬£¬ÈôÊÇf.fileΪ¿Õ £¬£¬ÄǾÍÖ±½Ógotoµ½out±êÇ©¡£¡£¡£ ¡£out±êÇ©´úÂëÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ1306 £¬£¬ÅжÏsockÊÇ·ñΪ¿Õ £¬£¬ÈôÊDz»Îª¿Õ £¬£¬Å²ÓÃnetlink_detachskbº¯Êý¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÊÍ·Åskb £¬£¬²¢ïÔÌ­skÒýÓüÆÊý £¬£¬¾ÙÐÐÊÍ·Å¡£¡£¡£ ¡£ ÄÇô¾ÍÓÐÎÊÌâÁË £¬£¬ÈôÊÇÎÒÃǽ¨ÉèAÏ̼߳á³Önetlink_attachskb·µ»Ø1 £¬£¬²¢Öظ´retryÂß¼­ £¬£¬Õâ¸öʱ¼äsockµÄÒýÓüÆÊýÊǼá³ÖƽºâµÄ £¬£¬Ò»¼ÓÒ»¼õ £¬£¬¿ÉÊÇsock²¢²»ÊÇΪ¿Õ¡£¡£¡£ ¡£Í¬Ê±ÔÙ½¨ÉèBÏß³ÌÈ¥¹Ø±Õnetlink socket¶ÔÓ¦µÄÎļþÐÎò·û¡£¡£¡£ ¡£ÓÉÓÚBÏ̹߳رÕÁËnetlink socketµÄÎļþÐÎò·û £¬£¬ÄÇAÏß³ÌÔÚretryÂß¼­ÖÐ £¬£¬ÐÐ1232 £¬£¬Å²ÓÃfdgetʱ»áʧ°Ü £¬£¬È»ºóÖ±½Ógotoµ½out±êÇ© £¬£¬¾ÙÐÐÊÍ·Å £¬£¬¾ÙÐÐÁ˶þ´ÎÊÍ·Å £¬£¬µ¼ÖÂÎó²î¡£¡£¡£ ¡£Õâ¸öÎó²îÊÇÊôÓÚÌõ¼þ¾ºÕùÐ͵Ķþ´ÎÊÍ·ÅÎó²î £¬£¬Ö»ÔÚÒ»¸öÏß³ÌÖÐ £¬£¬ÊÇÎÞ·¨´¥·¢Îó²î¡£¡£¡£ ¡£


Õâ¸öÎó²îÔ­Àí½ÏÁ¿¼òÆÓ £¬£¬¿ÉÊÇÔõÑù´¥·¢Õâ¸öÎó²îÕվɽÏÁ¿Öش󡣡£¡£ ¡£Ê×ÏÈ £¬£¬ÔõÑùÈÃnetlink_attachskb·µ»Ø1 £¬£¬´Ó¶øË³Ëì½øÈëretryÂß¼­¡£¡£¡£ ¡£Ôٴλؿ´netlink_attachskbµÄʵÏÖ¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ1657 £¬£¬Í¨¹ýnlk_skº¯Êýͨ¹ýsk»ñÈ¡netlink_sock¡£¡£¡£ ¡£ÕâÀïµÄnlk_skÈçÏ¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ͨ¹ýŲÓúêcontainer_of»ñÈ¡netlink_sock¡£¡£¡£ ¡£netlink_sock½á¹¹ÌåÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


netlink_sock½á¹¹ÌåµÚÒ»¸ö³ÉÔ±ÊÇsockÀàÐÍ £¬£¬¶øsock½á¹¹ÌåµÄµÚÒ»¸ö³ÉÔ±ÊÇsocket¡£¡£¡£ ¡£ÐÐ1660 £¬£¬µÚÒ»¸öifÅжϱØÐèµÃ½øÈë¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


!netlink_skb_is_mmaped(skb)¿Ï¶¨·µ»Øtrue £¬£¬Òªº¦ÊÇsk->sk_rmem_alloc>sk->sk_rcvbuf || test_bit(NETLINK_CONGESTED, &nlk->state)Ч¹û±ØÐèÊÇtrue¡£¡£¡£ ¡£


ÕâÀïͨ¹ýÉèÖÃsk->sk_rmem_allocµÄ¾ÞÏ¸ÈÆ¹ýcheck¸üΪÀû±ã £¬£¬´úÂëÈçÏ¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÈôÊÇifÅжÏÇ·ºà¹ý £¬£¬½Ó×ÅŲÓÃnetlink_skb_set_owner_rº¯Êý £¬£¬ÈçÏÂËùʾ¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ878 £¬£¬Å²Óúêatomic_add £¬£¬¸ÃºêÖ´ÐÐÔ­×Ó¼Ó²Ù×÷¡£¡£¡£ ¡£ÕâÐдúÂëµÄ¼ÄÒåÊÇ£ºÔÚsk->sk_rmem_allocµÄ»ù´¡ÉϼÓÉÏskb->truesize¡£¡£¡£ ¡£µÈͬÓÚsk->sk_rmem_alloc += skb->truesize¡£¡£¡£ ¡£¼ÈÈ»¸Ãº¯ÊýÀïÕâÐдúÂë¿ÉÒÔÖ±½ÓÔöÌísk->sk_rmem_allocµÄ¾Þϸ £¬£¬ÄÇô¿É²»¿ÉÒÔ¶à´ÎŲÓÃnetlink_skb_set_owner_rº¯ÊýÔöÌísk->rmem_allocµÄÖµ £¿£¿£¿ÀíÂÛÉÏÊÇÍêÈ«¿ÉÒ﵀ £¬£¬¿´¿´ÔõÑù´ÓÓû§²ãµÖ´ïÕâ¸öº¯Êý¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ͨ¹ýunderstand¹¤¾ß¿ÉÒÔ¿ìËÙÕÒµ½netlink_skb_set_owner_rµÄŲÓÃÁ´£ºnetlink_sendmsg->netlink_unicast->netlink_attachskb->netlink_skb_set_owner_r¡£¡£¡£ ¡£


ÔõÑù˳ËìµÄͨ¹ýº¯ÊýŲÓ÷¾¶ £¿£¿£¿ÕâÀïÐèÒªÆÊÎöÔõÑù´Ónetlink_sendmsgµÖ´ïnetlink_skb_set_owner_r¡£¡£¡£ ¡£netlink_sendmsgº¯ÊýʵÏÖÈçÏ¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ2285 £¬£¬Ê×ÏÈÅжÏmsg->msg_flag²»¿ÉΪMSG_OOB £¬£¬¼ÌÐøÍùÏ¿´¡£¡£¡£ ¡£

ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ2292 £¬£¬ÅжÏmsg->msg_namelenµÄ³¤¶È £¬£¬ÕâÀï±ØÐ費Ϊ¿Õ £¬£¬ËäȻҲ²»»áΪ¿Õ¡£¡£¡£ ¡£½øÈëifºó £¬£¬ÅжÏaddr->nl_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£¡£¡£ ¡£ÐÐ2299 £¬£¬ÅжÏdst_group»òdst_portid²»Îª¿Õ £¬£¬dst_groupÌåÏֶಥģʽ £¬£¬dst_portidÀ´×ÔÓÚaddr->nl_pid £¬£¬Òò´Ë°ü¹Üdst_portid²»Îª¿Õ½ÏÁ¿ÈÝÒס£¡£¡£ ¡£½ÓÏÂÀ´£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ2320 £¬£¬ÅжÏÁËmsg->msg_iter.iov->iov_base²»¿ÉΪ¿Õ¡£¡£¡£ ¡£²¢ÇÒlen²»¿ÉÒÔ´óÓÚsk->sk_sndbuf-32¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


×ÅʵÕû¸öº¯ÊýÖÐ £¬£¬Óû§²ã¿É¿ØµÄÖ»ÓÐÕâô¶à¡£¡£¡£ ¡£Ö±½Ó¿´netlink_unicastµÄŲÓᣡ£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


netlink_unicastº¯ÊýʵÏÖÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


Õû¸öº¯ÊýÖÐ £¬£¬Óû§ÄÜ¿ØÖƵÄδ¼¸¡£¡£¡£ ¡£ÐÐ1783 £¬£¬ÉèÖÃÁËtimeo £¬£¬ÕâÀïÒª°ü¹ÜnonblockΪmsg->msg_flags&MSG_DONTWAIT £¬£¬ÕâÑùÏ̲߳Ų»»á±»block¡£¡£¡£ ¡£ÐÐ1790 £¬£¬ÅжÏskÊÇ·ñΪÄں˰æµÄsk £¬£¬ÔÚÓû§²ã½¨ÉèsocketʱӦʹÓÃNETLINK_USERSOCK¡£¡£¡£ ¡£ÐÐ1793 £¬£¬ÅжÏÊÇ·ñÓÐsk_filter £¬£¬ÕâÀï°ü¹Ü²»½øÈë¸ÃifÓï¾ä £¬£¬²»ÒªÉèÖùýÂËÆ÷¡£¡£¡£ ¡£ÐÐ1800 £¬£¬Ö±½ÓŲÓÃnetlink_attachskb £¬£¬Àֳɵִïnetlink_skb_set_owner_rº¯Êý¡£¡£¡£ ¡£ÕâËãÊÇͨ¹ýŲÓÃnetlink_sendmsgÀ´ÔöÌísk->sk_rmem_allocµÄÀú³Ì¡£¡£¡£ ¡£×ÅʵÎÒÃDz»µ«¿ÉÒÔÔöÌísk->sk_rmem_alloc £¬£¬»¹¿ÉÒÔ¼õСsk->sk_rcvbuf¡£¡£¡£ ¡£


ÄÇôÔõÑù¼õСsk->sk_rcvbuf £¿£¿£¿ÔÚsetsockoptº¯ÊýÖÐ £¬£¬ÕÒµ½sock_setsockoptº¯ÊýÖжÔsk->sk_rcvbufµÄ²Ù×÷¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ773 £¬£¬sk->sk_rcvbufÈ¡val*2ºÍSOCK_MIN_RCVBUFÖ®¼äµÄ×î´óÖµ¡£¡£¡£ ¡£ÐÐ755 £¬£¬valÈ¡valºÍsysctl_rmem_maxÖ®¼äµÄ×îСֵ¡£¡£¡£ ¡£ÐÐ749 £¬£¬Õâ¸öcaseΪSO_RCVBUF¡£¡£¡£ ¡£¼ÌÐøÍùÉÏ¿´¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ693 £¬£¬Òª°ü¹Üoptlen²»Ð¡ÓÚsizeof(int)¡£¡£¡£ ¡£ÐÐ696 £¬£¬½«optval¸³Öµµ½valÖÐ £¬£¬ÕâÀïoptvalÊÇÓû§¿É¿ØµÄ¡£¡£¡£ ¡£ÐÐ703 £¬£¬switch·Ö·¢optname £¬£¬ÒÔÊÇÒª°ü¹ÜoptnameΪSO_RCVBUF¡£¡£¡£ ¡£ÕâÑù¾Í¿ÉÒÔ°ü¹Ü˳ËìµÖ´ïÐÞ¸Äsk->rcvbufµÄ´úÂë´¦¡£¡£¡£ ¡£

µ½ÕâÀï £¬£¬ÎÒÃÇͨ¹ýÁ½ÖÖ·½·¨¾ÙÐÐÈÆ¹ýnetlink_attachskbº¯ÊýÖеĵÚÒ»¸öcheck¡£¡£¡£ ¡£


£¨1£©Í¨¹ýnetlink_sendmsgÔöÌísk->sk_rmem_allocµÄÖµ.

£¨2£©Í¨¹ýsock_setsockopt¾¡¿ÉÄܵؼõСsk->rcvbufµÄÖµ¡£¡£¡£ ¡£


½øÈëifÓï¾äºó £¬£¬¿´ÈçÏ´úÂ룺


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


Õâ¶Î´úÂë»áÈÃÄ¿½ñÏ߳̽øÈëÆÚ´ý״̬ £¬£¬Ö±½Óblock¡£¡£¡£ ¡£ÈôÊDz»Ïë½øÈëÆÚ´ý״̬ £¬£¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD¡£¡£¡£ ¡£¿ÉÊÇÈôÊǰÑsock_flagÉèÖóÉSOCK_DEAD £¬£¬ÄǺóÃæÒ²Ã»ÓÐÐëÒª¾ÙÐÐ £¬£¬Òò´ËÕâÀïÊDZض¨Òª½øÈëÆÚ´ý״̬µÄ¡£¡£¡£ ¡£Ò»ÖÖÇÉÃîµÄÒªÁìÊÇÖ±½ÓŲÓÃwake_up_interruptibleÇ¿ÐнÐÐÑÏ̡߳£¡£¡£ ¡£ÄÇÔõÑùŲÓÃwake_up_interruptibleÄØ £¿£¿£¿º¯ÊýŲÓÃÁ´ºÜÊǼò¶Ì£ºnetlink_setsockopt->wake_up_interruptible¡£¡£¡£ ¡£


ÔÚNetlink_setsockoptº¯ÊýÖУº


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ2182 £¬£¬Å²ÓÃwake_up_interruptible½ÐÐÑÏ̡߳£¡£¡£ ¡£ÐÐ2178 £¬£¬caseΪNETLINK_NO_ENOBUFS¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ2131 £¬£¬ÅжÏlevel±ØÐèΪSOL_NETLINK £¬£¬ÐÐ2134 £¬£¬ÅжÏoptname²»¿ÉΪNETLINK_RX_RINGºÍNETLINK_TX_RING £¬£¬Í¬Ê±°ü¹Üoptlen´óÓÚ¼´ÊÇsizeof(int)¡£¡£¡£ ¡£ÐÐ2139 £¬£¬switch·Ö·¢optname £¬£¬ÕâÀïÒª°ü¹ÜoptnameΪNETLINK_NO_ENOBUFS¡£¡£¡£ ¡£µ½ÕâÀï £¬£¬»ù±¾ÉϾͿÉÒÔ°ü¹Ünetlink_attachskb·µ»Ø1¡£¡£¡£ ¡£


°ü¹Ü½øÈëretryÑ­»·ºó £¬£¬Õâ¸öʱ¼äsockÒѾ­²»Îª¿Õ¡£¡£¡£ ¡£½ÓÏÂÀ´ÒªÊ¹retryÑ­»·ÖÐÍÉ»¯ £¬£¬Ö±½ÓÌø×ªµ½out £¬£¬´úÂëÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÐÐ1232 £¬£¬Í¨¹ýfdget»ñÈ¡notification.sigev_signoµÄfd¡£¡£¡£ ¡£Notification.sigev_signoÊÇÓû§Ì¬´«½øÀ´µÄ £¬£¬Òò´ËÍêÈ«¿ÉÒÔÔÚÓû§²ãÖ±½ÓcloseÕâ¸ösocket¡£¡£¡£ ¡£ÔÚÓû§²ãcloseÕâ¸ösocketºó £¬£¬ÐÐ1233 £¬£¬½øÈëifÂß¼­ £¬£¬È»ºóÌøµ½out±êÇ©¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


Õâ¸öʱ¼äsockÊÇ·Ç¿ÕµÄ £¬£¬ifÅжÏÎªÕæ £¬£¬½øÈënetlink_destachskb £¬£¬½ÓמÍÊÇfreeÍ߽⡣¡£¡£ ¡£


Îó²î¸´ÏÖ


¹ØÓÚUAFÀàÐ͵ÄÎó²î £¬£¬Í¨ÓÃÒªÁì¾ÍÊÇʹÓöÑÅçÉäռλ¡£¡£¡£ ¡£±¾´ÎÎó²îÖб»¶à´ÎÊͷŵŤ¾ßÊÇnetlink_sock¹¤¾ß¡£¡£¡£ ¡£netlink_sock¹¤¾ß¾ÞϸΪ0x3f0×Ö½Ú £¬£¬¼´ÊÇ1008byte¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ƾ֤Äں˹¤¾ßÄÚ´æ·ÖÅɹæÔò £¬£¬ netlink_sock¹¤¾ßÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖоÙÐзÖÅÉ¡£¡£¡£ ¡£
slab·ÖÅÉÆ÷ÔÚ·ÖÅɹ¤¾ßʱ £¬£¬×ñÊØºó½øÏȳöµÄ¹æÔò¡£¡£¡£ ¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷ÊÍϰà¾ßµÄÀú³Ì¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÒªÊͷŵŤ¾ßobjp·ÅÔÚÁËac->entry[]µÄ×îºó¡£¡£¡£ ¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷·ÖÅɹ¤¾ßµÄÀú³Ì£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


·ÖÅɹ¤¾ßÖ±½Ó´Óac->entry[]×îºóµ¯³öÒ»¸ö¹¤¾ß¡£¡£¡£ ¡£


ÒÔÊÇÒ»¸ö¸Õ¸Õ±»ÊͷŵŤ¾ßÊÇÅÅÔÚÁ´±íÄ©¶Î £¬£¬ÈôÊÇ´ËʱǡÐÒ¿÷ͳһ»º´æÖоÙÐй¤¾ß·ÖÅÉ £¬£¬ÄǸոÕÊͷŵŤ¾ß¾Í»á±»ÖØÐ·ÖÅɳöÈ¥ £¬£¬Õâ¾Í·ºÆðÁ½¸öÖ¸ÕëÖ¸Ïòͳһ¿éÄÚ´æµØµã¡£¡£¡£ ¡£ÒªÏë°ü¹ÜÉêÇëµÄÄÚ´æÕýºÃÂäÔÚÎó²î¹¤¾ßµÄÄÚ´æÎ»ÖÃÖÐ £¬£¬ÐèÒªÕÆÎÕס¼¸µã£º


¶ÑÅ繤¾ßʹÓõÄÄں˻º´æÓ¦¸ÃºÍÎó²î¹¤¾ßÄÚ±£´æÍ³Ò»¸ö»º´æÖС£¡£¡£ ¡£¼´¾Þϸ±ØÐèÂäÔÚͳһ¸ökmalloc-XÖС£¡£¡£ ¡£


ac×Ô¼ºÊÇarray_chche½á¹¹Ìå £¬£¬¸Ã½á¹¹ÌåÊÇÍâµØ¸ßËÙ»º´æ £¬£¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö £¬£¬ÒÔÊÇ»¹Òª°ü¹Ü¶ÑÅçÉêÇëµÄ¹¤¾ßºÍÎó²î¹¤¾ßÔÚͳһ¸öCPUÍâµØ¸ßËÙ»º´æÖС£¡£¡£ ¡£


ÈôÊǶÑÅçÉêÇëµÄ¹¤¾ßÖ»ÊǶÌÔÝפÁô £¬£¬µ±¸Ãº¯Êý·µ»ØÊ±½«ÉêÇëµÄ¹¤¾ß¾ÙÐÐÁËÊÍ·Å £¬£¬µ¼ÖÂÎÞ·¨×¼È·Õ¼Î»¡£¡£¡£ ¡£ÒÔÊÇÒªÄܰü¹ÜÉêÇëµÄ¹¤¾ß²»±»ÊÍ·Å £¬£¬ÖÁÉÙ°ü¹ÜÔÚʹÓÃÎó²î¹¤¾ßʱ²»±»ÊÍ·Å £¬£¬ÕâÀïÒª½ÓÄÉפÁôʽÄÚ´æÕ¼Î» £¬£¬¿ÉÒÔ½ÓÄÉÈÃijЩϵͳŲÓÃÀú³ÌÛÕ±Õ¡£¡£¡£ ¡£


slab»º´æË鯬»¯ÎÊÌâ £¬£¬ÕâÀïҪռλµÄ¹¤¾ß¾ÞϸΪ1008 £¬£¬¹¤¾ß³ß´ç½ÏÁ¿´ó £¬£¬Õ¼ÓÐËÄ·ÖÖ®Ò»Ò³ £¬£¬½ÏÁ¿ÕûÆë £¬£¬Ó¦¸ÃûÓÐË鯬»¯ÎÊÌâ¡£¡£¡£ ¡£


ÄÇôÔõÑùÅж϶ÑÅçÊÇ·ñÀÖ³ÉÄØ £¿£¿£¿


ͨÓÃÇéÐÎÏ £¬£¬ÔÚ¾ÙÐжÑÅçʱ¼ä £¬£¬½á¹¹¶ÑÅ繤¾ßʱ £¬£¬ÓÐÐëÒªÔÚ¶ÔÓ¦Îó²î¹¤¾ßµÄÒ»Ð©ÌØÊâ³ÉÔ±ÓòµÄÄÚ´æÆ«ÒÆ´¦ÉèÖÃmagic value £¬£¬È»ºó¿ÉÒÔ½ÓÄÉϵͳŲÓÃÈ¥»ñÈ¡Îó²î¹¤¾ßÖÐÏà¹ØÊý¾Ý¾ÙÐÐÅжÏ¡£¡£¡£ ¡£netlink_sock½á¹¹Ì弸¸öÒªº¦µÄ³ÉÔ±ÈçÏ¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


½ÓÄÉgetsocknameϵͳŲÓûñÈ¡Êý¾Ý £¬£¬getsockname»áŲÓÃnetlink_getname¡£¡£¡£ ¡£Ïêϸ¿´Ò»ÏÂnetlink_getnameº¯Êý£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


´úÂë1576ÐÐ £¬£¬½«netlink_sock¹¤¾ßÖеÄportid¸´ÖƸønladdr->nl_pid¡£¡£¡£ ¡£´úÂë1577ÐÐ £¬£¬ÈôÊÇnlk->groupΪ0 £¬£¬½«nladdr->nl_groups¸³ÖµÎªNULL £¬£¬ÕâÀï×èÖ¹½âÒýÓÃnlk->groupsÖ¸Õë £¬£¬Ö±½Ó¿ÉÒÔÔڽṹ¶ÑÅ繤¾ßʱ½«groupsÓòÌîÁã¡£¡£¡£ ¡£¶ønladdrÊÇ´Óaddrת»»¹ýÀ´µÄ £¬£¬addr¾ÍÊÇ´ÓÓû§²ã´«ÈëµÄ»º³åÇø¡£¡£¡£ ¡£


¶ÑÅçÀÖ³ÉÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ͨ³£ÇéÐÎÊÇÁýÕֽṹÌåÖеĺ¯ÊýÖ¸Õë»òÕß°üÀ¨º¯ÊýÖ¸ÕëµÄ½á¹¹Ìå³ÉÔ± £¬£¬ÕâÊÓÇéÐζø¶¨¡£¡£¡£ ¡£ÕâÀïÑ¡ÔñÁýÕÖwaitÆÚ´ýÐÐÁС£¡£¡£ ¡£netlink_sock½á¹¹ÌåÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


wait_queue_haed_t½á¹¹ÌåÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


task_list³ÉÔ±ÊÇÒ»¸öË«ÏòÑ­»·Á´±íÍ· £¬£¬task_listÖÐÁ´½ÓµÄÿһ¸ö³ÉÔ±¶¼ÊÇÐèÒª´¦Öóͷ£µÄÆÚ´ýÀý³ÌÔªËØ¡£¡£¡£ ¡£ÄǸÃÔõÑùʹÓÃÕâ¸ö³ÉÔ± £¿£¿£¿¿´ÈçÏ´úÂë¡£¡£¡£ ¡£


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ÕâÊÇnetlink_setsockoptº¯ÊýÖеĴúÂëÆ¬¶Ï £¬£¬Ç°Ãæ»Ö¸´Ï̸߳´ÉúÆÊÎö¹ý £¬£¬ÕâÀォ»áŲÓÃnetlink_sock¹¤¾ßÖÐµÄÆÚ´ýÀý³Ì £¬£¬Ö±½ÓʹÓòÎÊýnlk->wait¡£¡£¡£ ¡£¼ÌÐøÉîÈëÆÊÎö£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


ŲÓÃ__wake_up_commonº¯Êý£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


´úÂë70ÐÐ £¬£¬ºêlist_for_each_entry_safe±éÀúq->task_listÖеijÉÔ± £¬£¬·µ»Øµ½curr¡£¡£¡£ ¡£´úÂë68ÐÐ £¬£¬currΪwait_queue_tÖ¸Õë £¬£¬ËµÃ÷q->task_listÁ´±íÖдæµÄÊÇwait_queue_tÀàÐ͵ÄÔªËØ £¬£¬wait_queue_t½á¹¹ÌåÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


wait_queue_t½á¹¹ÌåÖÐÓÐÒ»¸öº¯ÊýÖ¸Õëfunc¡£¡£¡£ ¡£ÔÙ¿´__wake_up_commonº¯ÊýÖÐ £¬£¬´úÂë73ÐÐ £¬£¬Ö±½ÓÖ´ÐÐcurr>funcº¯Êý £¬£¬¿ÉÒÔͨ¹ý½á¹¹__wait_queueµÄfunc²ÎÊý¿ØÖÆRIP¡£¡£¡£ ¡£ÔٻعýÍ·¿´list_for_each_entry_safeºê£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


posÊÇ__wait_queueÔªËØ £¬£¬´úÂë62ÐÐ £¬£¬¶Ôpos->member.next¾ÙÐÐÏàʶÒýÓà £¬£¬ÕâÀïµÄpos->member¾ÍÊÇ__wait_queueÖеÄtask_list¡£¡£¡£ ¡£__wait_queueÖеÄtask_listÒ²ÊÇÒ»¸öÁ´±íÍ· £¬£¬ÐèÒªÖ¸ÏòÒ»¸ölist_head £¬£¬ÒÔÊÇ»¹±ØÐèÒª½á¹¹Ò»¸ö¼ÙµÄlist_headÒÔ±ãÓڸúê¾ÙÐнâÒýÓᣡ£¡£ ¡£²âÊÔÈçÏ£º


ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾


½ÓÏÂÀ´¾ÍÊÇͨ¹ýROPÁ´ÈƹýSMEPÖ´ÐÐÌáȨ´úÂë¡£¡£¡£ ¡£ÀÖ³ÉÌáȨºóÈçÏÂËùʾ£º

ÄϹ¬NGÓéÀÖ(Öйú)¹Ù·½ÍøÕ¾