LinuxÄÚºËÀ¶ÑÀЭÒéջ©¶´£¨BleedingTooth£©ÀûÓ÷ÖÎöÓ븴ÏÖ

Ðû²¼Ê±¼ä 2021-04-16

©¶´¸ÅÊö


2020Äê10Ô£¬¹È¸èÄþ¾²Ñо¿ÈËÔ±Åû¶ÁËÈý¸öLinuxÄÚºËÀ¶ÑÀЭÒéջ©¶´£¬¿Éµ¼ÖÂÔ¶³Ì´úÂëÖ´ÐУ¬±»³ÆΪBleedingTooth¡£ÕâÈý¸ö©¶´ÖУ¬Ò»¸öÊǶÑÒç³ö£¬±àºÅΪCVE-2020-24490£»ÁíÒ»¸öÊÇÀàÐÍ»ìÏý£¬±àºÅΪCVE-2020-12351£¬×îºóÒ»¸öÊÇÐÅϢй¶£¬±àºÅΪCVE-2020-12352¡£½üÈÕ£¬¹È¸èÄþ¾²Ñо¿ÈËÔ±ÓÖÅû¶ÁËBleedingToothÖÐCVE-2020-12351ºÍCVE-2020-12352×éºÏµÄ©¶´ÀûÓü°Ï¸½Ú£¬²¢ÔÚÀ¶ÑÀ4.0Ï£¬ÊµÏÖÁËÁãµã»÷Ô¶³Ì´úÂëÖ´ÐС£


©¶´·ÖÎö


CVE-2020-12351


¸Ã©¶´·ºÆðÔÚnet/bluetooth/l2cap_core.cÖС£l2cap_recv_frame()ÊǽâÎöºÍ´¦ÖÃl2capЭÒéÊý¾Ý°üµÄº¯Êý¡£´úÂëʵÏÖÈçÏÂËùʾ£º


1.png


»ñȡͨµÀcidºÍl2capÊý¾Ý°ü³¤¶Èlen¡£´úÂëʵÏÖÈçÏÂËùʾ£º


2.png


ƾ¾Ý²îÒìµÄͨµÀcid£¬½øÈë²îÒìµÄ×Ó¹ý³Ì½øÐд¦Ö㬽øÈël2cap_data_channel()º¯Êý¡£´úÂëʵÏÖÈçÏÂËùʾ£º


3.png


Ê×ÏÈ£¬Í¨¹ýcidÕÒµ½Í¨µÀchan£»Èç¹ûûÓÐÕÒµ½£¬ÅжÏcidÊÇ·ñΪL2CAP_CID_A2MP£»Èç¹ûÊÇ£¬µ÷ÓÃa2mp_channel_create()´´½¨Ò»¸öеÄͨµÀchan¡£a2mp_channel_create()º¯ÊýʵÏÖÈçÏÂËùʾ£º


4.png


µ÷ÓÃamp_mgr_create()´´½¨mgr£¬ÔÚamp_mgr_create()º¯ÊýÖУ¬´úÂëʵÏÖÈçÏÂËùʾ£º


5.png


µ÷ÓÃa2mp_chan_open()´´½¨Í¨µÀchan£¬¸Ãº¯Êý½«³õʼ»¯Ò»²¿ÃÅÊý¾Ý£¬´úÂëʵÏÖÈçÏÂËùʾ£º


6.png


È罫chan->mode³õʼ»¯ÎªL2CAP_MODE_ERTM¡£chan->data¸³ÖµÎªmgr£¬ÀàÐÍΪstruct amp_mgr¡£Àֳɴ´½¨a2mpͨµÀ·µ»Øµ½l2cap_data_channel()ÖУ¬´úÂëʵÏÖÈçÏÂËùʾ£º


7.png


ƾ¾Ýchan->modeµÄ²îÒ죬½øÈë²îÒìµÄdata´¦ÖÃ×Ó¹ý³Ì£¬µ±modeΪL2CAP_MODE_ERTMºÍL2CAP_MODE_STREAMINGʱ£¬½øÈël2cap_data_rcv()º¯ÊýÖУ¬´úÂëʵÏÖÈçÏÂËùʾ£º


8.png


¸ÃifÌõ¼þÖУ¬»áµ÷ÓÃsk_filter()º¯Êý£¬´Ëʱchan->dataΪ²ÎÊý¡£¶øsk_filter()º¯Êý½ç˵ÈçÏÂËùʾ£º


9.png


