Category Archives: 信息安全

关于MIUI中cit.apk暴露bugreport的漏洞

之前在乌云发布的MIUI数据泄露漏洞之一(WooYun-2012-08222),其中的“详细说明”部分,存在部分错误。这个漏洞涉及bugreport,我错误地指出在shell下可以调用的bugreport,第三方应用软件也可以随便调用,这是错误的。由此在微博上和回复里引起对Android一般安全的讨论,向大家表示歉意。

此外,需要强调的是,由于Cit.apk的组件暴露,在MIUI系统下,该漏洞依然可以利用。

以下是详细的技术分析,包括我犯的错误,以及在MIUI下的利用方法。
Continue reading

DIMVA’12见闻

by Spark Zheng @ CUHK

第一天 7月26日

会议开始,先去注册领了所有paper的纸质版和一堆乱七八糟的礼品。随后chair讲了一下会议paper的来源,大多数来自德国和美国。另外Android是今年很热的一个关键词。
 
Keynote: Industrial Control Systems Security
Corrado Leita (Symantec Research Labs)
这是请Symantec的研究员来做的一个演讲,主要内容是ICS(不是ice cream sandwich,是industrial control system)。同时也对病毒的发展历史做了个介绍,还分析了最近特别火的flame病毒。还有他们的WINE计划,可以在www.symantec.com/WINE找到介绍。

Using File Relationships in Malware Classification
这篇记不大清了,因为我把打印版的paper集扔到旅店没拿(太沉了),网上也找不到pdf和ppt……估计过两天能在库里搜到。是微软研究院的人做的利用文件之间的关系给malware分类。比如说A zip文件包含了a、b、c三个文件,另一个B zip文件包含了a、b、d文件,然后这两个Zip之间就会有相似性。当然也可以运用到Android上,因为apk本身就是个zip嘛。
 
Understanding DMA Malware
这篇paper介绍了一种开机自动加载进入内存的病毒。DMA means Direct Memory Access。这种病毒已经无限接近于硬件病毒了,无视操作系统(最新的windows和linux都ok),可以进行键盘记录。运行的时候会扫描内存,寻找感兴趣的string,记录下来,或者记录键盘的敲击。

Large-Scale Analysis of Malware Downloaders
这篇paper的作者首先介绍了一下他们实验室已经做了好多年的malware dynamic的研究并拥有n多w样本。于是在这n多w样本中找出了11个至少活跃了一年的和18个依然活跃的downloader。随后对这些downloaders进行分析,找到了219依然活跃的C&C servers, 还进行了一些对于加密信息传输的研究。
 
