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£¬Èç¹ûÁè¼ÝÖ±½Ó±¨´í·µ»Ø¡£ÐÐ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ÊÇ·ñÊôÓÚ±¾´ÎÁ´Â·µÄ£¬Èç¹û²»ÊôÓÚ£¬Ö±½Ó·µ»Ø¡£ÐÐ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À¶ÑÀ¹Ù·½Îĵµ