µÚÒ»¸ö²ÎÊýÀàÐÍΪstruct sock£¬¶øchan->dataÀàÐÍΪstruct amp_mgr£¬·¢ÉúÀàÐÍ»ìÏý¡£


CVE-2020-12352


¸Ã©¶´ÊÇ·ºÆðÔÚa2mpЭÒéÖУ¬Â©¶´´úÂëλÓÚnet/bluetooth/a2mp.c£¬¶à¸öº¯ÊýʹÓÃδ³õʼ»¯µÄ½á¹¹Ì壬½«Êý¾Ý·µ»Øµ½Óû§²ã£¬µ¼ÖÂÐÅϢй¶£¬¿Éй¶ÄÚºËÕ»ÉϵÄÄÚ´æÊý¾Ý¡£Â©¶´Ô­Àí½ÏΪ¼òµ¥£¬ÒÔa2mp_getinfo_req()º¯ÊýΪÀý£¬¸Ãº¯ÊýÊÇÏìÓ¦getinfoÇëÇóʱµ÷ÓõÄ£¬´úÂëʵÏÖÈçÏÂËùʾ£º


10.png


ÐÐ304£¬Í¨¹ýreq->id»ñÈ¡hdev£¬Èç¹û²»´æÔÚhdev»òhdev->type²»ÊÇHCI_AMP£¬½øÈëifÓï¾äÖУ¬½ç˵struct a2mp_info_rspÀàÐ굀 rsp£¬¸Ã½á¹¹Ìå½ç˵ÈçÏÂËùʾ£º


11.png


ÆäֻʹÓÃÁËrsp.idºÍrsp.status£¬ÆäËûµÄÊý¾ÝÓòδʹÓÃҲδ³õʼ»¯£¬¿ÉÒÔй¶16×Ö½ÚÊý¾Ý£¬È»ºóµ÷ÓÃa2mp_send()º¯Êý½«ÏìÓ¦°ü·¢Ë͵½Óû§²ã£¬Ð¹Â¶ÄÚ´æÊý¾Ý¡£


CVE-2020-24490


¸Ã©¶´Ö»ÄÜÔÚbluetooth 5.0Ï´¥·¢£¬ÔÚbluetooth 5.0֮ǰ£¬HCI½øÐй㲥µÄ×î´óÊý¾Ý³¤¶ÈΪ0x1F£¬0x20-0xFF±£Áô¡£ÈçÏÂËùʾ£º


12.png


ÔÚbluetooth 5.0ÖУ¬¸Ãlength×î´óÀ©Õ¹µ½229×Ö½Ú¡£ÈçÏÂËùʾ£º


13.png


¸Ã©¶´´úÂëλÓÚnet/bluetooth/hci_event.cÖУ¬ÔÚ´¦ÖÃHCI_LE_Extended_Advertising_ReportʼþÖУ¬Î´ÅжϹ㲥Êý¾Ý³¤¶È×î´óÖµ£¬ºóÐø¿½±´¹ã²¥Dataµ¼ÖÂÒç³ö¡£µ÷Óùý³ÌÈçÏÂËùʾ£º


14.png


process_adv_report()º¯Êý´¦Öù㲥Êý¾Ý£¬½«¹ã²¥Êý¾Ý¿½±´µ½·¢ÏÖµÄÉ豸ÖУ¬´úÂëʵÏÖÈçÏÂËùʾ£º


15.png


µ÷ÓÃstore_pending_adv_report()º¯Êý£¬¸Ãº¯ÊýʵÏֹ㲥Êý¾Ý¿½±´£¬´úÂëʵÏÖÈçÏÂËùʾ£º


16.png


ÆäÖУ¬discovery_state½á¹¹Ìå½ç˵ÈçÏÂËùʾ£º


17.png


last_adv_dataÊý¾Ý¾ÞϸΪHCI_MAX_AD_LENGTH£¬¹²31×Ö½Ú£¬µ±Ö´ÐÐmemcpyʱ·¢ÉúÒç³ö¡£


ÀûÓ÷ÖÎöÓ븴ÏÖ


¿ØÖÆ´úÂëÖ´ÐÐÁ÷³Ì


Ç°ÎÄ·ÖÎöµ½CVE-2020-12351ÀàÐÍ»ìÏýÊÇÔÚsk_filter()º¯ÊýÖз¢ÉúµÄ£¬sk_filter()º¯Êýµ÷ÓÃsk_filter_trim_cap()º¯Êý£¬¸Ãº¯Êý´úÂëʵÏÖÈçÏ£º


