AndroidÀ¶ÑÀ×é¼þ©¶´Á¬Á¬¿´
Ðû²¼Ê±¼ä 2018-08-151¡¢¸ÅÊö
AndroidϵͳÖУ¬À¶ÑÀ×é¼þ¿ÉÒÔ˵ÊÇÄþ¾²Â©¶´ÖØÔÖÇø£¬2017ÄêArmisSecurityÄþ¾²ÍŶÓÐû²¼BlueBorne×éºÏ©¶´¹¥»÷Á´¿ÉÒÔͨ¹ýÀ¶ÑÀ¶ÔÖÇÄÜÊÖ»ú½øÐÐÔ¶³Ì¹¥»÷£¬Î£º¦ÐÔ¼«´ó¡£½ñÄêÈýÔ·ݵÄAndroidÄþ¾²Í¨¸æÖУ¬ÏµÍ³²ã©¶´È«²¿¶¼ÊÇÀ¶ÑÀ×é¼þ©¶´£¬×ܹ²10¸ö¡£Â©¶´¶àÂþÑÜÔÚSDP£¨·þÎñ·¢ÏÖÐÒ飩ºÍBNEP£¨À¶ÑÀÍøÂç·â×°ÐÒ飩ÖУ¬¶øÇÒ©¶´ÀàÐͶàÊÇÄÚ´æÔ½½ç¶Áд¡£ËÄÔ·ݵÄÄþ¾²Í¨¸æÖУ¬×ܹ²ÓÐ7¸öÀ¶ÑÀ×é¼þ©¶´£¬¶àÂþÑÜÔÚAVRCP£¨ÒôƵ/ÊÓƵԶ³Ì¿ØÖÆÅäÖÃÎļþ£©ÐÒéÖС£ÁùÔ·ݺÍÆßÔ·ÝAndroid Äþ¾²Í¨¸æÖÐÒÀÈ»Åû¶Á˶à¸öÀ¶ÑÀ×é¼þ©¶´£¬Éæ¼°À¶ÑÀÐÒéÕ»Öжà¸öÐÒ飬Éæ¼°µÄÔ´Âë°æ±¾Îª6.0¡¢ 6.0.1¡¢ 7.0¡¢ 7.1.1¡¢7.1.2¡¢ 8.0¡¢ 8.1£¬ÁýÕÖ·¶Î§½Ï¹ã¡£
±¾ÎĽ«½éÉÜÀ¶ÑÀÐÒéÕ»ÖеÄL2CAPÐÒéºÍSMPÐÒ飬²¢¶ÔCVE-2018-9359ºÍCVE-2018-9365ÕâÁ½¸ö©¶´°¸Àý½øÐÐÏêϸ·ÖÎö¡£
2¡¢ÐÒé¼ò½é
2.1 L2CAP
L2CAP£¨Logical Link Control and Adaptation Protocol£©³ÆΪÂß¼Á´Â·ºÍÊÊÅäÐÒ飬ÊÇÀ¶ÑÀϵͳÖеĺËÐÄÐÒ飬λÓÚÊý¾ÝÁ´Â·²ã¡£L2CAPͨ¹ýÐÒé¶à·Ö¸´ÓᢷֶκÍÖØ×飬Ïò¸ß²ãÌṩÃæÏòÁ¬½ÓºÍÎÞÁ¬½ÓµÄÊý¾Ý·þÎñ¡£
2.1.1 L2CAPÊý¾Ý°ü¸ñʽ
L2CAPÊÇ»ùÓÚ·Ö×éµÄ£¬µ«Ò²×ñÑÐŵÀ´«ÊäµÄͨÐÅÄ£ÐÍ¡£L2CAPÖ§³ÖµÄÐŵÀÓÐÁ½ÖÖ£ºÃæÏòÁ¬½ÓµÄÐŵÀºÍÃæÏòÎÞÁ¬½ÓµÄÐŵÀ¡£ÔÚÃæÏòÁ¬½ÓµÄÐŵÀÖУ¬L2CAPÊý¾Ý°üµÄ¸ñʽÈçÏÂͼËùʾ¡£
Êý¾Ý°üÖÐÿ¸ö×ֶεÄ˵Ã÷ÈçÏÂËùʾ£º
2.1.2 L2CAPÐÅÁî
Á½Ì¨À¶ÑÀÉ豸ͨ¹ýL2CAPÐÒéͨÐÅʱ£¬ËùÓеÄÐÅÁ±»·¢Ë͵½CIDΪ0x0001µÄÐŵÀÖС£L2CAPÐÅÁîµÄ¸ñʽÈçÏÂËùʾ¡£
L2CAPÐÅÁîÖÐÿ¸ö×ֶεÄ˵Ã÷ÈçÏÂËùʾ£º
L2CAPÐÒé¹²ÓÐ12ÖÖÐÅÁîÀàÐÍ£¬¸÷ÐÅÁîµÄ×÷ÓÃÈçϱíËùʾ¡£
ÁíÍ⣬¶à¸öÐÅÁî¿ÉÒÔÔÚͬһ¸öÖ¡Öз¢ËÍ£¬ÈçÏÂͼËùʾ¡£
2.2 SMP
SMP£¨Security Manage Protocol£©ÊÇÀ¶ÑÀÐÒéÕ»ÖеÄÄþ¾²¹ÜÀíÐÒ飬ÂôÁ¦À¶ÑÀÉ豸֮¼äµÄÅä¶ÔºÍÃÜÔ¿·ÖÅä¡£
SMPÃüÁî¸ñʽÈçÏÂͼËùʾ¡£

