许多流行App都存在隐私数据泄漏的问题,我们在谷歌应用商店中发现了一款名为 Camera360 的摄影App。该App虽然能够让用户的照片变得十分漂亮,但是在无意之间泄漏了用户的隐私数据:恶意攻击者可以不经过授权就能够访问到Camera360用户的云账户和相册。
在此之前,FireEye研究人员在Camera360以及其他一些主流应用中 发现了SSL漏洞 ,这些漏洞可以使用中间人攻击进行利用,并且其对用户的隐私数据构成严重的威胁。
安卓应用开发者应该提高自己安全意识,为用户提供更安全的移动体验!
Camera360有多种相机拍摄模式,能拍摄出不同风格、不同特效的照片,特效相机里还提供了丰富的特效滤镜,不会PS可轻松拍出大师级照片。它还支持拍后照片的编辑,并且可以把照片分享到微博、微信等主流社交网站。Camera360全球用户近4.5亿,Camera360还提供云服务:用户创建一个云账户后可通过登录cloud.camera360.com进行访问。
Camera360通过验证用户名和密码来保护云,但是当访问云时,Camera360 App将会在安卓系统日志(logcat)以及网络通信中以加密方式泄露用户隐私数据。应用可以读取logcat,或者获取网络通信从而盗取数据。假设恶意攻击者现在与你处在同一WiFi环境,可以使用WiFi sniffing轻松盗取你的数据!
泄漏的隐私数据可用于下载该用户除“私密专辑”外的所有照片 ,这个“私密专辑”是用户另外设置的一个密码。
在安卓应用中不能看到这些“私密专辑”照片, 值得一提的是:所有从设备上传到云上的数据默认情况下都是非“私密专辑”,这就意味着:隐私数据泄露后,从设备上传的照片都存在被黑客盗取的风险!
我们分析了Camera360最新版本的6.2以及之前的 6.1.2, 6.1.1 和 6.1版本,发现所有版本都存在数据泄漏的问题。
泄漏的数据可以通过下述方法不经授权访问用户照片:
1)使用泄漏的凭证创建一个新的登陆会话,接着从服务器抓取图片的keys,并通过其下载照片。 2)劫持登录会话,使用泄漏的token下载照片 3)使用泄漏的图片keys不通过身份验证直接下载照片
当然,捕获的网络通信中的照片可轻易的提取预览。
下面提供了更多的细节。
Camera 360应用使用HTTPS协议访问服务器,这也意味着敏感的登录数据无法在网络通信数据中轻易读取。在登录过程中,该App会向logcat记录敏感数据(该文件可以通过在设备上运行的其他其他应用读取)
Camera 360记录用户邮箱地址,密码hash以及其他相关数据。这个数据一旦泄露,它就可以创建一个单独的的登录会话。作为登录请求的回应,服务器会返回一个token,用户id以及账户其他信息。这个token和用户id可以从服务器抓取所有非“私密专辑”照片的key。使用这个keys目录下的所有照片你都可以进行下载了!
以下为测试时生成的log信息
通过逆向:我们发现它HTTPS登录地址,上述log信息中的数据可以通过这个HTTPS请求来创建一个登录会话。
以下为不带测试参数的URL地址
任何App都可读取logcat,盗取其登录数据并创建专属我们自己的登录会话。Logcat可以通过捕获READ_LOGS许可进行读取,在Android 4.0版本及以下所有的应用都可以进行访问,但在Android 4.1 (Jelly Bean)谷歌就开始禁止第三方App使用了。但是在已经root了的设备,应用可以通过提升权限来获取这个许可。
通过逆向我们还发现:密码hash为双MD5。通过字典攻击,攻击者获取原始密码。利用彩虹表或者brute force生成一个字符串与hash值进行匹配。密码破解相当重要,因为hash可以直接用来创建一个登录会话。密码hash以及获取的邮箱地址可以用来登录Camera360应用或者云。
作为应用登录请求的回应,服务器返回一个token,用户id以及账户其他相关信息。Camera 360应用使用这个token和用户id来进行验证。
以下为我们测试账号获取到的服务器返回信息:
这个token是一直不变的,即使用户登出之后依旧有效,因为会话变量仅仅只是从客户端进行了删除,而没有在服务端进行删除。因此,无论何时何地使用这个token都可以成功的发送请求。
Camera 360应用在logcat和网络通信数据中泄漏这个token,用户id,app和设备相关信息。任何安卓App都可读取logcat,所有运行网络嗅探器设备或者与目标设备在同一WiFi环境下的设备都可以盗取这些数据。这些泄漏的数据可以用来向服务器发送未经授权的请求,并从云端下载照片。
在登录过程中Camera 360在logcat泄漏的数据,以及用户打开他们的云账户进行操作。
以下为这两种情况收到的log信息的示例:
在上述信息中, "uid" 和 "userId"都为相同的用户id,"userToken" 以及 "localkey"的值也是相同的token值
App通过HTTPS协议发送登录请求,但是在接下来的验证token和用户id却使用HTTP协议。在网络通信数据中这种未加密的数据十分好读取。
下面为获取的HTTP请求:
利用泄漏的token,用户id以及应用其他的相关数据,使用下述HTTP请求可以获取用户照片
这些HTTP请求可以使用两种不同的方式下载照片,下面我们就来讲一讲:
*抓取照片keys
上面提到的所有HTTP请求都可以用来从服务器抓取照片keys,下面为服务器返回的测试请求:
响应"http://cloud.camera360.com/v2/page/timeline?…."
响应"http://cloud.camera360.com/v2/page/getNew?…"
keys可以从服务器响应中抓取使用,下面的HTTP请求可用来下载照片
HTTP GET请求既可以用来抓取照片keys,也可用来用来绕过Camera 360的网络云登陆"https://cloud.camera360.com/login"。在浏览器中执行任何一个请求都可以获取用户登录,因为这些请求中包含了身份验证token。用户在浏览器选项卡中键入其中一个URLs,得到的是一个已经登录的云端首页。
Camera 360的云相册中可以获取最新的照片keys。其记录了收到的服务器响应logcat信息,下面为详细信息:
这些记录的keys可以通过有权限读取logcat的应用来盗取。这些keys是由userID,随后跟着的image id组成,正如前面提到的,可以使用这些keys配合HTTP请求下载照片:
这是照片的永久链接,不会过期的。可以不提供凭证或者身份验证的token直接下载照片。
从服务器收集的照片,可以从捕获的网络通信数据中提取。这些都没用进行加密,提取操作十分简单
从应用厂商知道连接服务器使用安全的HTTPS协议,我们还是能够看出厂商是知道安全这个东西的。
这里小编想问了,既然自家是搞移动应用的,难道安卓的logcat 公司没有一个人去注意过?