18.png


¸Ãº¯ÊýµÚÒ»¸ö²ÎÊýΪsk£¬²ÎÊýÀàÐÍΪsock½á¹¹Ì壬ÕⲿÃÅ´úÂëÖжÔskºÍskbµÄ¼ì²éÈÝÒ×Èƹý¡£½ÓÏÂÀ´Òªº¦´úÂëÈçÏÂËùʾ£º


19.png


ÐÐ113£¬¶Ôsk->sk_filter½øÐнâÒýÓã¬Èç¹ûÀֳɻñÈ¡filterÖ¸Õ룬½øÈëÐÐ115¡£ÐÐ119£¬µ÷ÓÃbpf_prog_run_save_cb()º¯Êý£¬²ÎÊý·Ö±ðΪfilter->progºÍskb£¬¸Ãº¯Êý´úÂëʵÏÖÈçÏÂËùʾ£º


20.png


È»ºó£¬ÐÐ676£¬µ÷ÓÃ__bpf_prog_run_save_cb()º¯Êý£¬¸Ãº¯ÊýʵÏÖ´úÂëÈçÏ£º


21.png


½Ó×Å£¬ÐÐ662£¬µ÷ÓÃBPF_PROG_RUN(prog,skb)£¬¸Ãº¯Êý½ç˵Ϊһ¸öºê£¬ÊµÏÖ´úÂëÈçÏÂËùʾ£º


22.png


һ·µ÷ÓÃÏÂÀ´£¬×îÖÕ»áµ÷Óõ½ºì¿òÖеĴúÂ룬¼ò»¯Ò»Ïµ÷Óùý³ÌΪ£º

sk->sk_filter->prog->bpf_func(skb, sk->sk_filter->prog->insnsi)¡£Òò´Ë£¬Ö»Òª¿ØÖÆsk->sk_filter¾Í¿ÉÒÔ¿ØÖÆÖ´ÐÐÁ÷³Ì¡£


¶ÑÅçռλ


º¯Êýsk_filter()µÄµÚÒ»¸ö²ÎÊýÀàÐÍΪstruct sock£¬¶øʵ¼Ê´«ÈëµÄ²ÎÊýÀàÐÍΪstruct amp_mgr£¬¿ÉÒÔ½ÓÄɶÑÅç128¾ÞϸµÄÄÚ´æ¿é½øÐÐռλ£¬Î±Ôìamp_mgr ¹¤¾ß¡£ÕâÀïÓиöÎÊÌ⣬sk->sk_filterÔÚsockÖеÄÆ«ÒÆΪ0x110£¬¶øamp_mgr½á¹¹Ìå¾ÞϸΪ0x70£¬Æ«ÒÆÒѾ­³¬³öÁË·¶Î§¡£Òª½â¾öÕâ¸öÎÊÌ⣬ÕâÀï¿ÉÒÔ½ÓÄÉÈçÏÂÇÉÃîµÄ¶ÑÅç½á¹¹£º


23.png


½á¹¹Ìåamp_mgrÔÚkmalloc-128ÀàÐ͵ÄslubÖб»·ÖÅ䣬´ÓµÚÈý¸ö¿é¿ªÊ¼£¬amp_mgr½á¹¹ÌåÆ«ÒÆ0x10´¦£¬¿ÉÒÔ±»Î±Ôì³Ésk_filter£¬±ã¿ÉÒÔÂú×ãsk¶Ôsk_filterÓòµÄ½âÒýÓ㬶øÇÒ¿É¿Ø¡£


½á¹¹ÔغÉ


ͨ¹ý¶ÑÅçռλ¿ØÖÆ´úÂëÖ´ÐÐÁ÷³Ìºó£¬½ÓÏÂÀ´¾ÍÊǽṹ¹¥»÷ÔغÉ¡£¿ÉÒÔ½ÓÄɶÑÅç1024¾ÞϸµÄÄÚ´æ¿éȥαÔìl2cap_chan¹¤¾ß£¬ÒòΪ½á¹¹Ìå¾ÞϸΪ792£¬ÕýºÃÂäÔÚkmalloc-1024 slub¿éÖУ¬¶øÇÒa2mpͨµÀÒ²ÊôÓÚl2capͨµÀÖУ¬ÊÍ·Åa2mpͨµÀʱ£¬l2capͨµÀÒ²½«±»ÊÍ·Å£¬²Ù¿ØÆðÀ´½ÏΪÁé»î£¬×îÖսṹÈçÏÂËùʾ£º


