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½ÚÖÆÆ÷£¬£¬£¬Óëµ×²ãµÄ½á¹¹¹ØÏµÈçÏÂͼ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


Ö÷»úϵͳÉϵÄHCIÇý¶¯·¨Ê½ºÍ½ÚÖÆÆ÷ÖеÄHCI²ãÖ®¼ä»á´æÔÚÖÐÑë²ã£¬£¬£¬ ÕâЩÖÐÑë²ã¼´ÊÇÖ÷»ú½ÚÖÆÆ÷´«Êä²ã£¬£¬£¬ÕâЩ´«Êä²ãÊÇͨÃ÷µÄ£¬£¬£¬Ö»ÐèʵÏÖ´«ÊäÊý¾ÝµÄ¹¤×÷£¬£¬£¬²»ÓÃÃ÷ÏÔÊý¾ÝµÄ¾ßÌåÌåʽ¡£¡£¡£Á½¸öÀ¶ÑÀÉ豸µã¶ÔµãHCI²ãµÄ½»»¥¹ý³ÌÈçÏÂͼËùʾ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


2.1.1 HCI°üÌåʽ


HCIͨ¹ý°üµÄ·½Ê½À´´«ËÍÊý¾Ý¡¢¡¢ºÅÁîºÍÊÂÎñµÄ£¬£¬£¬ËùÓÐÔÚÖ÷»úºÍÖ÷»ú½ÚÖÆÆ÷Ö®¼äµÄͨѶ¶¼ÒÔ°üµÄ´ó¾Ö½øÐС£¡£¡£Ô̺¬Ã¿¸öºÅÁîµÄ·µ»Ø²ÎÊý¶¼Í¨¹ýÌØ¶¨µÄÊÂÎñ°üÀ´´«Êä¡£¡£¡£HCIº±¼û¾Ý¡¢¡¢ºÅÁîºÍÊÂÎñÈýÖÖÀàÐ͵İü¡£¡£¡£ºÅÁî°üCOMMAND£¨0x01£©Ö»ÄÜ´ÓÖ÷»ú·¢ÍùÖ÷»ú½ÚÖÆÆ÷£¬£¬£¬ÆäÖÐÊý¾Ý°üÊÇË«ÏòµÄ£¬£¬£¬·ÖΪÁ½Àࣺ£ºACL£¨0x02£©¡¢¡¢SCO£¨0x03£©£¬£¬£¬¶øÊÂÎñ°üEVENT£¨0x04£©Ê¼ÖÕÊÇÖ÷»ú½ÚÖÆÆ÷·¢ÏòÖ÷»úµÄ¡£¡£¡£Ö÷»ú·¢³öµÄ´óÎÞÊýºÅÁî°ü³ÇÊд¥·¢Ö÷»ú½ÚÖÆÆ÷²úÉúÏàÓ¦µÄÊÂÎñ°ü×÷ΪÏìÓ¦£¬£¬£¬ÔÚ´«Êä¹ý³ÌÖлáÓÐÒ»¸ö¾ä±ú£¬£¬£¬ÓÃÓÚ¼ø±ðÖ÷»úÖ®¼äµÄÂß¼­Í¨µÀºÍ½ÚÖÆÆ÷£¬£¬£¬¹²ÓÐÈýÖÖÀàÐ͵ľä±ú£º£ºÏνӾä±ú¡¢¡¢Âß¼­Á´Â·¾ä±úºÍÎïÀíÁ´Â·¾ä±ú¡£¡£¡£


ƾ¾Ý±ØÒª£¬£¬£¬ÕâÀïÖ»½éÉÜACLÊý¾Ý°üÌåʽ£¬£¬£¬ACL Êý¾ÝÓÃÓÚÖ÷»úºÍ½ÚÖÆÆ÷Ö®¼äµÄ·Çͬ²½Êý¾Ý»¥»»£¬£¬£¬Èç²¥·ÅÒôÀÖÊý¾ÝµÄÊý¾Ý°ü£¬£¬£¬ÌåʽÈçÏÂͼ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÿ¸ö×ֶεÄ×¢Ã÷ÈçÏÂËùʾ£º£º


×Ö¶Î

×¢Ã÷

Handle

Connection_HandleÓÃÓÚÔÚÖ÷½ÚÖÆÆ÷ÉÏ´«ÊäÊý¾Ý°ü»ò¶Î¡£¡£¡£

PB  Flag

°üÌìǵºÍÊÊÓ¦ÁìÓò¡£¡£¡£

BC  Flag

¹ã²¥±êÖ¾¡£¡£¡£

