JADX AI MCP

一键分析Android APK漏洞

https://mp.weixin.qq.com/s/igi_gsSCpcZlATmRjHXF9A?scene=1&click_id=4

全自动 MCP 服务器 + JADX 插件,通过 MCP 与 LLM 通信,使用 Claude 等 LLM 分析 Android APK — 轻松发现漏洞、分析 APK 和进行逆向工程。

1.安装Jadx插件

1
jadx plugins --install "github:zinja-coder:jadx-ai-mcp"       //命令行安装

图形化安装

img

安装完成后要保证插件是Enable状态,默认占用本地8650端口

img

img

img

2.配置虚拟环境

1
irm https://astral.sh/uv/install.ps1 | iex

img

1
uv venv                   //创建虚拟环境

img

1
uv pip install httpx fastmcp                 //安装所需依赖

img

1
uv run jadx_mcp_server.py       检查是否能正常调用MCP服务

3.配置MCP环境

使用Cursor或者Trae的MCP功能配置

1
pip install ida-pro-mcp

img

创建自定义MCP,将以下Json复制到mcp.json文件中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
  "mcpServers": {
    "github.com/nrexodia/ida-pro-mcp": {
      "command": "python",
      "args": ["-m", "ida_pro_mcp"],
      "timeout": 1800,
      "disabled": false   
    },
    "jadx-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "D:\\Tools\\Android\\JADX-AI-MCP\\jadx-mcp-server",
        "run",
        "jadx_mcp_server.py"
      ],
      "disabled": false
    }
  }
}

配置完成后,打开你要分析的文件,调用自己的MCP完成分析

img

1
使用JADX MCP分析下我现在打开的类是干什么的

img

1
2
3
4
5
使用JADX MCP快速分析android的mainfest文件并且分析可能存在的漏洞
此方法中是否存在不安全的 API 使用?”
请检查此类中是否硬编码了密钥或凭证。”
此方法在使用用户输入前是否进行了安全过滤或转义?”
这段代码可能引入哪些安全漏洞?”

4.APP客户端案例测试

4.1.APP通信安全模块测试案例

1
2
3
4
5
6
使用JADX MCP快速帮我完成APP通信安全模块分析测试项有
1. 使用ALLOW_ALL_HOSTNAME_VERIFIER忽略SSL证书域名验证 
2.自定义HostnameVerfier忽略SSL证书域名验证
3. 自定义X509TrustManager未正确校验SSL证书链
5. WebClient忽略SSL证书校验异常
6. 证书明文存储并输出报告

img

输出报告如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
# Android应用通信安全模块分析报告

## 1. 应用基本信息

| 项目 | 内容 |
|------|------|
| 包名 | cn.xxx.app |
| 版本 | 1.5.2 |
| minSdkVersion | 21 |
| targetSdkVersion | 30 |
| 使用明文通信 |  (android:usesCleartextTraffic="true") |

## 2. 测试项分析结果

### 2.1 使用ALLOW_ALL_HOSTNAME_VERIFIER忽略SSL证书域名验证

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: `com.loopj.android.http.MySSLSocketFactory` 

**问题描述**:  `getFixedSocketFactory()` 方法中使用了 `SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER` 来忽略SSL证书的域名验证

```java
public static SSLSocketFactory getFixedSocketFactory() {
    try {
        MySSLSocketFactory mySSLSocketFactory = new MySSLSocketFactory(getKeystore());
        mySSLSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        return mySSLSocketFactory;
    } catch (Throwable th) {
        th.printStackTrace();
        return SSLSocketFactory.getSocketFactory();
    }
}
```

**安全隐患**: 这种设置会允许应用与任何域名的服务器建立SSL连接即使证书的域名与服务器域名不匹配这使得应用容易受到中间人攻击

### 2.2 自定义HostnameVerfier忽略SSL证书域名验证

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: `cn.xxx.app.service.DownloadFileTask` 

**问题描述**: 定义了一个名为 `DO_NOT_VERIFY` 的自定义HostnameVerifier该验证器总是返回 `true`,完全忽略了SSL证书的域名验证

```java
static final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};
```

并在HTTPS连接时使用

```java
HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);
```

**安全隐患**: 这种设置会允许应用与任何域名的服务器建立SSL连接即使证书的域名与服务器域名不匹配这使得应用容易受到中间人攻击