24.png


й¶l2cap_chan¹¤¾ßµØÖ·


ͨ¹ý¶ÑÅç½á¹¹ºÍ´´½¨ÊÍ·Ål2cap_chanͨµÀµÈһϵÁвÙ×÷ºó£¬¿ÉÄÜ´æÔÚÒ»¸öÖ¸Ïòkmalloc-1024ÄÚ´æ¿éµØÖ·µÄl2cap_chan¹¤¾ß£¬¿ÉÒÔͨ¹ýCVE-2020-12352©¶´Ð¹Â¶Ò»¸öÄÚºËÕ»ÉÏÃæµÄÄں˵ØÖ·£¬ÈçÏÂͼÖкì¿òËùʾ£º


25.png


ͨ¹ý¸ÃÄڵصØÖ·¼õÈ¥Ò»¸ö0x110Æ«ÒƱã¿ÉÒÔÕÒµ½Ò»¸öl2cap_chan¹¤¾ßµØÖ·£¬¿ÉÒÔͨ¹ýamp_mgr½á¹¹ÌåÄÚ´æµØÖ·¼ì²éÒ»ÏÂÊÇ·ñÕýÈ·£¬ÒòΪamp_mgr½á¹¹ÌåÆ«ÒÆ0x18´¦Îªl2cap_chanÖ¸Õ룬ÈçÏÂͼÖкì¿òËùʾ£º


26.png


ÀÖ³Éй¶l2cap_chan¹¤¾ßµØÖ·ºó£¬È»ºóÈ¥Ìî³äamp_mgr½á¹¹ÌåÆ«ÒÆ0x10´¦µÄÊý¾ÝÓò¡£


¸´ÏÖ²âÊÔ


ÎÒÃÇÔÚubuntu 5.4.0-26-genericϵͳϸ´ÏÖ²âÊÔ©¶´ÀûÓã¬Ö´Ðйý³ÌÈçÏ£º


27.png


Àֳɷ´µ¯root¼¶shell£¬ÈçÏÂËùʾ£º


28.png


²Î¿¼Á´½Ó£º

[1]https://google.github.io/security-research/pocs/linux/bleedingtooth/writeup

[2]https://github.com/google/security-research/security/advisories/GHSA-ccx2-w2r4-x649

[3]https://github.com/google/security-research/security/advisories/GHSA-7mh3-gq28-gfrq

[4]https://github.com/google/security-research/security/advisories/GHSA-h637-c88j-47wq


¶«É­Æ½Ì¨»ý¼«·ÀÓùʵÑéÊÒ£¨ADLab£©


ADLab½¨Á¢ÓÚ1999Ä꣬ÊÇÖйúÄþ¾²ÐÐÒµ×îÔ罨Á¢µÄ¹¥·À¼¼ÊõÑо¿ÊµÑéÊÒÖ®Ò»£¬Î¢ÈíMAPP¼Æ»®ºËÐijÉÔ±£¬¡°ºÚȸ¹¥»÷¡±¿´·¨Ê×ÍÆÕß¡£½ØֹĿǰ£¬ADLabÒÑͨ¹ýCVEÀÛ¼ÆÐû²¼Äþ¾²Â©¶´½ü1100¸ö£¬Í¨¹ý CNVD/CNNVDÀÛ¼ÆÐû²¼Äþ¾²Â©¶´1000Óà¸ö£¬Á¬Ðø±£³Ö¹ú¼ÊÍøÂçÄþ¾²ÁìÓòÒ»Á÷Ë®×¼¡£ÊµÑéÊÒÑо¿Æ«Ïòº­¸Ç²Ù×÷ϵͳÓëÓ¦ÓÃϵͳÄþ¾²Ñо¿¡¢ÖÇÄÜÖÕ¶ËÄþ¾²Ñо¿¡¢ÎïÁªÍøÖÇÄÜÉ豸Äþ¾²Ñо¿¡¢WebÄþ¾²Ñо¿¡¢¹¤¿ØϵͳÄþ¾²Ñо¿¡¢ÔÆÄþ¾²Ñо¿¡£Ñо¿½á¹ûÓ¦ÓÃÓÚ²úÎïºËÐļ¼ÊõÑо¿¡¢¹ú¼ÒÖصã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨ÒµÄþ¾²·þÎñµÈ¡£


adlab.jpg