Data  Total Length

ÒÔ°Ëλλ×éΪµ¥ÔªµÄÊý¾Ý³¤¶È£¬£¬£¬Ô̺¬¸ß²ãºÍ̸data¡£¡£¡£

ÆäÖУ¬£¬£¬PB FlagµÄÃèÊöÈçÏ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÉèÖÃΪ 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¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


2.2 L2CAPÊý¾Ý°üÌåʽ


L2CAPÊÇ»ùÓÚ·Ö×éµÄ£¬£¬£¬µ«Ò²×ñÑ­ÐŵÀ´«ÊäµÄͨѶģÐÍ¡£¡£¡£L2CAPÖ§³ÖµÄÐŵÀÓÐÁ½ÖÖ£º£ºÃæÏòÏνӵÄÐŵÀºÍÃæÏòÎÞÏνӵÄÐŵÀ¡£¡£¡£ÔÚÃæÏòÏνӵÄÐŵÀÖУ¬£¬£¬L2CAPÊý¾Ý°üµÄÌåʽÈçÏÂͼËùʾ¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


Êý¾Ý°üÖÐÿ¸ö×ֶεÄ×¢Ã÷ÈçÏÂËùʾ£º£º


×Ö¶Î

×¢Ã÷

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()º¯ÊýÈçÏ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


Ê×ÏÈ£¬£¬£¬´¦ÖõÚÒ»¸ö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¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ136£¬£¬£¬ÅжÏboundary_flagÊÇ·ñΪ2£¬£¬£¬¶þ½øÖưµÊ¾Îª10¡¯b£¬£¬£¬¼´Åжϵ±Ç°packetÊÇ·ñΪ Contoller -> Host µÄ L2CAP µÄÊ×°ü£¬£¬£¬ÈôÊÇÊÇ£¬£¬£¬½øÈëifÓï¾ä¡£¡£¡£ÐÐ137µ½ÐÐ147£¬£¬£¬Åжϵ±Ç°packetÊÇ·ñÒѾ­±»´¦Ö㬣¬£¬±£Õϱ¾´Î´¦ÖõÄpacket¶¼ÊÇ×îеġ£¡£¡£ÐÐ149µ½ÐÐ154£¬£¬£¬ÅжÏL2CAPÊý¾Ý°ü³¤¶ÈÊÇ·ñÕý³££¬£¬£¬²»Õý³£Ö±½Ó±¨´í·µ»Ø¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


½ÓÏÂÀ´£¬£¬£¬ÐÐ156µ½ÐÐ157£¬£¬£¬ÍÆËãfull_length£¬£¬£¬ÆäÖÐÔ̺¬Ò»¸öÆëÈ«µÄL2CAPÊý¾Ý°üÖеÄpayloadµÄ³¤¶È£¬£¬£¬Ò»¸öL2CAPÍ·²¿³¤¶ÈºÍÒ»¸öHCIÍ·²¿³¤¶È¡£¡£¡£ÐÐ161µ½ÐÐ168£¬£¬£¬ÅжÏfull_lengthÊÇ·ñ³¬¹ýBT_DEFAULT_BUFFER_SIZE£¬£¬£¬ÈôÊdz¬¹ýÖ±½Ó±¨´í·µ»Ø¡£¡£¡£ÐÐ170µ½ÐÐ178£¬£¬£¬Åжϵ±Ç°Í·°üpacketÊÇ·ñ»¹ÓÐÐø°ü£¬£¬£¬ÈôÊÇûÓÐÐø°üÖ±½ÓŲÓÃcallbacks->reassembled´¦Öõ±Ç°packet²¢·µ»Ø¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÈôÊǵ±Ç°Í·°ü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¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ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Êý¾Ý°ü·ÖƬµÄ³¤¶ÈÖ®ºÍ¡£¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ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¡£¡£¡£¾ßÌåÊý¾Ý°üÖØ×éÈçÏÂͼËùʾ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


Ð޸ĺÃÏÖʵҪ¿½±´µÄ³¤¶Èºó£¬£¬£¬ÐÐ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()º¯ÊýµÚÈý¸ö²ÎÊýÀàÐÍÊÇÒ»¸öÎÞ·ûºÅÕûÐÍÀàÐÍ£¬£¬£¬Òò¶øÕûÊýÒç³öµ¼Ö¶ÑÒç³ö¡£¡£¡£·ì϶²¹¶¡ÈçÏ£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)

Äܹ»¿´µ½£¬£¬£¬²¹¶¡´úÂëÖн«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À¶ÑÀ¹Ù·½Îĵµ