### 2.3 自定义X509TrustManager未正确校验SSL证书链

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: 
1. `com.loopj.android.http.MySSLSocketFactory` 
2. `cn.xxx.app.service.DownloadFileTask` 

**问题描述**: 在两个类中都定义了空实现的X509TrustManager完全忽略了SSL证书链的验证

```java
// MySSLSocketFactory类中的实现
new X509TrustManager() {
    @Override
    public void checkClientTrusted(X509Certificate[] x509CertificateArr, String str) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] x509CertificateArr, String str) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}
```

```java
// DownloadFileTask类中的实现
new X509TrustManager() {
    @Override
    public void checkClientTrusted(X509Certificate[] certs, String authType) {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] certs, String authType) {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}
```

**安全隐患**: 这种设置会允许应用与任何服务器建立SSL连接即使服务器提供的证书无效或不受信任这使得应用容易受到中间人攻击和证书欺骗攻击

### 2.4 WebClient忽略SSL证书校验异常

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: `cn.xxx.app.activity.WapActivity` 

**问题描述**:  `MyWebViewClient` 类的 `onReceivedSslError` 方法中直接调用了 `handler.proceed()` 来忽略所有SSL错误

```java
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed();
}
```

**安全隐患**: 这种设置会允许WebView加载任何SSL证书有问题的网页包括证书过期域名不匹配自签名证书等这使得应用容易受到中间人攻击

### 2.5 证书明文存储

**测试结果**: 未发现明显问题

**分析**: 未在代码中发现直接的证书明文存储问题应用使用了默认的KeyStore机制来管理证书但未发现将证书以明文形式存储在文件或SharedPreferences中的情况

## 3. 其他安全问题

### 3.1 允许明文通信

**问题描述**: 在AndroidManifest.xml中应用设置了 `android:usesCleartextTraffic="true"`,允许应用使用明文HTTP通信

**风险等级**: 

**安全隐患**: 明文通信会导致数据在传输过程中容易被窃听和篡改特别是涉及用户敏感信息的通信

## 4. 修复建议

### 4.1 修复ALLOW_ALL_HOSTNAME_VERIFIER问题

**修复建议**: 移除 `ALLOW_ALL_HOSTNAME_VERIFIER` 的使用使用默认的主机名验证器或自定义严格的验证器

**修复代码示例**:

```java
public static SSLSocketFactory getFixedSocketFactory() {
    try {
        MySSLSocketFactory mySSLSocketFactory = new MySSLSocketFactory(getKeystore());
        // 使用默认的主机名验证器
        // mySSLSocketFactory.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        // 或者使用自定义严格的验证器
        mySSLSocketFactory.setHostnameVerifier(new StrictHostnameVerifier());
        return mySSLSocketFactory;
    } catch (Throwable th) {
        th.printStackTrace();
        return SSLSocketFactory.getSocketFactory();
    }
}
```

### 4.2 修复自定义HostnameVerifier问题

**修复建议**: 移除自定义的 `DO_NOT_VERIFY` 主机名验证器使用默认的主机名验证器或自定义严格的验证器

**修复代码示例**:

```java
// 移除DO_NOT_VERIFY的定义
// static final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {...};

// 在HTTPS连接时使用默认的主机名验证器
// HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);
// 或者使用自定义严格的验证器
HttpsURLConnection.setDefaultHostnameVerifier(new StrictHostnameVerifier());
```

### 4.3 修复自定义X509TrustManager问题

**修复建议**: 移除空实现的X509TrustManager使用默认的TrustManager或自定义严格的TrustManager

**修复代码示例**:

```java
// 移除自定义的空实现X509TrustManager
// TrustManager[] trustManagerArr = {new X509TrustManager() {...}};

// 使用默认的TrustManager
TrustManager[] trustManagerArr = null;
```

### 4.4 修复WebView忽略SSL错误问题

**修复建议**:  `onReceivedSslError` 方法中不要直接调用 `handler.proceed()`,而是根据错误类型进行适当处理或者提示用户证书有问题

**修复代码示例**:

```java
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    // 记录错误信息
    Log.e("WebView SSL Error", "SSL error: " + error.toString());
    
    // 显示SSL错误警告对话框
    AlertDialog.Builder builder = new AlertDialog.Builder(WapActivity.this);
    builder.setTitle("SSL Certificate Error");
    builder.setMessage("The certificate provided by this website is not trusted. Proceed at your own risk.");
    builder.setPositiveButton("Continue", (dialog, which) -> handler.proceed());
    builder.setNegativeButton("Cancel", (dialog, which) -> handler.cancel());
    builder.create().show();
}
```

### 4.5 修复明文通信问题

**修复建议**: 在AndroidManifest.xml中 `android:usesCleartextTraffic` 设置为 `false`,并配置网络安全配置文件来管理例外情况

**修复代码示例**:

```xml
<!-- AndroidManifest.xml -->
<application
    ...
    android:usesCleartextTraffic="false"
    android:networkSecurityConfig="@xml/network_security_config"
    ...>
    ...
</application>
```

```xml
<!-- res/xml/network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 允许特定域名使用明文通信 -->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">example.com</domain>
    </domain-config>
    <!-- 默认禁止明文通信 -->
    <base-config cleartextTrafficPermitted="false"/>
</network-security-config>
```

## 5. 总结

本应用在通信安全方面存在多个严重问题主要包括

1. 使用ALLOW_ALL_HOSTNAME_VERIFIER忽略SSL证书域名验证
2. 自定义HostnameVerifier忽略SSL证书域名验证
3. 自定义X509TrustManager未正确校验SSL证书链
4. WebView忽略SSL证书校验异常
5. 允许明文通信

这些问题会使应用容易受到中间人攻击证书欺骗攻击等安全威胁建议尽快修复

## 6. 修复优先级

| 问题 | 优先级 |
|------|--------|
| 使用ALLOW_ALL_HOSTNAME_VERIFIER |  |
| 自定义HostnameVerifier忽略SSL验证 |  |
| 自定义X509TrustManager未正确校验证书链 |  |
| WebView忽略SSL错误 |  |
| 允许明文通信 |  |

4.2.APP应用开发规范模块测试案例

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
使用JADX MCP快速帮我完成APP应用开发规范模块分析测试项有
1. 调试日志代码未处理
2. 备份开关未关闭
3. URL硬编码
4. 测试信息泄露token|password|passwd|pwd|secret|key|api_key|access_key|private_key|cert|身份证|手机号|身份证号|idcard|phone|mobile|auth|credential|signature
5. 未使用编译器堆栈保护技术
# APP应用开发规范模块分析报告

## 1. 应用基本信息

| 项目 | 内容 |
|------|------|
| 包名 | cn.xxx.app |
| 版本 | 1.5.2 |
| minSdkVersion | 21 |
| targetSdkVersion | 30 |
| buildType | release |
| debuggable | false |

## 2. 测试项分析结果

### 2.1 调试日志代码未处理

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: `cn.xxx.app.utils.Loger` 

**问题描述**: 应用实现了一个自定义日志工具类 `Loger`,其中定义了一个静态 `DEBUG` 变量用于控制日志输出但该变量当前被硬编码为 `true`:

```java
public static boolean DEBUG = true;
```

虽然该工具类封装了 `Log.d`、`Log.v`、`Log.i`、`Log.w`、`Log.e` 等日志方法并通过 `DEBUG` 变量控制日志输出但未实现根据构建类型自动切换 `DEBUG` 值的机制在发布版本中这些调试日志可能会被保留从而暴露应用内部信息

### 2.2 备份开关未关闭

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: `AndroidManifest.xml` 文件

**问题描述**:  `AndroidManifest.xml` 文件中应用的 `application` 标签中设置了 `android:allowBackup="true"`:

```xml
<application
    ...
    android:allowBackup="true"
    ...>
    ...
</application>
```

允许备份会导致应用数据可以被导出可能包含敏感信息如用户数据设置等从而增加数据泄露的风险

### 2.3 URL硬编码

**测试结果**: 发现问题

**风险等级**: 

**代码位置**: `cn.xxx.app.service.ServiceUrl` 

**问题描述**: 应用将所有API URL硬编码在 `ServiceUrl` 类中定义为静态常量

```java
public static final String ADD_COLLECT = "https://api.xxx.com/v1/collect/add";
public static final String USER_LOGIN = "https://api.xxx.com/v1/user/login";
public static final String PAY_ENTITY4 = "http://mall.xxx.com/mobile/PaymentApp/getCode";
// 等等其他API URL
```