ÆäÖУ¬Code×Ö¶ÎΪһ¸ö8bit£¬±êʶÃüÁîµÄÀàÐÍ¡£SMPÃüÁîµÄÀàÐÍÈçϱíËùʾ¡£Data×Ö¶ÎÔÚ³¤¶ÈÉÏÊǿɱäµÄ£¬ Code×ֶξö¶¨Data×ֶεĸñʽ¡£

3¡¢Â©¶´ÔÀí·ÖÎö
3.1 CVE-2018-9359
£¨ÒÔÏ·ÖÎö»ùÓÚandroid-8.0.0_r4°æ±¾Ô´Â룩
CVE-2018-9359©¶´Î»ÓÚL2CAPÐÒéÄ£¿é£¬Â©¶´ÀàÐÍÊÇÔ½½ç¶Á¡£¿ÉÒÔͨ¹ý¹È¸è¹Ù·½Í¨¸æ¿´µ½Â©¶´²¹¶¡¡£Â©¶´²¹¶¡´úÂëλÓÚ/stack/l2cap/l2c_main.ccÎļþÖеÄprocess_l2cap_cmdº¯ÊýÖУ¬¸Ãº¯ÊýÖ÷Òª¹¦Ð§ÊÇ´¦ÖýÓÊÕµÄL2CAPÐÒéµÄÐÅÁî°ü¡£
´Ó´úÂë291ÐпªÊ¼£¬whileÑ»·½âÎöL2CAPÊý¾Ý°üÖÐËùÓеÄCOMMANDÃüÁî¡£Ê×ÏÈ¿´Ò»ÏÂÁ½¸öºê½ç˵£ºSTREAM_TO_UINT8´ÓpÖ¸ÏòµÄÊý¾Ý°üÖжÁÈ¡1¸ö×Ö½Ú£¬pÖ¸Õë¼Ó1£»STREAM_TO_UINT16ÿ´Î´ÓpÖ¸ÏòµÄÊý¾Ý°üÖжÁÈ¡2¸ö×Ö½Ú£¬pÖ¸Õë¼Ó2¡£
·¨Ê½µ÷ÓúêÒÀ´Î´ÓpÖ¸ÏòµÄÊý¾Ý°üÖжÁÈ¡cmd_code¡¢idºÍcmd_len×Ö¶Î,´ËʱpÓ¦¸ÃÖ¸ÏòdataÊý¾ÝÓòµÄ¿ªÍ·¡£
µ±Code=0x1£¬´ú±íCommand rejectÊý¾Ý°ü£¬Êý¾Ý°ü½ç˵ÈçÏÂËùʾ¡£µ±Length²»Îª0£¬dataÊý¾ÝÓòÖаüÂÞÁ½¸ö×ֶΣºReason×Ö¶Î(2×Ö½Ú)ºÍData×ֶΡ£

