不要温和的走进那个良夜
Do not go gentle into that good night

解决Android5.0屏幕录制漏洞

 

 

刚看到360提交的漏洞报告有一条Android5.0屏幕录制漏洞,看完之后不得不说,这个漏洞利用实在是精妙,其实解决方案倒是挺简单的,不过官方的文档过于繁琐,raintrue可以简单给大家介绍并提供解决方案

(以下部分涉及代码均在本人环境中完成,转载麻烦注明360原始出处以及本文链接)

360原始出处:android5.0屏幕录制漏洞

漏洞演示

漏洞演示

 

原理分析:

1.android在调用有些需要权限的功能的时候会提示用户 XXX(软件)将开始….

如获取您的GPS信息,获取您的通讯录等等…

luping

 

2.这个提示页面是无法屏蔽的,但是如果让用户自主点击即可开启截屏功能(包括录屏功能),通常的界面有音量-与电源键长按也可以达到这个效果

截屏代码方式:

  1. public class ScreenShot {
  2.     // 获取指定Activity的截屏
  3.     private static Bitmap takeScreenShot(Activity activity) {
  4.         // View是你需要截图的View
  5.         View view = activity.getWindow().getDecorView();
  6.         view.setDrawingCacheEnabled(true);
  7.         view.buildDrawingCache();
  8.         Bitmap bmap = view.getDrawingCache();
  9.         // 获取状态栏高度
  10.         Rect frame = new Rect();
  11.         activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
  12.         int statusBarHeight = frame.top;
  13.         Log.i(“TAG”“” + statusBarHeight);
  14.         // 获取屏幕长和高
  15.         int width = activity.getWindowManager().getDefaultDisplay().getWidth();
  16.         int height = activity.getWindowManager().getDefaultDisplay()
  17.                 .getHeight();
  18.         // 去掉标题栏,25高度
  19.         // Bitmap b = Bitmap.createBitmap(bmap, 0, 25, 320, 455);
  20.         Bitmap b = Bitmap.createBitmap(bmap, 0, statusBarHeight, width, height
  21.                 – statusBarHeight);
  22.         view.destroyDrawingCache();
  23.         return b;
  24.     }

录屏代码:(此为android5.0之后开放的)

  1. /**
  2.  * Returns an Intent that <b>must</b> passed to startActivityForResult()
  3.  * in order to start screen capture. The activity will prompt
  4.  * the user whether to allow screen capture.  The result of this
  5.  * activity should be passed to getMediaProjection.
  6.  */
  7. MediaProjectionManager mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
  8. Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
  9. startActivityForResult(captureIntent, REQUEST_CODE);

这里注释大概意思是,这个方法会返回一个intent,你可以通过startActivityForResult方法来传递这个intent,为了能开始屏幕捕捉,activity会提示用户是否允许屏幕捕捉(为了防止开发者做一个木马,来捕获用户私人信息),你可以通过getMediaProjection来获取屏幕捕捉的结果。我只能说,这个真的好讽刺.

然后重头戏开始了,原理很简单因为会弹出提示框,但是此处系统没有对应用名的长度做检查,提示框的大小会随提示内容(应用名)的长短自动调整,当应用名称足够长时,“将开始截取您的屏幕上的所有内容。”这段提示语将不再显示在提示框中的可视范围内,从而导致手机用户只是看到了一串长长的应用名,而没有看到系统真正想要提示用户的“有软件将要录屏”这样的重要提示信息。

代码如下:

 

  1. <string name=“app_name”>xx银行客户端注意事项:\n1、不要在公共场所使用网上银行,防止他人偷看您的密码。\n2、不要在网吧、图书馆等公用网络上使用网上银行,防止他人安装监测程序或木马程序窃取账号和密码。\n3、每次使用网上银行后,及时退出。\n4、在其他渠道(如ATM取款、自助终端登录)进行交易时,注意密码输入的保护措施,防止他人通过录像等方式窃取到您的账号和密码。\n5、切勿向他人透露您的用户名、密码或任何个人身份识别资料。\n6、如果您的个人资料有任何更改(例如,联系方式、地址等有变动),请及时通过银行系统修改相关资料。\n7、定期查看您的交易,核对对账单。\n8、遇到任何怀疑或问题,请及时联系我行“95555-全国统一客服电话”。点击“立即开始”按钮继续执行    \t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\naaa</string>

此处伪造成有点像用户使用安全提示的样子,就可以瞒过大多数用户

 

(图挂了原图找不到了= =)

如图效果,此处已经完全看不到警告内容—-会截屏这一句话了!!!

一旦用户点击立即开始,屏幕录像功能即启动.

此处漏洞利用完成.同时恶意者可以使用AlarmManager构造一个轮询服务,每隔3秒钟查询一次当前正在运行的应用程序进程名称,当检测到某行客户端启动后,发起录制屏幕请求.

对此,官方给出的解决方案是:

在需要添加防止截屏与录屏的页面(如支付页面等等)添加禁止录屏功能

代码如下:

  1. Window win = getWindow();
  2. win.addFlags(WindowManager.LayoutParams.FLAG_SECURE);

即可完美解决问题啦

给用户的建议是在使用支付或登录等相关页面的时候检查状态栏是否允许截屏功能.

赞(0)
未经允许不得转载:林枫紫涵 » 解决Android5.0屏幕录制漏洞

评论 7

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #7

    收藏了,赞赞。

    代寫essay3个月前 (04-30)回复
  2. #6

    感谢楼主的分享,赞赞。

  3. #5

    竟然还有这种漏洞~ 💡

    冰原战士2年前 (2016-10-11)回复
  4. #4

    我自己的站我居然上不去,别人都可以访问,我挂了个VPS也能访问,奇了怪了

    raintrue3年前 (2015-10-27)回复
  5. #3

    有多少密码就被这样给偷走了

    Tom3年前 (2015-10-25)回复
  6. #2

    好厉害

    Tom3年前 (2015-10-25)回复
  7. #1

    逛逛。。。

    不锈钢屏风厂家3年前 (2015-10-23)回复