2015年,WhatsApp推出网页版,这让许多用户感觉一下方便了许多,因为使用键盘打字比触摸屏要快得多,而且复制粘贴、添加附件也更容易。不过在用户体验提升的同时,也带来了一些安全问题,最明显的就是隐私泄露。
用户使用网页版WhatsApp时,攻击者无需添加好友就可以获得电话号码、个人头像以及在线状态,从而创建一个庞大的WhatsApp用户数据库。只有少数设置了隐私模式的用户不受影响。因为这项功能是默认关闭的,大部分用户都不知道。
网页版WhatsApp通过用户手机连接到WhatsApp服务器,会向WhatsApp服务器传送该电话号码相关的网络信息,包括以下3个方面:
1.个人资料图片,
2.登录期间的社交信息,一般情况下,默认的开头信息为“你好!我正在使用WhatsApp”,
3.用户的在线或离线状态。
实际上,每个电话号码所注册的WhatsApp都会具备上述3个状态信息。当你用手机注册的电话号码在网页上登录时,你的完整个人账户信息,比如个人资料图片,登录期间的社交信息,在线或离线状态的数据库就会立即打开,让用户从手机的使用到网页的使用之间形成一个完整的对接数据库。比如下图这回答了以下问题:电话号码为xxx-xxxxxx的用户的在线和离线状态的时间线,就显示的非常完整。
目前几乎所有网页上的脚本都是用Javascript编写的,如果有人能控制用户所浏览的网站的脚本,那他们就能对用户的网络行为了如指掌。网页版的WhatsApp也不例外,如果有人能通过脚本向WhatsApp服务器发送一个电话号码,那么他就能在几毫秒内收到有关该电话号码的信息,而且还可以看到源代码。
我已经利用这种可能性开发一个脚本,利用该脚本我可以对请求加我好友的电话号码的信息进行了解。该信息包含个人资料图片,登录期间的社交信息,在线或离线状态。其实每个人都可以创建这样一个脚本,以下就是我利用该脚本,随机对400个电话号码所进行的信息调查:
如果WhatsApp数据库可以以这样的方式随意进行查询,那用户还有什么隐私可言,所以当我发现在WhatsApp中可以用这种办法收集大量数据时,我联系了Facebook。总而言之,虽然他们意识到这种数据收集的可能风险,但他们并不认为这是一个问题,以下就是Facebook的回应。
网页版的WhatsApp会使用未记录的API,该JavaScript API会通过使用WebSocket与WhatsApp服务器进行通信。
我在脚本中使用了三个API调用。第一个是Store.ProfilePicThumb.find(<电话号码>),它用于收集个人资料的照片。
如上图所示,我用电话号码请求了个人资料的照片。请记住,只能在网页版的WhatsApp运行的同一个选项卡中请求该URL,而且必须向DOM添加一个<img>元素。
第二个API调用是Store.Wap.statusFind(<电话号码>),它用于请求关于电话号码的登录期间的信息。
最后一个API调用是Store.Presence.find(<电话号码>),它用于请求在线或离线状态。
通过循环使用这些API调用,你就可以得到你想要的每个电话号码的信息了。
在本文开头,你看到那张图,就是我创建的一个调用界面。