AndroidÀ¶ÑÀ×Óϵͳ¡°BlueFrag¡±·ì϶·ÖÎö£¨CVE-2020-0022£©
°ä²¼¹¦·ò 2020-02-13Ò»¡¢¡¢¡¢·ì϶²¼¾°
2020Äê2Ô£¬£¬Android°²È«²¼¸æÖÐÅû¶²¢ÐÞ¸´ÁËÒ»¸öÑÏÖØ·ì϶£¬£¬·ì϶±àºÅΪCVE-2020-0022£¬£¬ÓÖ³ÆBlueFrag£¬£¬¿ÉÓ°ÏìAndroidÀ¶ÑÀ×Óϵͳ¡£¡£¸Ã·ì϶ÊÇÒ»¸öÔ¶³Ì´úÂëÖ´Ðзì϶£¬£¬³Ê´Ë¿ÌBluedroidÀ¶ÑÀºÍ̸ջµÄHCI²ã£¬£¬µ±ÎÞÏßÄ£¿é´¦Óڻ״̬ʱ£¬£¬¹¥»÷ÕßÄܹ»ÀûÓÃÀ¶ÑÀÊØ»¤·¨Ê½ÌáÉýȨÏÞ½ø¶øÔÚÉ豸ÉÏÖ´ÐдúÂë¡£¡£¸Ã·ì϶ӰÏìAndroid Oreo£¨8.0ºÍ8.1£©¡¢¡¢¡¢Pie£¨9£©£¬£¬µ«ÎÞ·¨ÔÚAndroid 10ÉϽøÐÐÀûÓ㬣¬½öÄÜ´¥·¢DoS¹¥»÷¡£¡£
¶þ¡¢¡¢¡¢ºÍ̸¼ò½é
2.1 HCI
HCI ²ãλÓÚÀ¶ÑÀºÍ̸ջ¸ß²ãºÍ̸ºÍµÍ²ãºÍ̸֮¼ä£¬£¬ÌṩÁ˶Իù´ø½ÚÖÆÆ÷ºÍÁ´Â·ÖÎÀíÆ÷µÄºÅÁîÒÔ¼°½Ó¼ûÀ¶ÑÀÓ²¼þµÄͳһ½Ó¿Ú²½Ö裬£¬Æä½Ó¿ÚºÏÓÃÓÚBR/EDR½ÚÖÆÆ÷¡¢¡¢¡¢BR/EDR/LE½ÚÖÆÆ÷¡¢¡¢¡¢LE½ÚÖÆÆ÷¡¢¡¢¡¢AMP½ÚÖÆÆ÷£¬£¬Óëµ×²ãµÄ½á¹¹¹ØÏµÈçÏÂͼ£º£º£º
Ö÷»úϵͳÉϵÄHCIÇý¶¯·¨Ê½ºÍ½ÚÖÆÆ÷ÖеÄHCI²ãÖ®¼ä»á´æÔÚÖÐÑë²ã£¬£¬ ÕâЩÖÐÑë²ã¼´ÊÇÖ÷»ú½ÚÖÆÆ÷´«Êä²ã£¬£¬ÕâЩ´«Êä²ãÊÇͨÃ÷µÄ£¬£¬Ö»ÐèʵÏÖ´«ÊäÊý¾ÝµÄ¹¤×÷£¬£¬²»ÓÃÃ÷ÏÔÊý¾ÝµÄ¾ßÌåÌåʽ¡£¡£Á½¸öÀ¶ÑÀÉ豸µã¶ÔµãHCI²ãµÄ½»»¥¹ý³ÌÈçÏÂͼËùʾ£º£º£º
2.1.1 HCI°üÌåʽ
HCIͨ¹ý°üµÄ·½Ê½À´´«ËÍÊý¾Ý¡¢¡¢¡¢ºÅÁîºÍÊÂÎñµÄ£¬£¬ËùÓÐÔÚÖ÷»úºÍÖ÷»ú½ÚÖÆÆ÷Ö®¼äµÄͨѶ¶¼ÒÔ°üµÄ´ó¾Ö½øÐС£¡£Ô̺¬Ã¿¸öºÅÁîµÄ·µ»Ø²ÎÊý¶¼Í¨¹ýÌØ¶¨µÄÊÂÎñ°üÀ´´«Êä¡£¡£HCIº±¼û¾Ý¡¢¡¢¡¢ºÅÁîºÍÊÂÎñÈýÖÖÀàÐ͵İü¡£¡£ºÅÁî°üCOMMAND£¨0x01£©Ö»ÄÜ´ÓÖ÷»ú·¢ÍùÖ÷»ú½ÚÖÆÆ÷£¬£¬ÆäÖÐÊý¾Ý°üÊÇË«ÏòµÄ£¬£¬·ÖΪÁ½Àࣺ£º£ºACL£¨0x02£©¡¢¡¢¡¢SCO£¨0x03£©£¬£¬¶øÊÂÎñ°üEVENT£¨0x04£©Ê¼ÖÕÊÇÖ÷»ú½ÚÖÆÆ÷·¢ÏòÖ÷»úµÄ¡£¡£Ö÷»ú·¢³öµÄ´óÎÞÊýºÅÁî°ü³ÇÊд¥·¢Ö÷»ú½ÚÖÆÆ÷²úÉúÏàÓ¦µÄÊÂÎñ°ü×÷ΪÏìÓ¦£¬£¬ÔÚ´«Êä¹ý³ÌÖлáÓÐÒ»¸ö¾ä±ú£¬£¬ÓÃÓÚ¼ø±ðÖ÷»úÖ®¼äµÄÂ߼ͨµÀºÍ½ÚÖÆÆ÷£¬£¬¹²ÓÐÈýÖÖÀàÐ͵ľä±ú£º£º£ºÏνӾä±ú¡¢¡¢¡¢Âß¼Á´Â·¾ä±úºÍÎïÀíÁ´Â·¾ä±ú¡£¡£
ƾ¾Ý±ØÒª£¬£¬ÕâÀïÖ»½éÉÜACLÊý¾Ý°üÌåʽ£¬£¬ACL Êý¾ÝÓÃÓÚÖ÷»úºÍ½ÚÖÆÆ÷Ö®¼äµÄ·Çͬ²½Êý¾Ý»¥»»£¬£¬Èç²¥·ÅÒôÀÖÊý¾ÝµÄÊý¾Ý°ü£¬£¬ÌåʽÈçÏÂͼ£º£º£º
ÿ¸ö×ֶεÄ×¢Ã÷ÈçÏÂËùʾ£º£º£º
|
×Ö¶Î |
×¢Ã÷ |
|
Handle |
Connection_HandleÓÃÓÚÔÚÖ÷½ÚÖÆÆ÷ÉÏ´«ÊäÊý¾Ý°ü»ò¶Î¡£¡£ |
|
PB Flag |
°üÌìǵºÍÊÊÓ¦ÁìÓò¡£¡£ |
|
BC Flag |
¹ã²¥±êÖ¾¡£¡£ |
|
Data Total Length |
ÒÔ°Ëλλ×éΪµ¥ÔªµÄÊý¾Ý³¤¶È£¬£¬Ô̺¬¸ß²ãºÍ̸data¡£¡£ |
ÆäÖУ¬£¬PB FlagµÄÃèÊöÈçÏ£º£º£º
ÉèÖÃΪ 00'b µÄʱ³½£¬£¬´ú±í Host -> Contoller µÄ L2CAP µÄÊ×°ü¡£¡£ÉèÖÃΪ 01¡¯b µÄʱ³½£¬£¬´ú±í Host -> Contoller »òÕß Contoller -> Host µÄ L2CAP µÄÐø°ü£¨ÖÐÑëµÄ£©¡£¡£ÉèÖÃΪ 10'b µÄʱ³½£¬£¬´ú±í Contoller -> Host µÄ L2CAP µÄÊ×°ü¡£¡£
2.1.2 ·Ö¶Î£¨Fragmentation£©ºÍÖØ×飨Reassembly £©
·Ö¶ÎÊǽ«PDU·Ö»¯³É½ÏСµÄ²¿ÃÅ£¬£¬ÒÔ±ã´ÓL2CAP´«µÝµ½½ÏµÍ²ã¡£¡£ÖØ×éÊÇÆ¾¾Ý´Ó»ù²ã´«µÝÀ´µÄƬ¶ÎÖØ×éPDUµÄ¹ý³Ì¡£¡£·Ö¶ÎºÍÖØ×éÄܹ»ÀûÓÃÓÚÈκÎL2CAP PDU¡£¡£
2.2 L2CAPÊý¾Ý°üÌåʽ
L2CAPÊÇ»ùÓÚ·Ö×éµÄ£¬£¬µ«Ò²×ñÑÐŵÀ´«ÊäµÄͨѶģÐÍ¡£¡£L2CAPÖ§³ÖµÄÐŵÀÓÐÁ½ÖÖ£º£º£ºÃæÏòÏνӵÄÐŵÀºÍÃæÏòÎÞÏνӵÄÐŵÀ¡£¡£ÔÚÃæÏòÏνӵÄÐŵÀÖУ¬£¬L2CAPÊý¾Ý°üµÄÌåʽÈçÏÂͼËùʾ¡£¡£
Êý¾Ý°üÖÐÿ¸ö×ֶεÄ×¢Ã÷ÈçÏÂËùʾ£º£º£º
|
×Ö¶Î |
×¢Ã÷ |
|
Length |
2×Ö½Ú£¬£¬°µÊ¾ÐÅÏ¢ÓÐЧ¸ºÔصľÞϸ£¬£¬²»Ô̺¬³¤¶ÈL2CAPÍ·¡£¡£ |
|
Channel ID£¨CID£© |
2×Ö½Ú£¬£¬ÓÃÓÚ±êʶÖ÷ÕÅÐŵÀµÄÖÕ¶Ë¡£¡£Í¨µÀIDµÄÁìÓòÓëÕýÔÚ·¢ËÍÊý¾Ý°üµÄÉ豸Óйء£¡£ |
|
Information£¨Payload£© |
ÐÅÏ¢¸ºÔØ¡£¡£³¤¶ÈΪ0µ½65535×Ö½Ú¡£¡£ |
Èý¡¢¡¢¡¢·ì϶µÀÀí·ÖÎö
CVE-2020-0022·ì϶λÓÚHCI²ã£¬£¬·ì϶²¹¶¡´úÂëλÓÚhci/src/packet_fragmenter.cc£¨ÒÔ8.1.0_r33ΪÀý£©ÖеÄreassemble_and_dispatch()º¯ÊýÖУ¬£¬¸Ãº¯ÊýÊÇÓÃÓÚÊý¾Ý°ü·ÖƬµÄÖØ×é¡£¡£¶ÔÓÚ¹ý³¤µÄACLÊý¾Ý°ü±ØÒª½øÐаüµÄÖØ×飬£¬ÖØÒªÊÇÆ¾¾ÝACL°üÖеÄPB Flag±ê־λ½øÐÐÖØ×飬£¬ÈôÊǵ±Ç°ÊÇÕØÊ¼²¿ÃŲ¢ÇÒÊDz»ÆëÈ«µÄ£¬£¬ÔòÌìÉúÒ»¸ö²¿ÃŰü£¨partial_packet£©·Åµ½mapÀ£¬µÈÏ´ÎÊÕµ½ËüµÄºóÐø²¿ÃŽøÐÐ×é×°£¬£¬×é×°½áÊøºó¾Í·Ö·¢³öÈ¥¡£¡£¾ßÌå·ÖÎöreassemble_and_dispatch()º¯ÊýÈçÏ£º£º£º
Ê×ÏÈ£¬£¬´¦ÖõÚÒ»¸öpacket£¬£¬´úÂë127Ðе½129ÐУ¬£¬±ðÀë¶ÁÈ¡handle¡¢¡¢¡¢acl_lengthºÍl2cap_length¡£¡£handleΪ±¾´ÎÁ´Â·µÄConnection_Handle¡£¡£Æ¾¾ÝǰÎÄÊý¾Ý°üÌåʽµÄ½éÉÜ£¬£¬acl_lengthΪData Total Length£¬£¬¸ÃdataÊý¾ÝÓòÖдæ·Å×ÅL2CAPÊý¾Ý°ü·ÖƬ£¨Ò²¿ÉÄÜÊÇÒ»¸öÆëÈ«µÄL2CAPÊý¾Ý°ü£©¡£¡£¶øºó£¬£¬Ö±½Ó¶ÁÈ¡dataÖÐL2CAP Length£¬£¬¸Ãl2cap_lengthÊÇÒ»¸öÆëÈ«µÄL2CAPÊý¾Ý°üÖÐpayloadµÄ³¤¶È¡£¡£ÐÐ131£¬£¬Ð£Ñépacket°ü³¤¶ÈÊÇ·ñÕý³£¡£¡£ÐÐ133£¬£¬Í¨¹ýhandle»ñÈ¡boundary_flag£¬£¬¼´ÊÇPB Flag¡£¡£
ÐÐ136£¬£¬ÅжÏboundary_flagÊÇ·ñΪ2£¬£¬¶þ½øÖưµÊ¾Îª10¡¯b£¬£¬¼´Åжϵ±Ç°packetÊÇ·ñΪ Contoller -> Host µÄ L2CAP µÄÊ×°ü£¬£¬ÈôÊÇÊÇ£¬£¬½øÈëifÓï¾ä¡£¡£ÐÐ137µ½ÐÐ147£¬£¬Åжϵ±Ç°packetÊÇ·ñÒѾ±»´¦Ö㬣¬±£Õϱ¾´Î´¦ÖõÄpacket¶¼ÊÇ×îеġ£¡£ÐÐ149µ½ÐÐ154£¬£¬ÅжÏL2CAPÊý¾Ý°ü³¤¶ÈÊÇ·ñÕý³££¬£¬²»Õý³£Ö±½Ó±¨´í·µ»Ø¡£¡£
½ÓÏÂÀ´£¬£¬ÐÐ156µ½ÐÐ157£¬£¬ÍÆËãfull_length£¬£¬ÆäÖÐÔ̺¬Ò»¸öÆëÈ«µÄL2CAPÊý¾Ý°üÖеÄpayloadµÄ³¤¶È£¬£¬Ò»¸öL2CAPÍ·²¿³¤¶ÈºÍÒ»¸öHCIÍ·²¿³¤¶È¡£¡£ÐÐ161µ½ÐÐ168£¬£¬ÅжÏfull_lengthÊÇ·ñ³¬¹ýBT_DEFAULT_BUFFER_SIZE£¬£¬ÈôÊdz¬¹ýÖ±½Ó±¨´í·µ»Ø¡£¡£ÐÐ170µ½ÐÐ178£¬£¬Åжϵ±Ç°Í·°üpacketÊÇ·ñ»¹ÓÐÐø°ü£¬£¬ÈôÊÇûÓÐÐø°üÖ±½ÓŲÓÃcallbacks->reassembled´¦Öõ±Ç°packet²¢·µ»Ø¡£¡£
ÈôÊǵ±Ç°Í·°üpacketºóÃæ»¹ÓÐÐø°ü£¬£¬ÄÇ¾ÍÆðÍ·ÖØÐ·ÖÅäÒ»¿éеÄÄÚ´æÓÃÓÚpacketÖÐÊý¾Ý°üÖØ×é¡£¡£ÐÐ180µ½184£¬£¬·ÖÅä²¢ÉèÖÃpartial_packet£¬£¬½«partial_packet->lenÉèÖÃΪfull_length£¬£¬½«partial_packet->offsetÉèÖÃΪpacket->len¼´µ±Ç°Í·°üpacket->dataµÄ³¤¶È¡£¡£ÐÐ186£¬£¬Å²ÓÃmemcpy£¬£¬½«Í·°üpacketÖÐHCIÊý¾Ý°üÕûÌ忽±´µ½partial_packetÖС£¡£ÐÐ189µ½ÐÐ191£¬£¬ÏÈÕÒµ½HCIÊý¾Ý°üÍ·²¿£¬£¬²¢Ìø¹ýhandle£¬£¬¸üÐÂacl_lengthΪһ¸öÆëÈ«µÄL2CAPÊý¾Ý°ü³¤¶È¡£¡£ÐÐ193£¬£¬½«partial_packet´æ·Åµ½ÈÝÆ÷ÖС£¡£ÐÐ196£¬£¬¿ªÊ͵±Ç°Í·°üpacket£¬£¬°µÊ¾ÒѾ´¦ÖÃÍêµÚÒ»¸öpacket£¬£¬²»ÔÙ±ØÒªËüÁË¡£¡£ÐÐ197£¬£¬elseÓï¾äÆðÍ·´¦ÖúóÐøpacket£¬£¬¼´boundary_flag²»µÈÓÚ2µÄpacket¡£¡£
ÐÐ198µ½ÐÐ205£¬£¬Ê×ÏÈͨ¹ýhandleÅжϵ±Ç°ºóÐøpacketÊÇ·ñÊôÓÚ±¾´ÎÁ´Â·µÄ£¬£¬ÈôÊDz»ÊôÓÚ£¬£¬Ö±½Ó·µ»Ø¡£¡£ÐÐ206£¬£¬»ñȡǰһÂÖÌìÉúµÄpartial_packet¡£¡£ÐÐ208£¬£¬½«µ±Ç°ºóÐøpacket->offset¸³ÖµÎªHCI_ACL_PREAMBLE_SIZE¼´4×Ö½Ú£¬£¬´Ëʱpacket->offsetÖ¸ÏòHCI°üÖеÄdataÓò£¬£¬ÀïÃæ´æ·Å×ÅL2CAPÊý¾Ý°ü·ÖƬ¡£¡£ÐÐ209ºÍÐÐ210£¬£¬ÍÆËãprojected_offset£¬£¬projected_offsetΪpartial_packet->offsetÓë±¾´ÎL2CAPÊý¾Ý°ü·ÖƬµÄ³¤¶ÈÖ®ºÍ¡£¡£
ÐÐ211ºÍÐÐ219£¬£¬ÅжÏprojected_offsetÊÇ·ñ´óÓÚpartial_packet->len,¼´ÅжÏprojected_offsetÊÇ·ñ´óÓÚfull_length¡£¡£ÈôÊÇ´óÓÚ£¬£¬ÔòÅú¸Äpacket->lenΪpartial_packet->len¼õÈ¥partial_packet->offset£¬£¬¼´packet->lenΪpartial_packetÔü×Ò¿Õ¼äµÄ³¤¶È¡£¡£¶øºó£¬£¬½«projected_offsetÉèÖÃΪpartial_packet->len¡£¡£¾ßÌåÊý¾Ý°üÖØ×éÈçÏÂͼËùʾ£º£º£º
Ð޸ĺÃÏÖʵҪ¿½±´µÄ³¤¶Èºó£¬£¬ÐÐ221£¬£¬Å²ÓÃmemcpy½øÐп½±´£¬£¬·ì϶µãµ½ÁË,µÚÒ»¸ö²ÎÊýΪpartial_packet->data + partial_packet->offset,Ö÷ÕŵØÖ·ÊÇÕýÈ·µÄ£¬£¬µÚ¶þ¸ö²ÎÊýΪpacket->data + packet->offset£¬£¬Ô´µØÖ·Ò²ÊÇÕýÈ·µÄ£¬£¬µÚÈý¸ö²ÎÊýÊÇÒª¿½±´µÄ³¤¶ÈlenΪpacket->len - packet->offset£¬£¬Õâ¸öÖµÊÇÓÐÎÊÌâµÄ£¬£¬·ÖÁ½ÖÖÇé¿ö¡£¡£µÚÒ»ÖÖÇé¿öÊÇprojected_offsetСÓÚpartial_packet->len£¬£¬packet->len - packet->offsetΪL2CAPÊý¾Ý°üƬ¶Î×ܳ¤¶È£¬£¬²¢ÇÒÊǸöÕýÊý¡£¡£µÚ¶þÖÖÊÇÐÐ211µÄÇé¿ö£¬£¬packet->lenÒѾ±»ÐÞ×ÔУ¬£¬²»±ØÒªÔÙÒ»´Îpacket->len - packet->offsetµÄ²Ù×÷£¬£¬ÈôÊÇpartial_packetÔü×ҿռ䳤¶ÈСÓÚ4×Ö½Ú£¬£¬ÄÇpacket->len - packet->offset ÊÇСÓÚÁãµÄ£¬£¬ÊÇÒ»¸ö¸ºÊý¡£¡£ÓÉÓÚmemcpy()º¯ÊýµÚÈý¸ö²ÎÊýÀàÐÍÊÇÒ»¸öÎÞ·ûºÅÕûÐÍÀàÐÍ£¬£¬Òò¶øÕûÊýÒç³öµ¼Ö¶ÑÒç³ö¡£¡£·ì϶²¹¶¡ÈçÏ£º£º£º
Äܹ»¿´µ½£¬£¬²¹¶¡´úÂëÖн«packet->len¼ÓÉÏÁËÒ»¸öpacket->offset£¬£¬ÓÃÓÚºóÃæµÖÏû¼õpacket->offsetµÄ²Ù×÷¡£¡£
ËÄ¡¢¡¢¡¢Ó°Ïì°æ±¾
Android Oreo£¨8.0ºÍ8.1£©
Android Pie£¨9£©
Android 10
Îå¡¢¡¢¡¢°²È«½¨Òé
¾¡¿ì¸üÐÂ×îеÄAndroid°²È«²¹¶¡
½öÔÚ¾ø¶Ô±ØÒªÊ±ÆôÓÃÀ¶ÑÀ
ά³ÖÀ¶ÑÀÉ豸²»³É·¢ÏÖ
²Î¿¼ÐÅÏ¢£º£º£º
1.https://insinuator.net/2020/02/critical-bluetooth-vulnerability-in-android-cve-2020-0022/
2.https://akhozo.blogspot.com/2020/02/critical-android-bluetooth-flaw-cve.html?spref=tw
3.https://android.googlesource.com/platform/system/bt/+/3cb7149d8fed2d7d77ceaa95bf845224c4db3baf%5E%21/#F0
4.https://source.android.com/security/bulletin/2020-02-01.html
5.http://androidxref.com/8.1.0_r33/xref/system/bt/hci/src/packet_fragmenter.cc
6.Bluetooth_Core_v4.2À¶ÑÀ¹Ù·½Îĵµ


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