Invited talk: The state of mobile security
这是邀请来的一个speaker,是iseclab的成员。从IOS和Android的基础讲起,把几乎所有的安全问题都讲了一遍,用到了好多用ida分析的例子。其中还讲到了怎么让apktool反编译失败dex,是在dex的指令序列里加入一些奇怪的跳转。还有ios的好多exploits和病毒,还有Android的静态和动态分析的内容(比如他们实验室研发的app分析系统:http://anubis.iseclab.org/)。这是一个非常好的一个talk,但他留下来的ppt只有首页,所有的内容都没给,我也没录音。看样子想了解他讲的东西只能通过他的主页找了:http://www.iseclab.org/people/pizzaman/

Juxtapp: A Scalable System for Detecting Code Reuse Among Android Applications
这是一个UC Berkeley的phd讲的找code reuse的系统。和jiang的fuzzy hashing那篇几乎没啥区别,除了算法从fuzzy hashing变成了feature hashing。并且对于const string混淆的应对能力弱到爆。不过这位童鞋也意识到了这点,估计是看了我的那篇paper,于是又透漏了好多他们现在做的工作,比如说用文件结构树来比较,以及对付混淆的方法。
 
ADAM: An Automatic and Extensible Platform to Stress Test Android Anti-Virus Systems
这是我的那篇文章,讲的是用3种repackaging和4种code obfuscation的方法来对Android malware进行混淆,不需要源代码(因为基于reverse engineering),全自动。类似于smali版本的proguard。 随后用了222*8个sample测试了40种anti-virus products. 通过结果,我们分析出大多数的anti-virus不是靠简单的apk md5或者dex md5来当作signature的。不过有很多是采用固定地址的binary code of dex file来取signature。但是rebuilt的过程会改变class order,所以如果class order变了,取的signature就会改变。还有许多anti-virus engine是采用方法名啊,类名啊,一些string啊来当signature的。缺点也很明显,容易被混淆击败,并且有很多的false positive。比如说你建个有com.geinimi package的app,里面一句代码也不写,却会有很多杀软报告这是geinimi的病毒。比较失败的是:我怕时间不够用,于是讲得很快,结果没有控制好时间,15分钟就讲完了,然后一群对对我进行了长达15分钟的Q&A……
 
然后有一段poster和discussion的部分,讲完筋疲力尽,木有参加,果断回去睡觉了。
 

第二天 7月27日

Invited talk: Defending Against Return-Oriented Programming
讲了一下exploit的历史,然后讲了现有的ROP的攻击方法和例子,同时提出了一种based on local machine的defense方法,也发布了一个系统用来防止文件被用来进行ROP exploit, 当然也有破解方法,那就是based on local machine的ROP compiler……更神级的东西了。很牛B的talk。于是去网上查了一下,发现这是今年oakland的paper,怪不得这么强大。
Read the paper. Get the (Orp: in-place binary code randomizer) code from http://nsl.cs.columbia.edu/projects/orp/.
 
A Static, Packer-Agnostic Filter to Detect Similar Malware Samples
讲了一种静态的方法,不用运行程序,也不用unpack pack过的程序来进行malware的相似度检测。大概是利用了一些加密原理的缺陷,然后不需要解密就可以进行相似度检测。大概是这样,这篇木有仔细听。
 
Experiments with Malware Visualization
说是malware变种比较的Visualization。其实就是字符串比较的Visualization而已。把malware的指令啥的转换成字符串,然后采用图像中常用的一种pin的算法,生成一个二维图。然后观察图像能发现很多有趣的现象,可以通过看的方式发现一些变种和原始病毒的变化。其实没啥用我感觉,PE的malware多的都几百万了,怎么可能看的过来。
 
Tracking Memory Writes for Malware Classification and Code Reuse Identification
虽然是篇short paper,但却非常有意思,讲的是如何利用动态的memory读写序列来进行malware的classification。首先是比较相似度的方法,大概是:先用虚拟机跑malware,记录malware对memory的读写操作,然后这个行为可以看成是一个字符串。随后进行一次快速比较,用来快速找出哪些section有大概的相似性,因为这个string可能非常长,要是进行完全匹配太浪费时间。随后利用一种diff-based LCS approach(改进后的LCS算法)进行完全匹配,最后计算得分(0~1)。
然后利用这种比较相似度的方法做了两个app:一个app是进行malware分成N组的clustering。Clustering就是data mining提到的,把一堆malware分成N组,但与classification不同的是不对分类器进行训练(training and testing)。首先是用pre-clustering来选出N个cluster leader, 然后采用Inter-cluster merging 来对剩下的malware进行分组(找最接近的cluster leader)。另一个app是Code Reuse Identification。这里除了基本的比较相似度以外还利用了一种map back的approach来找到是哪里的代码被reuse了,而不单单是知道code被resuse了。最后又做了一些实验来证明这个方法的有效性。
 
System-level Support for Intrusion Recovery
这个有点像mac的time machine,在server端同步着一个相同的虚拟镜像,同时记录memory和desk的各种行为。如果anti-virus发现病毒的话,立刻使用最新的没被感染的镜像开始回滚,同时模拟记录的操作执行到当前状况,但删除了malware对系统所做的那些行为。Q&A一直围绕着怎么样判断哪些行为是恶意行为讨论了很久。
 
NetGator: Malware Detection Using Program Interactive Challenges
这篇好像是讲利用malware不像人一样智能,在访问网络的时候加了一层检测,因为是人为加的,malware之前的设定并不知道,所以恶意行为无法执行。类似于防止CSRF的攻击?比如说app正常访问Internet相当于穿过一扇门,但我们系统设定app必须穿过两道门才能访问Internet,然后malware执行的时候不知道,就无法产生恶意行为。类似于一种变相的防火墙吧。
 
SmartProxy: Secure Smartphone-Assisted Login on Compromised Machines
就是让smartphone变成一个硬件防火墙。 电脑连接smartphone用手机的3G上网或者电脑的网络先经过smartphone,然后再上网。这个让我想到了Ubuntu出的那个smartphone版的ubuntu系统,以后办公室只有个显示器键盘鼠标就够了,然后大家都用自己手机当主机用。
 
BISSAM: Automatic Vulnerability Identification of Office Documents
这个是讲一个自动漏洞检测系统来找word, excel啥的office文件的一些漏洞。
 
Self-organized Collaboration of Distributed IDS Sensors
听了一天已经听晕了,梦游中……
 
Shedding Light on Log Correlation in Network Forensics Analysis
大概是在snort基础上搞了个log的规范,然后可以对茫茫多的log用decision tree或者SVM (各种data mining)进行分类,就可以让随后的入侵检测分析变得很简洁方便有效率。
 
OK,终于结束了。同时宣布了下一次DIMVA13的举办时间和地点:2013年7月在德国柏林.

Android上的点击劫持rootkit原型

北卡大学蒋旭宪教授团队开发了一个Android上的点击劫持型rootkit原型。从新闻和视频来看,这个rootkit可以做到:

1. 隐藏,使已经安装的软件在桌面、launcher和系统设置中消失,但实际上依然存在于手机系统中并能正常运行,恶意代码可以利用这个技术隐藏自身;

2. 劫持,使桌面或launcher中的图标被用户点击后,实际执行其他的恶意应用软件,后者可以伪装成前者,实现进一步的攻击。

新闻地址是:

http://web.ncsu.edu/abstract/technology/wms-jiang-clickjack/

视频演示位于:

http://www.youtube.com/watch?v=RxpMPrqnxC0

个人猜测攻击的是系统中intent-filter相关的数据库。但视频是在官方ROM中实现的,也就是说没有获得root权限就做到了攻击,所以应该不是直接修改数据库。

PiOS阅读笔记

SecLab的PiOS: Detecting Privacy Leaks in iOS Applications是目前iOS上仅有的几篇高质量论文之一。花了一整天的时间阅读,记一点笔记。

目的

检测iOS软件是否存在用户隐私泄漏。

方法

1. 对二进制文件,构造类层次结构,生成CFG

2. 从隐私数据源到隐私数据泄漏点的执行路径中,检查是否存在与用户的交互

3. 分析数据流,判断隐私数据是否真的从源转移到泄漏点

主要困难

1. Objective-C是OO语言,绝大部分的调用都是成员函数,并且调用并不使用虚函数表,而是通过消息传递(objc_msgSend)。实际调用了哪个函数,是一个动态判断的过程。

2. 分析数据流时,Cocoa这个框架也需要考虑进去

实现

一、CFG

完全用IDA Python插件的形式来做,使用IDA Pro的反汇编结果。

1. 从mach-o文件头部抽出__objc_classlist节,找出其中的所有类信息,得到类继承层次关系,此外还从节中得到每个类实现的方法和变量。

2. 解析方法调用,即从obj_msgSend还原出实际会调用的类和方法。为了确定R0和R1,采用backward slicing,即回溯相关寄存器的操作直到一个静态值,然后再操作会到调用点判断调用时的值。此外,对动态生成的值,只考虑其对象类型,不考虑实际的值。

二、找出可能的隐私泄漏

1. 找出隐私数据源和泄漏点的API,并通过CFG找出代码路径

2.数据流分析,基本是污点分析的思路

结果

1. objc_msgSend的解析成功了82%,经验上看这个数据比较真实

2. 观察到很多软件里都使用了相同的广告库代码,并且这些代码中普遍存在泄漏设备ID(UDID)的情况,这一点与后来Android上很像。此外又发现统计和跟踪用户行为的库。一共有55%的软件存在这些第三方库,因此建立白名单,避免重复分析。

3. 在205个软件的CFG中找到代码路径,在其中172个中自动找出数据路径。剩下33个中,6个确实不存在,有27个是误报,存在数据路径但没能检测出。

4. 找到的绝大部分是设备ID的,其次是地理位置的(这两类中,Cydia软件居然少于官方软件)。另外有5个泄漏通讯录、1个泄漏手机号、1个泄漏Safari历史记录和照片。

局限

1. objc_msgSend不一定能完整解析出调用

2. 从id关联到类型的问题

iOS5下手工解密应用软件

按以往资料解密iOS5应用软件会遇到两个问题:

  1. nm出来的符号里,没有start了,因此不知道在哪里下断点,即便下到常规的0x2000处,也会断不下来;
  2. 找到合适的断点后,gdb只要run就出现奇怪的错误,还是断不下来。

下面以Douban.fm.ipa的解密为例,解决这两个问题,为了保持完整性,从头开始说明步骤。注意有的指令在Mac上运行,也有的指令在iOS上运行,根据命令提示符区分。在iOS上的默认路径是/var/mobile/Applications/79A81359-AD9D-4268-91FC-93D1E77F5208/Douban.fm.app/。
Continue reading