´¦ÖÃCommand rejectÊý¾Ý°üµÄ·ÖÖ§´úÂëÈçÏ£º
´Ó´úÂë¿ÉÒÔ¿´³ö£¬·¨Ê½Ã»ÓÐÅжϸÃÃüÁî°üÊÇ·ñ´æÔÚdataÊý¾ÝÓò£¬ÔÚ334ÐÐÖÐÖ±½ÓʹÓúê¶ÁÈ¡2¸ö×Ö½ÚµÄrej_reason¡£Òò´ËÔÚÄÚ´æ¶ÑÖз¢ÉúÔ½½ç¶Á©¶´¡£
ÕâÀïÒ²Ö»ÊÇ·¢ÉúÁËÄÚ´æÔ½½ç¶ÁÈ¡£¬Ã»Óн«¶ÁÈ¡µÄÊý¾Ý鶵½¿Í»§¶ËÖС£ÏÂÃæÕÒµ½·¢ËÍ·µ»Ø°üµÄ´úÂ룬¼ì²ìÈçºÎ·¢ÉúÄÚ´æй©¡£
´Ó378ÐдúÂ뿪ʼÊǽâÎöL2CAP_CMD_CONN_REQÃüÁî·ÖÖ§£¬379ÐдúÂ룬ÏÈÔ½½ç¶ÁÈ¡Á½¸ö×Ö½ÚµÄcon_info.psm£¬380ÐдúÂëÔ½½ç¶ÁÈ¡Á½¸ö×Ö½ÚµÄrcid¡£381Ðе÷ÓÃl2cu_find_rcb_by_psmº¯Êýͨ¹ýcon_info.psmÈ¥±éÀúÑ°ÕÒ×¢²á¿ØÖÆ¿éµØÖ·¡£ÕâÀï¼òµ¥½éÉÜÒ»ÏÂPSMÕâ¸ö¿´·¨¡£
PSMÈ«³ÆΪProtocol/ServiceMultiplexer£¬PSMµÄ³¤¶È×îÉÙÊÇ2×Ö½Ú£¬ËüµÄÖµÓ¦µ±ÊÇÆæÊý£¬¾ÍÊÇ×îµÍµÄbyteµÄ×îµÍλ±ØÐëΪ1¡£ÁíÍ⣬PSMµÄ×î¸ßbyteµÄ×îµÍλӦµ±Îª0¡£Ëü¿ÉÒÔ±È2×Ö½Ú³¤£¬PSMÓÉÁ½¸ö·¶Î§¶Î×é³É£¬µÚÒ»¸ö·¶Î§¶ÎÊÇSIGÓÃÀ´ÌåÏÖ¶ÔÓ¦protocolµÄ£¬µÚ¶þ¸ö·¶Î§¶ÎÊǶ¯Ì¬ÉêÇëµÄºÍSDP½áºÏʹÓá£Õâ¸öÖµÓÃÀ´Ö§³ÖÌض¨protocolµÄ²îÒìʵÏÖ¡£ËùÒÔ£¬ÔÚÉêÇëPSMµÄʱºò¶¼ÊÇ´Ó0x1001¿ªÊ¼ÉêÇëµÄ¡£ÔÒò¾ÍÊÇ0x0001~0x0eff¶¼ÊDZ»SIG±£ÁôµÄ¡£ÄÇôÕâЩ±£ÁôµÄÖµ¶¼¸÷×Ô¶ÔÓ¦ÁËÄÄЩprotocolÄØ£¿¾ßÌå¼ûÏÂͼ¡£

