Android输入输出子系统子系统到底安全吗?(一)_

任何独立的操作系统都离不开输入输出环节,而输入输出的安全性关系到使用该操作系统的用户的隐私和安全,Android系统也不例外,用户使用手机的次数要少得多比PC频繁ime输入法编程 可实现输入法注入,这使得其输入和输出的安全性越来越重要。本文抛砖引玉,简单分析一下Android输入输出系统的安全性。

I/O 子系统的负担

简单来说,用户与手机之间的所有交互都是由输入输出子系统来承载的。用户通过各种输入设备,如触摸屏、化学键盘、各种传感器等向系统传递指令,然后将结果输入子系统传递给某个系统。一个特定的应用程序完成用户想要的操作,然后通过输出子系统将结果呈现给用户。可见,如果输入输入被泄露,用户的隐私数据很容易被泄露,造成很大损失,比如输入的建行卡号、密码、身份信息、私聊记录、照片、视频等,都可能被盗pick。那个时候,手机真的变成了手榴弹。

那么,Android输入输出子系统安全吗?请看下面的分析。

输入子系统的漫漫长路

Android输入子系统的工作内容主要包括以下几点:

1.InputReader线程从键盘、触摸屏等输入设备获取原始输入信息

开机后,Android中最重要的系统进程system_server中的InputManagerService会在初始化时创建两个线程来处理输入干扰ime输入法编程 可实现输入法注入,一个是InputReaderThread,另一个是InputDispatcherThread。InputReaderThread 仍然会无限循环地从 EventHub 中读取系统的输入风暴,然后将其发送到 InputDispatcher 类中的一个队列中供 InputDispatcher 分发。

2.InputDispatcher 线程处理 InputDispatcher 队列中的干扰。

InputReaderThread中使用了epoll机制。当新的输入风暴线程被唤醒时,将转换后的消息发送到相应的窗口,并通过 InputChannel 将风暴发送到具体的应用进程。

3.App进程收到风暴后,最终通过一个viewtree结构的根DécorView分发给最终处理风暴的ChildView。

图1.输入子系统

它涉及2个进程通信。如果涉及到输入法,就比较复杂,涉及到三路通讯。如图2所示,输入法流程(以下简称IME,InputMethod),软键是给输入子系统的触摸波,所有的触摸波都通过输入子系统发送到IME进程,并转化为真实的输入字符根据触摸坐标,然后IME使用InputConnection(实际上是IInputContextBinder的封装)将输入字符串传递给正在通过IPC接受输入的app进程的TextView并显示。传输的字符串都是明文!

图2.输入法通信模型

从里面的分析可以看出,输入很长,任何一个环节都有可能被攻击。这里有几个反例。

0x01 根跟踪

直接窃听分析输入设备的原始干扰,/dev/input/目录下的节点权限如下。

图3.输入设备节点

登录shell由于调试需要也加入到输入组中(如图4,可以参考android系统源文件adb.c),但是android有一个外部geteventstorm工具。这个工具从量产版中去掉了,所以很容易通过adbshel​​l获取用户输入。安排如下。输入的坐标一目了然。如果可以结合其他信息,例如使用哪种输入法、屏幕码率等,就可以估计输入了哪些字符。也就是说,一旦我们的笔记本感染了病毒,恰好连接到笔记本输入敏感信息,嘿嘿,那么恶意程序就可以把所有的输入都搞定,一目了然!

图 4. adbshel​​l 有很多调试权限

图5 通过getevent工具分析输入风暴

0x02 击键

后者不好玩,数据不直观,中间的恶意程序可能已经获得了root权限,所以还是要击中重点。从前面的分析来看,在输入法通信模型中,直接注入被查获的InputConnection的commitText,可以很方便的获取。输入字符可以省去很多麻烦。如果注入输入法IME进程,这些敏感应用(如支付、金融、通讯等)的开发者会哭死。因为很难监控IME是否被入侵,心里只有无奈的OS,“我做不到!”。

0x03 另类雷霆

很久以前就有人说,一种叫做 TapLogger 的病毒可以通过体感来获取你的输入信息。也就是说,即使你触摸屏幕的虚拟按键,它也能准确识别你正在输入的内容。听说4位密码可以达到100%正确率,6位密码可以达到80%正确率。

输出子系统这么简单

如果输入子系统由于过程复杂而存在安全风险,而输出子系统简单,则增加了攻击的难度。

Android输出子系统主要是经典的Composite模式,如右图

图 6 输出子系统

每个App都会将自己的Surface传给SurfaceFlinger,SurfaceFlinger会做合成生成一个显示的缓冲区,传给FrameBuffer。不考虑 Overlaybuffer 的特殊情况,LCD 直接扫描 FrameBuffer 并显示在屏幕上。

问题出在这个FrameBuffer上,最终会放在系统的/dev/graphics/fb0节点上。如果这个节点被无意中配置为被其他人读写,恶意程序很容易读取FrameBuffer的内容。实现截图的效果,不过为了方便系统截图,Android也有自己的截图工具封装了FrameBuffer,使用起来非常方便。我们在国外某知名厂商的旗舰机上发现了类似的问题。如图7所示,网上流行的非root截图应用似乎就是通过这个漏洞实现的。

有安全漏洞的FB0节点

虽然没有这个漏洞,但是其他人没有任何权限(如图8所示),而且通过adb登录的shell由于调试需要也加入了graphicsgroup(这点在图4的代码中也可以看出),也就是据说一旦我们的笔记本感染了病毒,碰巧连接到笔记本输入敏感信息,哎,各种敏感输入,各种脏话都被轻松截图了。也是调试的原因。看来安全和调试确实是天敌。就个人而言,安全更为重要。或许谷歌此时倾向于拥有丰富的调试功能。

图8 没有安全漏洞的fb0节点

外表

近年来,芯片厂商、手机厂商、ROM开发商,甚至应用开发商对Android的深度Zen定制,都可能引入新的安全漏洞。好的一面是,谷歌已经越来越重视安卓系统的安全性。随着版本的不断升级,安全性也在不断增强。新发布的5.0让手机root越来越难。同时,还有实力雄厚的芯片厂商。,手机厂商也在开发自己的安全解决方案,特别是在联通支付领域,将安全提升到一个新的高度。联通系统安全任重道远。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站程序 Android输入输出子系统子系统到底安全吗?(一)_ http://www.wkzy.net/game/8463.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务