¶«É­Æ½Ì¨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¼´¿É ¡£


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


½ÓÏÂÀ´¿´¿´Â©¶´ÆðÒò£¬ÕâÀïÒÔ4.1.0°æ±¾Ô´ÂëΪÀý ¡£


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


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


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


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


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


ÐÐ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º¯Êý ¡£


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


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


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


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


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


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


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


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


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


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


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


ÐÐ1683£¬µ÷ÓÃsock_put¼õÉÙÒýÓüÆÊýÒ»´Î£¬×îºóreturn 1£¬º¯Êý·µ»Ø£¬Ö±½Ógotoµ½retry±êÇ©µØ·½ ¡£


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


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


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


ÐÐ1306£¬ÅжÏsockÊÇ·ñΪ¿Õ£¬Èç¹û²»Îª¿Õ£¬µ÷ÓÃnetlink_detachskbº¯Êý ¡£


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


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


Õâ¸ö©¶´Ô­Àí±ÈÁ¦¼òµ¥£¬µ«ÊÇÈçºÎ´¥·¢Õâ¸ö©¶´»¹ÊDZÈÁ¦ÅÓ´ó ¡£Ê×ÏÈ£¬ÈçºÎÈÃnetlink_attachskb·µ»Ø1£¬´Ó¶ø˳Àû½øÈëretryÂß¼­ ¡£Ôٴλؿ´netlink_attachskbµÄʵÏÖ ¡£


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


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


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


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


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


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


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


!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¸üΪ·½±ã£¬´úÂëÈçÏ ¡£


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


¼ÙÈçifÅжϲ»Í¨¹ý£¬½Ó×ŵ÷ÓÃnetlink_skb_set_owner_rº¯Êý£¬ÈçÏÂËùʾ ¡£


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


ÐÐ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µÄÖµ£¿ÀíÂÛÉÏÊÇÍêÈ«¿ÉÒԵģ¬¿´¿´ÈçºÎ´ÓÓû§²ãµ½´ïÕâ¸öº¯Êý ¡£


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


ͨ¹ý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º¯ÊýʵÏÖÈçÏ ¡£


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


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

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


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


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


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


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


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


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


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


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


Õû¸öº¯ÊýÖУ¬Óû§ÄÜ¿ØÖƵIJ»¶à ¡£ÐÐ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µÄ²Ù×÷ ¡£


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


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


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


ÐÐ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Óï¾äºó£¬¿´ÈçÏ´úÂ룺


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


Õâ¶Î´úÂë»áÈõ±Ç°Ï߳̽øÈëÆÚ´ý״̬£¬Ö±½Óblock ¡£Èç¹û²»Ïë½øÈëÆÚ´ý״̬£¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD ¡£µ«ÊÇÈç¹û°Ñsock_flagÉèÖóÉSOCK_DEAD£¬ÄǺóÃæҲûÓÐÐëÒª½øÐУ¬Òò´ËÕâÀïÊÇÒ»¶¨Òª½øÈëÆÚ´ý״̬µÄ ¡£Ò»ÖÖÇÉÃîµÄÒªÁìÊÇÖ±½Óµ÷ÓÃwake_up_interruptibleÇ¿Ðл½ÐÑÏß³Ì ¡£ÄÇÈçºÎµ÷ÓÃwake_up_interruptibleÄØ£¿º¯Êýµ÷ÓÃÁ´·Ç³£¼ò¶Ì£ºnetlink_setsockopt->wake_up_interruptible ¡£


ÔÚNetlink_setsockoptº¯ÊýÖУº


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


ÐÐ2182£¬µ÷ÓÃwake_up_interruptible»½ÐÑÏß³Ì ¡£ÐÐ2178£¬caseΪNETLINK_NO_ENOBUFS ¡£


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


ÐÐ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£¬´úÂëÈçÏ£º


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


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


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


Õâ¸öʱºòsockÊǷǿյģ¬ifÅжÏΪÕ棬½øÈënetlink_destachskb£¬½ÓמÍÊÇfreeÍ߽⠡£


©¶´¸´ÏÖ


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


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


