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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


2.1.1 HCI°üÌåʽ


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


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


×Ö¶Î

×¢Ã÷

Handle

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

PB  Flag

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

BC  Flag

¹ã²¥±êÖ¾¡£

Data  Total Length

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

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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÉèÖÃΪ 00'b µÄʱ³½ £¬´ú±í Host -> Contoller µÄ L2CAP µÄÊ×°ü¡£ÉèÖÃΪ 01¡¯b µÄʱ³½ £¬´ú±í Host -> Contoller »òÕß Contoller -> Host µÄ L2CAP µÄÐø°ü£¨ÖÐÑëµÄ£©¡£ÉèÖÃΪ 10'b µÄʱ³½ £¬´ú±í Contoller -> Host µÄ L2CAP µÄÊ×°ü¡£


2.1.2 ·Ö¶Î£¨Fragmentation£©ºÍ³Á×飨Reassembly £©


·Ö¶ÎÊǽ«PDU·Ö»¯³É½ÏÓ׵IJ¿ÃÅ £¬ÒÔ±ã´ÓL2CAP´«µÝµ½½ÏµÍ²ã¡£³Á×éÊÇÆ¾¾Ý´Ó»ù²ã´«µÝÀ´µÄƬ¶Î³Á×éPDUµÄ¹ý³Ì¡£·Ö¶ÎºÍ³Á×éÄܹ»ÀûÓÃÓÚÈκÎL2CAP PDU¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


2.2 L2CAPÊý¾Ý°üÌåʽ


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


×Ö¶Î

×¢Ã÷

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()º¯ÊýÖÐ £¬¸Ãº¯ÊýÊÇÓÃÓÚÊý¾Ý°ü·Ô쬵ijÁ×é¡£¶ÔÓÚ¹ý³¤µÄACLÊý¾Ý°ü±ØÒª½øÐаüµÄ³Á×é £¬ÖØÒªÊÇÆ¾¾ÝACL°üÖеÄPB Flag±ê־λ½øÐгÁ×é £¬ÈôÊǵ±Ç°ÊÇÕØÊ¼²¿ÃŲ¢ÇÒÊDz»ÆëÈ«µÄ £¬ÔòÌìÉúÒ»¸ö²¿ÃŰü£¨partial_packet£©·Åµ½mapÀï £¬µÈÏ´ÎÊÕµ½ËüµÄºóÐø²¿ÃŽøÐÐ×é×° £¬×é×°½áÊøºó¾Í·Ö·¢³öÈ¥¡£¾ßÌå·ÖÎöreassemble_and_dispatch()º¯ÊýÈçÏ£º


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


ÐÐ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Êý¾Ý°ü·Ô쬵ij¤¶ÈÖ®ºÍ¡£


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


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


GA»Æ½ð¼×¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

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