这种做法存在以下问题
1. 难以维护如果需要更换API服务器需要修改大量代码
2. 安全风险URL直接暴露在代码中容易被反向工程获取
3. 灵活性差无法在运行时根据环境切换不同的API地址

### 2.4 测试信息泄露

**测试结果**: 发现严重问题

**风险等级**: 

**代码位置**: 
1. `cn.xxx.app.manager.LoginManager` 
2. `cn.xxx.app.cache.UserInfoCache` 
3. `cn.xxx.app.cache.ObjectCache` 

**问题描述**: 应用存在多处敏感信息泄露风险

1. **密码明文存储** `LoginManager` 类的 `login` 方法中将用户名和密码明文存储到 `SharedPreferences` 
   ```java
   mApp.getConfig().setString("name", name);
   mApp.getConfig().setString(AppConfig.CONFIG_PASS, pass);
   ```

2. **用户信息明文存储**:`UserInfoCache` 类通过 `ObjectCache` 类将用户信息包括token手机号等序列化为JSON并存储在外部存储中未进行任何加密处理
   ```java
   public boolean setUserInfo(UserInfo userInfo) {
       return setObject("userinfo", userInfo);
   }
   ```

3. **ObjectCache未加密**:`ObjectCache` 类直接将对象序列化为JSON并存储在文件中
   ```java
   public <T> boolean setObject(String key, T object) {
       try {
           String json = this.mGson.toJson(object);
           FileHelper.writeFile(this.mContext.getExternalFilesDir(null).getPath() + File.separator + key + ".json", json);
           return true;
       } catch (Exception e) {
           e.printStackTrace();
           return false;
       }
   }
   ```

### 2.5 未使用编译器堆栈保护技术

**测试结果**: 发现问题

**风险等级**: 

**问题描述**: 应用未使用编译器堆栈保护技术如Stack Canaries)。在Android应用开发中尤其是使用NDK/C++这些技术可以有效防止缓冲区溢出攻击

## 3. 修复建议

### 3.1 调试日志代码未处理

**修复建议**: 根据构建类型自动切换DEBUG值

**修复代码示例**: 

```java
// 使用BuildConfig.DEBUG替代硬编码的true
public static boolean DEBUG = BuildConfig.DEBUG;
```

### 3.2 备份开关未关闭

**修复建议**: 在AndroidManifest.xml中关闭备份开关

**修复代码示例**: 

```xml
<application
    ...
    android:allowBackup="false"
    android:fullBackupContent="@xml/backup_rules"
    ...>
    ...
</application>
```

### 3.3 URL硬编码

**修复建议**: 
1. 使用配置文件或资源文件存储URL
2. 实现根据环境切换URL的机制

**修复代码示例**: 

```java
// 使用BuildConfig读取URL
public static final String BASE_URL = BuildConfig.BASE_URL;
public static final String USER_LOGIN = BASE_URL + "/v1/user/login";
```

### 3.4 测试信息泄露

**修复建议**: 
1. 不要在SharedPreferences中存储密码
2. 对敏感信息进行加密存储
3. 使用Android Keystore系统存储密钥

**修复代码示例**: 

```java
// 移除密码存储
// mApp.getConfig().setString(AppConfig.CONFIG_PASS, pass);

// 对用户信息进行加密存储
public <T> boolean setObject(String key, T object) {
    try {
        String json = this.mGson.toJson(object);
        String encryptedJson = encrypt(json);
        FileHelper.writeFile(this.mContext.getExternalFilesDir(null).getPath() + File.separator + key + ".json", encryptedJson);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}
```

### 3.5 未使用编译器堆栈保护技术

**修复建议**: 在NDK构建配置中启用Stack Canaries

**修复代码示例**: 

```gradle
// 在build.gradle中添加以下配置
externalNativeBuild {
    cmake {
        cppFlags "-fstack-protector-strong"
    }
}
```

## 4. 总结

本应用在开发规范方面存在多处问题主要包括调试日志未处理备份开关未关闭URL硬编码测试信息泄露和未使用编译器堆栈保护技术等这些问题可能导致应用安全性降低维护成本增加和用户数据泄露等风险

建议按照上述修复建议对应用进行修改以提高应用的安全性和稳定性
By Lsec
最后更新于 Dec 30, 2025 15:52 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