ƾ¾ÝÄں˹¤¾ßÄÚ´æ·ÖÅä¹æÔò£¬ netlink_sock¹¤¾ßÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖнøÐзÖÅä ¡£
slab·ÖÅäÆ÷ÔÚ·ÖÅ乤¾ßʱ£¬×ñÊغó½øÏȳöµÄ¹æÔò ¡£ÏÂÃæÊÇslab·ÖÅäÆ÷ÊͷŹ¤¾ßµÄ¹ý³Ì ¡£


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


ÒªÊͷŵŤ¾ßobjp·ÅÔÚÁËac->entry[]µÄÄ©¶Ë ¡£ÏÂÃæÊÇslab·ÖÅäÆ÷·ÖÅ乤¾ßµÄ¹ý³Ì£º


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


·ÖÅ乤¾ßÖ±½Ó´Óac->entry[]Ä©¶Ëµ¯³öÒ»¸ö¹¤¾ß ¡£


ËùÒÔÒ»¸ö¸Õ¸Õ±»ÊͷŵŤ¾ßÊÇÅÅÔÚÁ´±íÄ©¶Î£¬Èç¹û´ËʱǡºÃÔÚͬһ»º´æÖнøÐй¤¾ß·ÖÅ䣬ÄǸոÕÊͷŵŤ¾ß¾Í»á±»ÖØзÖÅä³öÈ¥£¬Õâ¾Í·ºÆðÁ½¸öÖ¸ÕëÖ¸Ïòͬһ¿éÄÚ´æµØÖ· ¡£ÒªÏë±£Ö¤ÉêÇëµÄÄÚ´æÕýºÃÂäÔÚ©¶´¹¤¾ßµÄÄÚ´æλÖÃÖУ¬ÐèÒªÕÆÎÕס¼¸µã£º


¶ÑÅ繤¾ßʹÓõÄÄں˻º´æÓ¦¸ÃºÍ©¶´¹¤¾ßÄÚ´æÔÚͬһ¸ö»º´æÖÐ ¡£¼´¾Þϸ±ØÐëÂäÔÚͬһ¸ökmalloc-XÖÐ ¡£


ac×Ô¼ºÊÇarray_chche½á¹¹Ì壬¸Ã½á¹¹ÌåÊǵ±µØ¸ßËÙ»º´æ£¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö£¬ËùÒÔ»¹Òª±£Ö¤¶ÑÅçÉêÇëµÄ¹¤¾ßºÍ©¶´¹¤¾ßÔÚͬһ¸öCPUµ±µØ¸ßËÙ»º´æÖÐ ¡£


Èç¹û¶ÑÅçÉêÇëµÄ¹¤¾ßÖ»ÊǶÌÔÝפÁô£¬µ±¸Ãº¯Êý·µ»Øʱ½«ÉêÇëµÄ¹¤¾ß½øÐÐÁËÊÍ·Å£¬µ¼ÖÂÎÞ·¨Õýȷռλ ¡£ËùÒÔÒªÄܱ£Ö¤ÉêÇëµÄ¹¤¾ß²»±»ÊÍ·Å£¬ÖÁÉÙ±£Ö¤ÔÚʹÓ鶴¹¤¾ßʱ²»±»ÊÍ·Å£¬ÕâÀïÒª½ÓÄÉפÁôʽÄÚ´æռ룬¿ÉÒÔ½ÓÄÉÈÃijЩϵͳµ÷Óùý³Ì×èÈû ¡£


slab»º´æËéƬ»¯ÎÊÌ⣬ÕâÀïҪռλµÄ¹¤¾ß¾ÞϸΪ1008£¬¹¤¾ß³ß´ç±ÈÁ¦´ó£¬Õ¼¾ÝËÄ·ÖÖ®Ò»Ò³£¬±ÈÁ¦ÕûÆ룬Ӧ¸ÃûÓÐËéƬ»¯ÎÊÌâ ¡£


ÄÇôÈçºÎÅж϶ÑÅçÊÇ·ñÀÖ³ÉÄØ£¿


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


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


½ÓÄÉgetsocknameϵͳµ÷ÓûñÈ¡Êý¾Ý£¬getsockname»áµ÷ÓÃnetlink_getname ¡£¾ßÌå¿´Ò»ÏÂnetlink_getnameº¯Êý£º


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


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


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


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


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


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


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


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


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


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


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


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


µ÷ÓÃ__wake_up_commonº¯Êý£º


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


´úÂë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½á¹¹ÌåÈçÏ£º


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


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


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


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


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


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

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