在2015年9月份时在AppStore很多APP被注入第三方恶意代码,针对这个问题,盘古实验室紧急开发了病毒检测工具,并检测到大量的受感染的样本。这个事件大家比较熟悉,我不多做描述,有兴趣可以去自己搜索一下。
我们通过这个问题考虑为什么进行iOS APP审计?使用iOS的大部分用户或者在传统媒体只做应用开发的人认为,使用一个手机从AppStore下载一个应用是绝对安全的。事实上并不是这样的,除了ZipperDown之外还有一些问题没有被共享出来。有些APP还会收集大家的隐私和通讯录等等,所以AppStore下载的应用并不完全是安全的。
大部分iOS开发人员,认为安全相关的内容与自己无关,依赖却并不是完全了解苹果的安全机制,这是在开发中很常见的,因为赶进度或者产品经理奇怪的需求,开发人员会有意无意破坏苹果提供的安全机制,导致他开发出来的APP并不安全。
根据一些报道,iOS平台恶意软件增速已经超过了安卓。
iOS平台审计更依赖于经验,安卓有很多自动化审计工具,审计安卓APP时大家会使用自动化使用工具做出一个报表,然后看看有什么需要人工去分析的地方再去深入分析。iOS不一样,市面上用的自动化审计工具非常简单,审计出来的报告没什么意义。做iOS的APP审计时需要做人工审计,更多工作内容放在人工,人工审计非常依赖经验。
iOS平台审计的工具有很多,每个都有自己特定的作用。我做了一张图,上面列出了iOS审计用到哪些工具。非常理解审计基本结构,首先,拿到一个APP需要先做静态分析,之后根据静态分析出来的结果做一些简单的动态分析,动态分析主要就是抓包,看看有没有什么危险的包,这是明显一眼可以看出来的问题。其次,根据审计出来的结果和静态分析的代码,看看比较容易出问题的代码是否用到。大家去市面找到iOS教程或书籍,可以详细的大家告诉有哪些静态工具、动态工具。我在右边列出来的的目的是告诉大家,右边所有这些工具都是有用的,但是它们没有被整合在一起、很零散,做iOS立项或者审计时需要大量时间熟悉我们用的工具。
这里是给大家总结一下我们做这么长时间iOSAPP审计的常见问题:
1、不安全的随机函数。
2、APP切换到后台泄露敏感信息,比如你的手机APP在跟别人聊天,你按home会切到后台,它有一个截屏。当然,如果不是越狱的手机,基本是没有风险的。3、存在本地数据库的SQL注入。
4、自动使用第三方键盘输入敏感信息,第三方键盘上传东西的话,可能敏感信息会被上传到服务器。
5、没有正确的使用SSL。
6、未能正确的处理所有的urlscheme接口没有详细过滤。
7、其他问题。这些都是常见的小问题,一般这种问题在开发者或者在厂商看来都不是什么大问题。
接下来看看一般厂商比较重视的问题:
1、短信验证未作限制。登陆或注册时未对获取短信验证码的次数作限制或限制不够严谨。这个问题的审计方法是通过抓包,去请求验证码的请求包,看看这个验证码会不会重新放回来。做得最差的是没有任何前置,可以向服务器请求,服务器可能会发几十条几百回,有的服务器会做一天十条或者一天二十条,或者一段时间内频繁发,它会把你阻塞,过一段时间再让你发。开发者在做检测这时一定要要严谨,我遇到一个做了检测,他根据cookie和一堆乱七八糟的ID做检测,我们通过抓包之后把所有的ID都删了,它又可以通过了,它的服务器代码分支里没有考虑到所有的词都没有情况下,所以没有做限制。最主要的问题是直接的经济损失,一条短信几分钱也是钱,一天可以发很多条。
2、非HTTPS网络请求。在访问资源没有通过HTTPS做网络请求,审计方法是打开APP通过撞户软件去看是不是有不是http的请求。这个审计方法也非常简单,就打开APP通过帐号,去看是否有不是http的请求是不是在获取敏感信息,比如拉出资源包或者txt脚本。我见过最夸张的是整个APP里面全部是http的网站,它里面包括支付、登陆,所有东西全在http里,这是非常容易损失的。这里多提一句,我们审计国外APP时,在美国的AppStore上也审计了很多APP,这个问题从来没被发现过,但国内的APP中这个问题一抓一大把,所以国内在https的使用上需要加强。传一些大的文件,CDN太贵,可以通过https传一个哈希,变通的方法,因为这个确实影响很大,在恶意的网络环境中资源文件会被替换,主要攻击就是从这里来做的,这是主要的入口。
3、敏感信息本地保存。敏感的信息例如帐号、密码或者加密使用的密钥保存在本地。这个审计方法是通过静态分析,看看有没有敏感的。它的影响是不越狱的手机是不影响的,但是你把用户的信息存在本地,如果手机丢了或者别人拿到你手机帮你越狱了,或者你的手机被别人打得越狱了,我就知道你APP里面存在的敏感信息是什么,这是其一。其二,密钥会保存在本地,APP厂商的用户有几十万,它的密钥都是这个,我自己越狱装一个APP,把这个密钥提取出来,在非越狱的手机上通过http传输的数据是通过密钥加密的,同样又可以回到内容去替换它的资源。
4、服务器信任客户端的请求。这个问题比较常见,就是服务器客户端请求中的数,最常见的就是在做一款游戏时,客户端发过来的请求服务器没有做验证,服务器直接信任客户端。《吃鸡》这种游戏是没有办法的,但同时一些卡牌手游也会有这种问题,比如游戏功能完全信赖客户端,客户端告诉它“我的服务器是完全信任的”,这样导致厂商的损失。我遇到过审计国外的APP,它把信任本地保存的图片同步到服务器上,而这张图片是做面部识别的,只要我拿到别人的手机,把它越狱,这个APP再次打开时会把我修改过的照片上传到服务器。数据库里的照片就被换成了我的照片,我拿那个APP照我的脸就可以登陆别人的帐号,这个影响比较大。这个排查起来比较简单,主要是通过源码的开发软件,检查一下客户端发出来的请求,服务器是不是完全默认。这个问题虽然很简单,但影响很大。这些都是传统的审计方法和得到的结果。
结合我们做自动挖掘时的经验,最常见的一种做法是通过总结程序员的习惯,就是这段代码为什么这么写。最常见的是贴代码,如果大家对iOS越狱关心的话,根据ian beer的猜测iOS10.2的越狱内存里面的一个洞就是因为贴代码造成的,程序员把另外一个代码贴到了一个新的系统调用里做修改,他把一个指针当作size。程序员贴代码是非常可怕的,做开发的都知道github最容易贴代码。
我们看审计APP里面有没有一些github的库,贴代码或者引用开源库最经常遇到的问题是什么?就是不完全理解这个开源库是干什么用的。这个开源库提供了10个功能,我只要其中的1个功能,这时把这个开源库引入我的APP库之后,这1个功能确实能够实现,但其他9个功能很有可能会影响了APP的安全。大量APP会解压Zip包,我们看这个内部到底是用什么东西解压的,发现不同厂商在解压zip包时采用的代码用的函数是一样的,很神奇,后来发现是github开源的库。
Unzip路径穿越的问题是什么?在附件下载、资源更新或者文件传输过程中传过来的这个包如果是一个恶意包的话,就有可能通过路径穿越的问题把沙盒文件内的覆盖掉。这是SSZipArchive被大量的APP使用。包括一些的衍生的私有的Zip库。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-7-24 17:32
被CCkicker编辑
,原因: