Category Archives: 计算机

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

安装AndBug

安装文档的不足往往让一些好的项目无法被普及使用,比如androguard,比如andbug。

AndBug有效的安装步骤大致如下:

1. 安装Android SDK并更新,确保将其platform-tools目录添加到PATH环境变量,即在命令行用which adb可以找到

2. 安装python-dev和python-pyrex两个库,例如在ubuntu下,用sudo apt-get install python-dev python-pyrex即可

3. 安装python的一个名为bottle的库,如果没有安装,无法使用navi这个最重要的功能。安装方法是,到这里:

http://pypi.python.org/pypi/bottle

下载最新的bottle库,解压缩后,sudo python setup.py install即可

4. 下载AndBug: git clone https://github.com/swdunlop/AndBug.git

5. 在AndBug目录下,make。如果连make和gcc都找不到,请确认自己安装了build-essential(在Ubuntu下)或者Xcode的command line tools(Mac OS X下)

6. make成功后,在~/.bashrc或者~/.bash_profile里加上一行export PYTHONPATH=$PYTHONPATH:/lib,然后重启终端

7. 现在可以开始使用andbug了。

使用官方的安装文档,主要问题可能出在两个地方,一是没装python-dev导致make不成功,二是没装bottle导致navi无法启动。而这里的方法在Ubuntu 12.04以及Mac OS X里都已经测试没有问题。

Oakland’12

写下这个标题的时候比较心虚,因为我并没有去这个刚刚结束的会议。

anyway,papers和slides公布出来了,可以一饱眼福了。

papers: Google “site: www.ieee-security.org/TC/SP2012/”

slides: www.ieee-security.org/TC/SP2012/program.html

两个熟悉的团队,NCSU的Jiang,PKU的Wang,又一次分别发了论文。Jiang的这篇有些让人失望,我以为会是一个android malware’s meta-data platform for further researching,结果主要贡献是开放了样本集,以及分析了去年的趋势。

ReDeBug项目在更大的代码库中寻找重复代码导致的漏洞,依然有非常多实质性的漏洞报告产出。这一次是语言无关的,还没有细看他们是怎么做到的。我好奇的是,在漏洞有效性上,如何高效率地验证?

最佳论文和最佳学生论文都落到了移动安全上。这也是大势所趋。不知道移动安全还能火多少年,无论如何,现在正是黄金时期。

Prudent Practices for Designing Malware Experiments则是我认为这次最有意思的论文。最近几年,经常看到这种大牛在顶级会议上就研究方法的一些基本问题进行探讨和否定的。这种基本都很好玩,还有的会很卖萌……至于这篇,先读完正文再评价。

x32 ABI

kernel 3.4发布了,其中一个更新是加入对x32 ABI的支持。

与此前曾介绍的armel与armhf关系一样,x32并不是intel处理器的一种新架构,而是在intel 64位处理器上(也许将来也会用到ARM上?)的一种二进制程序调用规范。它的主要想法是:

在64位处理器上,所有的指针自然也应该是64位的,但很多应用程序在运行时并不需要超过4GB的内存,因此64位的指针是浪费的。这些浪费体现在程序大小上、程序运行后可执行代码占用的内存上,当然这些都是相对来说不必考虑的,但从CPU cache的角度考虑,64位的指针和32位的指针,对本来容量就很小的cache就意义重大了。从逻辑上,32位指针应该可以让cache缓存更多内容,并且在一致性维护上的开销更小。

但如果在64位CPU上纯粹地以兼容模式跑32位程序,又无法充分利用64位CPU的一些特性,例如更大的寄存器、更快的函数参数传递、更快的浮点运算、更快的syscall等。

因此,出现了x32这种折中。与armhf类似,它的改动也很简单:在x64 ABI基础上,将指针全部改为32位。

一份性能测试结果如下(完整介绍在这里):

On Core i7 2600K 3.40GHz:
Improved SPEC CPU 2K/2006 INT geomean by 7-10% over ia32 and 5-8% over Intel64.
Improved SPEC CPU 2K/2006 FP geomean by 5-11% over ia32.
Very little changes in SPEC CPU 2K/2006 FP geomean, comparing against Intel64.
Comparing against ia32 PIC, x32 PIC:
Improved SPEC CPU 2K INT by another 10%.
Improved SPEC CPU 2K FP by another 3%.
Improved SPEC CPU 2006 INT by another 6%
Improved SPEC CPU 2006 FP by another 2%.

作为一种独立于编译工具和应用程序的通用优化方法,这种改进的效果可以说是非常显著而有价值的。

虽然说起来简单,但实际要做的工作并不少。因为这两种调用约定在二进制级别并不能兼容,从armel到armhf迁移的经验来看,需要的工作应该是:开发工具链、内核支持和迁移、公用代码库迁移、常用软件迁移等。这一次kernel的更新,应该是指第二步已经完成了。

linux社区在armhf和x32这两种新的ABI上的动作,给我两种感觉:从小的来说,随着编译优化的不断前进,以往忽略的ABI可能是性能的瓶颈,在这方面是否还有进一步修改优化的余地?从大的看,ABI这种已经形成实施标准的东西,居然也是可以迁移和并存的,考虑另一些领域,例如网络、例如总线,在广泛应用的事实标准存在的情况下,有没有可能出现新的更优方案?以往总认为代价太大而不值得,但现在这两件事提供了参考。