Android / IOS 复合型安全攻防教程

职场   2024-08-23 00:00   河南  

移动互联网主流的网络通信方式面临诸多风险:

 算法破解、协议破解、中间人攻击…… 

攻击者利用多种攻击方式,不断对移动应用发起攻击。

在移动应用未做有效保护措施的情况下,如果加密 Key、通信协议、核心算法等被破解,会就会导致核心业务逻辑和重要接口暴露,*轻则影响正常使用体验,重则发生数据泄漏或财产损失*

因此, 通信加密  是一套保障移动应用通信数据机密性的专业解决方案。

------

一、 通信加密流程

通信加密是对网络传输的消息体整体进行加密,移动客户端将要发送至服务端的消息整体进行加密,服务端接收到消息后进行解密。

同理,服务端发送至移动客户端的消息也需整体进行加密,移动客户端对接收到消息进行解密。通信加密示例流程如图 1 所示。

 1 通信加密示例流程

通过整体加密客户端和服务端通信消息,可防止客户端与服务端的通信内容不被篡改和伪造,也在一定程度上防御了中间人攻击。

二、密钥协商算法

实施通信加密,最核心的是选用哪种类型的加密算法。目前常用的加密算法分类可以分为 对称加密  非对称加密 

不过,对称加密算法相比于非对称加密算法来说,加解密的效率要高得多。而客户端与服务端通信对效率要求比较高,需要选用对称加密作为加密算法。

为了保证加密算法的安全,使用 ECDH 密钥协商算法生成密钥,防范将密钥预埋到客户端上或通过网络传输时的潜在安全风险。

ECDH 密钥协商算法虽然解决了密钥存储和传输的安全问题,但是该算法本身是无法抵抗中间人攻击的。如果密钥协商过程中被中间人攻击,就会导致生成的密钥不可信。

为了解决该问题,便有了升级版的密钥协商算法 ECDHE。它可在密钥协商时使用非对称 ECDSA 签名算法对服务端的公钥进行签名。客户端进行验签操作可有效防御中间人攻击。

HTTPS 的握手过程就是使用的 ECDHE 算法,客户端与服务端的密钥协商流程如图 2 所示。

 2 客户端与服务端的密钥协商流程

ECDHE 是基于椭圆曲线的密钥交换算法,可以利用 OpenSSL 库中封装的椭圆曲线算法实现我们自己的密钥协商。

三、密钥生成

密钥协商中最重要的是生成用于协商的公私钥对,生成公私钥的参考示例代码如下:

int generate_key(unsigned char **prikey, unsigned char **pubkey){
EC_KEY *ec_key;
int ret;
int prikey_len;
int pubkey_len;
ret = init_key(&ec_key);
prikey_len = i2d_ECPrivateKey(ec_key, NULL);
if(0 != prikey_len){
*prikey = calloc(prikey_len + 1, sizeof(char));
int ret = i2d_ECPrivateKey(ec_key, prikey);
if(0 == ret){
EC_KEY_free(ec_key);
return ret;
}
}
pubkey_len = i2o_ECPublicKey(ec_key, NULL);
if(0 != pubkey_len){
*pubkey = calloc(pubkey_len + 1, sizeof(char));
ret = i2o_ECPublicKey(ec_key, pubkey);
if(0 == ret){
EC_KEY_free(ec_key);
return ret;
}
}
}

四、 密钥交换

生成公私钥后就要进行另一个环节——密钥交换。只要我们确保 交换过程中的任何一方公钥不被劫持替换 就能保证不被中间人攻击。

对服务端下发到客户端的公钥使用非对称的 ECDSA 算法进行签名,客户端使用预埋的公钥进行验签,具体校验流程如图 3 所示。

图 3 客户端校验流程

密钥协商过程中客户端校验签名的示例代码如下:

int ecdsa_verify(unsigned char *server_pubkey, unsigned char *server_pubkey_sign, EC_KEY *ecdsa_pubkey) {
ECDSA_SIG* ecdsa_sign = d2i_ECDSA_SIG(NULL, (const unsigned char **)&server_pubkey_sign, strlen(server_pubkey_sign));
if(ecdsa_sign == NULL){
return -1;
}
ret = ECDSA_do_verify(server_pubkey, strlen((const char *)server_pubkey), ecdsa_sign, ecdsa_pubkey);
if(1 != ret) {
ECDSA_SIG_free(ecdsa_sign);
return -1;
}
ECDSA_SIG_free(ecdsa_sign);
return 1;
}

密钥协商中最重要的一步就是 户端和服务端各自用自己的私钥及接收的对方公钥计算出通信加密时所用的密钥**。核心示例代码如下:

unsigned char* generate_secret_key(unsigned char *server_pubkey, unsigned char *client_prikey){
EC_KEY* ec_prikey = d2i_ECPrivateKey(NULL, (const unsigned char **)&client_prikey, strlen(client_prikey));
if(ec_key_pri == NULL){
return NULL;
}
EC_KEY* ec_pubkey = o2i_ECPublicKey(ec_pubkey, (const unsigned char **)&server_pubkey, strlen(server_pubkey));
if(ec_pubkey == NULL){
return NULL;
}
EC_POINT* ec_point = (EC_POINT *)EC_KEY_get0_public_key(ec_pubkey);
if(ec_point == NULL){
return NULL;
}
unsigned char *secret_key = OPENSSL_malloc(48);
int ret = ECDH_compute_key(secret_key, 48, ec_point, ec_prikey, NULL);
if(ret < 0) {
free(secret_key);
EC_KEY_free(ec_pubkey);
EC_KEY_free(ec_prikey);
return NULL;
}
EC_KEY_free(ec_pubkey);
EC_KEY_free(ec_prikey);
return secret_key;
}

五、密钥存储

使用的密钥协商算法生成密钥后,就涉及另一个问题:**生成的密钥要怎么存储**

在其生成后对密钥进行简单的移位变形处理存储在应用的数据目录中即可。因通过密钥协商方式生成出密钥各用户是独立的。每个用户都拥有自己唯一的密钥,即使泄漏也不会影响其他用户,相对于所有用户使用同一密钥的安全性要高。

通信加密使用的加密算法为 AES,加密模式为 CBC。选用该模式是其破解难度高,同时符合 SSL/TLSIPSec 标准。

协商得到的密钥可以通过一系列的字符串变换,得到 AES 加密算法可直接使用的 key  iv,此处就不做过多介绍。AES 算法就使用 OpenSSL 库封装即可,示例代码如下:

}

char* aes_decrypt(unsigned char *ciphertext, unsigned char *key, unsigned char *iv) {
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
char* plaintext = calloc(strlen(ciphertext) + 1, sizeof(char));
int len;
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv)) {
return NULL;
}

if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, strlen(ciphertext))) {
return NULL;
}


if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) {
return NULL;
}

EVP_CIPHER_CTX_free(ctx);
return plaintext;
}

密钥协商成功后,客户端与服务端通信数据全为密文数据,加密后的通信数据示例如图 4 所示。

 4 加密后的通信数据示例

通信数据全部为密文,即使攻击者成功绕过了客户端的防抓包策略,抓取到客户端与服务端的通信数据,也无法对其正常进行分析。

这样,攻击者就无法通过通信数据中的关键字段快速定位到客户端中相应的功能代码,从而在一定程度上提高客户端安全防护水平。

更多移动安全干货,扫码阅读↓↓↓

本文摘编于《App安全实战指南:AndroidiOS App的安全攻防与合规》(书号:9787111757825),转载请保留文章来源。

内容简介

内容简介:

本书覆盖Android和iOS两大主流系统,从零开始,带领读者全面掌握App安全的知识与技能。全书共分为十章,主要包括以下4个方面:
1.详细介绍App的运行机制、分析工具和汇编语言等基础知识。帮助读者掌握必要的技术原理和分析技能。
2.主要讲解App的常见攻击方式,以及安全加固和通信安全等传统的信息安全理念。为开发者提供有效的防御攻击的方法,构建更加安全的移动应用。
3.重点关注业务防控,包括设备指纹、设备环境检测和用户异常行为的识别等。帮助开发者识别并应对各种潜在的安全威胁。
4.针对日益严格的App监管环境,根据《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》及相关标准,结合实操,探讨如何实现App合规。
总之,通过学习本书,读者不仅能够深入了解App安全的基础知识与高级技术,还能获得丰富的实战经验和实用的防护策略。



作者简介

作者简介:

安亚龙,现任好未来集团应用安全负责人,曾担任陌陌的移动安全负责人等。10余年深耕App安全,精通App攻防、业务风控、隐私合规、逆向工程和病毒分析等领域。在与黑灰产的长期对抗过程中,主导开发了具备真机识别、环境分析、通信加密等功能的SDK,现在超亿级客户端上稳定运行,为用户和企业提供坚实的安全保障。