´úÂë382ÐÐÅжÏp_rcbÊÇ·ñΪNULL£¬Èç¹ûΪ¿Õ¾Íµ÷ÓÃl2cu_reject_connectionº¯Êý£¬¾ßÌ忴һϸú¯Êý´úÂë¡£
´Ó´úÂë520Ðе½523ÐУ¬Í¨¹ýºêUINT6_TO_STREAM½«Êý¾ÝдÈëpÖ¸ÏòµÄÄÚ´æÖС£
ÆäÖÐremote_cid¾ÍÊÇ֮ǰԽ½ç¶ÁÈ¡µÄÁ½¸ö×Ö½ÚÊý¾Ý¡£½á¹¹ºÃÏìÓ¦Êý¾Ý°üºó£¬´úÂë525Ðе÷ÓÃl2c_link_check_send_pkts½«ÏìÓ¦°ü·¢Ë͵½¿Í»§¶Ë¡£
ÔÚÁùÔ·ÝandroidÄþ¾²Í¨¸æÖУ¬CVE-2018-9359¡¢CVE-2018-9360¡¢CVE-2018-9361Èý¸ö©¶´µÄ²¹¶¡ÊÇÒ»ÑùµÄ¡£²¿ÃŲ¹¶¡´úÂëÈçÏ¡£
¿ÉÒÔ¿´³ö£¬²¹¶¡ÖÐÌí¼ÓÁ˳¤¶ÈÅжϡ£Èç¹ûp+2>p_next_cmd²»ÎªÕ棬˵Ã÷´æÔÚdataÊý¾ÝÓò£¬È»ºó²Å¿ªÊ¼¶ÁÈ¡×Ö½Ú¡£
3.2 CVE-2018-9365
£¨ÒÔÏ·ÖÎö»ùÓÚandroid-8.0.0_r4°æ±¾Ô´Â룩
CVE-2018-9365ÊÇSMP£¨security manager protocol£©ÐÒéÖÐÒ»¸öÊý×éÔ½½ç©¶´¡£¸Ã©¶´·ºÆðÔÚsmp_sm_eventº¯ÊýÖУ¬´úÂë·¾¶Îª£º\smp\smp_main.cc¡£¹È¸è¹Ù·½²¹¶¡´úÂëÈçÏ¡£
´Ó²¹¶¡ÖпÉÒÔ¿´µ½£¬ÕâÀïÅжÏÁËp_cb->roleÊÇ·ñ´óÓÚ1£¬Èç¹û´óÓÚ1±¨´í·µ»Ø£¬²¹¶¡´úÂëÏÂÒ»ÐоÍÊÇÒÔp_cb->roleΪϱêÔÚsmp_entry_tableÊý×éÖвéÕÒ¡£Smp_entry_tableÊý×é½ç˵ÈçÏ¡£
¿ÉÒÔ¿´µ½£¬smp_entry_tableÊý×éÖÐÖ»ÓÐÁ½Ïһ¸öÊÇÕë¶ÔÖ÷É豸£¬Ò»¸öÊÇÕë¶Ô´ÓÉ豸¡£µ±ÓÐÊý¾Ý°üͨ¹ýL2CAPÔÚSMPÐŵÀÖнÓÊÕµ½Ê±£¬»áµ÷ÓÃsmp_data_receivedº¯Êý½øÐд¦Öá£Smp_data_receivedº¯Êý´úÂëÈçÏ¡£
´úÂë146Ðж¨Î»µ½ÄÚ´æÖÐSMPÊý¾Ý°üλÖᣴúÂë150ÐÐͨ¹ýSTREAM_TO_UINT8ºêÈ¡³öcmd¡£
µÚ160ÐдúÂëÅжÏcmdµÄÀàÐÍÊÇ·ñΪÅä¶ÔÇëÇóÖ¸Áî»òÕßÄþ¾²ÇëÇóÖ¸Áî¡£Èç¹ûÊÇ£¬µÚ164ÐпªÊ¼¶Ôp_cb->role½øÐи´ÖÆ¡£Í¨¹ýÃû³ÆÅжϣ¬L2CA_GetBleConnRoleº¯ÊýÓ¦¸ÃÊÇͨ¹ýÀ¶ÑÀµØÖ·»ñÈ¡À¶ÑÀÉ豸µÄ½ÇÉ«ÐÅÏ¢¡£¶ÔÓÚÀ¶ÑÀÉ豸À´Ëµ£¬Ö»ÓÐÁ½ÖÖ½ÇÉ«£¬Ò»ÊÇÖ÷É豸½ÇÉ«£¬¶þÊÇ´ÓÉ豸½ÇÉ«¡£L2CA_GetBleConnRoleº¯Êý´úÂëÈçÏ¡£
µÚ201Ðнç˵ÁËrole£¬Í¬Ê±¸ørole¸³ÖµÎªHCI_ROLE_UNKNOWN¡£ºê½ç˵ÈçÏÂËùʾ¡£

RoleÏȱ»¸´ÖÆΪ0xff£¬´úÂë205ÐÐÊÇͨ¹ýÀ¶ÑÀµØÖ·±éÀúÑ°ÕÒp_lcb£¬Èç¹ûp_lcbΪ¿Õ£¬ÔòÖ±½Ó·µ»ØHCI_ROLE_UNKNOWN¡£P_cb->role±»¸³ÖµÎª0xffºó£¬ºóÐø´úÂëÖ±½Óµ÷ÓÃÁËsmp_sm_eventº¯Êý¡£´úÂëÈçÏÂËùʾ¡£
µ÷ÓÃsmp_sm_eventº¯Êý£¬²¹¶¡Ç°µÄ´úÂëÔÚ957ÐÐÓÉÓÚûÓÐÅжÏp_cb->roleµÄ´óС£¬µ¼ÖÂÊý×éÔ½½ç·ÃÎÊ¡£
4¡¢×ܽá
ͨ¹ý¶Ô¶à¸öÀ¶ÑÀ©¶´µÄ·ÖÎö£¬·¢ÏÖAndroidÀ¶ÑÀ×é¼þÖеÄ©¶´¶àÊǽÏΪµÍ¼¶µÄ´úÂëbugµ¼Öµģ¬¶øÇÒ©¶´¶à·ºÆðÔÚ¶ÔÊý¾Ý°üµÄ½âÎö´úÂëÂß¼ÖС£Õë¶ÔÅû¶µÄÕâô¶àÀ¶ÑÀ©¶´£¬°²×¿ÊÖ»úÓû§»¹Ð輰ʱ¸üйٷ½ÍÆË͵IJ¹¶¡£¬½«Äþ¾²Òþ»¼½µµÍµ½×îµÍ¡£
5¡¢Ïà¹ØÁ´½Ó
[1] https://android.googlesource.com/platform/system/bt/+/b66fc16410ff96e9119f8eb282e67960e79075c8%5E%21/#F0
[2] https://android.googlesource.com/platform/system/bt/+/ae94a4c333417a1829030c4d87a58ab7f1401308%5E%21/#F0
[3] https://blog.quarkslab.com/a-story-about-three-bluetooth-vulnerabilities-in-android.html