- 前两天公司给了一份应用安全的测评报告,报告显示iOS这边安全测评得分是60(满分100),报告出的蛮详细,列出了危险等级,危害及 建议解决的方法。经评估我暂做了代码混淆和动态调式攻击风险。
代码混淆
一、危害
- 针对 iOS 应用开发使用的 Object-c 及 C,C++代码目前较缺乏有效的防护手段, 苹果的 app 自身并没有比 android 更安全的防范措施,也无法通过常规的二 次加固保护应用不被反编译和篡改,应用代码编写过程中出现的安全漏洞、 编码隐患、甚至业务逻辑上的缺陷很容易被分析暴露,造成程序业务逻辑泄 露、加解密算法失效、通信加密失效,攻击者可以利用这些信息窃取客户端 的敏感数据,包括账号、密码;绕过业务安全认证流程,直接篡改用户账号 信息;对服务器接口发起攻击等。iOS 的代码混淆,是通过将 Object- C、C/C++代码中的方法名、变量名、类名、包名等这些元素名称改成毫无关 联且无意义的名字,对源代码实现逻辑分支混淆和控制流平坦化,隐藏关键逻 辑,提高黑客破解难度,增加破解时间成本。
二、建议解决方案
- 开发者使用头文件映射的方式定义 pch 文件,并在定义的 pch 文件中引入头 文件,在头文件中定义方法混淆的隐射,防止代码语义化的定义暴露程序意 图,同时编译生成新的发布包
三、实际解决方案
1、cd 项目路径
2.touch confuse.sh
(此文件中添加混淆脚本,脚本在这里)
3、touch func.list
(此文件中手动添加想要混淆的方法,也可参考这篇文章里的脚本进行全局混淆)
4、分别 mv confuse.sh 和 func.list 到自己的项目目录下
如:mv confuse.sh 项目路径
5、设置run script
如下图
6、在PCH文件中添加 #import "codeObfuscation.h"
7、编译
8、如果需要demo的话,这里有一个不是我写的
demo
四、以上操作流程各位开发者总结了很多,我在这里主要说一下自己遇到的坑:
-
最深的坑就是路径问题,在念茜的博客里看到的是用
mv
命令来移动,在其他博客中大都记录的是Add Files...
来移动到项目目录下,我用Add Files...
之后就出现了报错,提示找不到路径,尝试了各种相对路径和绝对路径后无果,而后用终端mv
命令后就一路畅通了,如果你有同样的问题,建议用mv
命令试试。 -
如果没有自动生成
codeObfuscation.h
文件可手动创建,但是注意#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h
和脚本中的echo '#ifndef Demo_codeObfuscation_h
相对应。 -
编译后报错
Shell Script Invocation Error
错误,可在终端执行chmod -R 777 XXX 命令
, XXX是路径,表示给XXX路径下的所有文件夹和文件都授予读写和可执行权限。 -
在
func.list
文件中添加方法后如果在codeObfuscation.h
没有生成相对应的混淆后的代码,建议关注一下confuse.sh中HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
此处的路径。
五、逆向查看代码是否混淆成功
1、下载class-dump
下载地址
2、将dmg文件里的class-dump复制到“/usr/local/bin/”下,其他的目录好像都没有写入权限了。
3、在终端输入 class-dump查看是否可正确显示版本,如下图
4、将ipa后缀改成zip并解压
5、执行命令 class-dump -H Payload路径/appName.app -o 写入文件路径
6、到这里代码混淆基本上就完成了,可在刚写入的文件中找到混淆方法查看是否是一串乱七八糟的字符。
动态调式攻击风险
一、危害
- 在未加入反调试术的 iOS App 中,攻击者使可用
GDB、IDA、Ptrace
等调试 器跟踪运行的目标程序,查看内存中运行的进程状态,获取内存进程中的运 行代码和实时数据,甚至分析篡改程序的业务逻辑,对客户关键数据或者服 务器进行恶意攻击,例如查看客户端业务操作的数据,比如登录账号、密码 等,窃取用户信息;或者通过分析程序运行逻辑,挖掘应用漏洞。
二、建议解决方案
-
在代码中的
main.m
类中增加如下代码,gdb
方式或其他调试工具注入到当前 程序进程,代码如下:void anti_gdb_debug() { void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW); ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace"); ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0); dlclose(handle); }
三、实际解决方案
- 刚好在念茜大佬的博客看到这篇阻止GDB依附的文章,基本上我也就这样了,不得不说大佬就是大佬,一系列安全防攻击总结的全面到位,膜拜。
以上是我在项目中遇到的一些问题,如果能帮到你我很开心,如果没能帮到你,建议多查一点相关的文档,毕竟实际出现的问题也是千奇百怪。
OVER