目  录
前 言
第1章 移动应用安全基础 1
1.1 移动应用的签名 1
1.1.1 Android签名机制和原理 1
1.1.2 iOS签名机制和原理 7
1.2 移动应用的安装 11
1.2.1 Android应用安装 11
1.2.2 iOS应用安装 13
1.3 移动应用的权限 14
1.3.1 Android应用的权限 14
1.3.2 iOS应用的权限 16
1.4 移动应用的运行 17
1.4.1 Android应用的运行 17
1.4.2 iOS应用的运行 20
第2章 应用分析基础 23
2.1 常用工具 23
2.1.1 越狱版商店Cydia 23
2.1.2 Root工具Magisk 25
2.1.3 Hook框架EdXposed 27
2.1.4 Hook框架Frida 35
2.1.5 Hook工具Objection 40
2.1.6 Hook工具Tweak 43
2.1.7 安全测试工具Drozer 47
2.2 常用命令行工具 49
2.2.1 ADB 49
2.2.2 readelf 53
2.2.3 Apktool 55
2.2.4 Clutch 55
2.2.5 Class-dump 57
2.3 Android应用分析 58
2.4 iOS应用分析 62
第3章 汇编基础 65
3.1 Smali汇编基础 65
3.1.1 基本类型 65
3.1.2 寄存器 66
3.1.3 基础指令 67
3.1.4 语法修饰符 70
3.1.5 函数调用 72
3.1.6 函数返回值 74
3.2 ARM汇编基础 75
3.2.1 寄存器 75
3.2.2 基础指令 78
3.2.3 函数调用 81
3.2.4 ARM64位汇编 84
第4章 常见的攻击方式 86
4.1 重签名攻击 86
4.1.1 Android应用重签名 86
4.1.2 iOS应用重签名 90
4.2 动态注入与Hook操作 92
4.2.1 Android动态注入 93
4.2.2 iOS动态注入 94
4.2.3 Android Hook攻击 97
4.2.4 iOS Hook攻击 100
4.3 动态调试 105
4.3.1 Android动态调试 105
4.3.2 iOS动态调试 111
4.4 Scheme攻击 114
4.5 WebView攻击 116
第5章 客户端安全加固 120
5.1 Java/Kotlin代码保护 120
5.2 C/C++代码保护 122
5.2.1 代码混淆保护 122
5.2.2 文件加壳保护 125
5.3 签名校验 126
5.3.1 Android签名校验 126
5.3.2 iOS签名校验 128
5.4 SO文件保护 129
5.5 应用防调试 132
5.5.1 Android应用防调试 132
5.5.2 iOS应用防调试 134
5.6 完整性校验 137
5.6.1 Android应用完整性校验 137
5.6.2 iOS应用完整性校验 138
5.7 防动态注入与防Hook 138
5.7.1 Android应用防动态注入与防Hook 139
5.7.2 iOS应用防动态注入与防Hook 140
5.8 Scheme防护 142
5.9 WebView防护 143
第6章 网络通信安全 145
6.1 通信防抓包 145
6.1.1 代理检测 145
6.1.2 代理对抗 146
6.1.3 证书校验 146
6.2 数据防篡改 150
6.2.1 请求参数防篡改 150
6.2.2 请求数据防重放 151
6.3 通信数据加密 152
第7章 设备指纹 158
7.1 设备指纹系统 158
7.2 设备数据采集 159
7.3 设备指纹生成 164
7.4 设备指纹隐藏 165
7.5 设备指纹应用 166
第8章 风险环境检测 169
8.1 模拟器检测 169
8.2 设备Root/越狱检测 171
8.2.1 Android Root检测 172
8.2.2 iOS越狱检测 174
8.3 函数Hook检测 175
8.3.1 Java Hook检测 175
8.3.2 GOT Hook检测 177
8.3.3 Inline Hook检测 180
8.3.4 Swizzle Hook检测 183
8.3.5 Fishhook检测 185
8.3.6 Substrate Hook检测 186
8.4 设备状态检测 187
8.4.1 调试状态检测 187
8.4.2 VPN状态检测  188
8.4.3 代理状态检测 189
8.4.4 USB调试状态检测 190
8.4.5 充电状态检测 191
第9章 异常用户识别 192
9.1 位置篡改识别 192
9.2 设备篡改识别 193
9.3 注册异常识别 194
9.4 登录异常识别 197
9.5 协议破解识别 198
9.6 批量控制识别 199
第10章 隐私合规 202
10.1 应用上架合规 202
10.1.1 软件著作权申请 202
10.1.2 ICP备案/ICP许可证 204
10.1.3 App备案 206
10.1.4 安全评估 208
10.1.5 CCRC认证 211
10.1.6 算法备案 217
10.2 合规实践指南 217
10.2.1 隐私政策 217
10.2.2 权限申请 220
10.2.3 个人信息收集 221
10.2.4 “双清单”与权限说明 223
10.2.5 个性化推荐与定向推送 226
10.2.6 自启动与关联启动 227
10.2.7 广告展示 229
10.3 违规整改规范 231
10.3.1 工信部 231
10.3.2 省通信管理局 233
10.3.3 网信办 236
10.3.4 教育部 238



Web安全工具库
将一些好用的红队工具、蓝队工具及自己的学习笔记分享给大家。。。
 最新文章