react-native-device-defense 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -19
- package/android/build.gradle +2 -2
- package/android/src/main/cpp/device-security.cpp +281 -7
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/DebugDetection.kt +1 -1
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/DeviceSecurityModule.kt +127 -3
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/DeviceSecurityPackage.kt +1 -1
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/EmulatorDetection.kt +30 -19
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/HookDetection.kt +1 -1
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/NativeSecurityCheck.kt +44 -2
- package/android/src/main/java/{vn/osp/security → com/devicedefense}/RootDetection.kt +1 -1
- package/android/test-gradle.gradle +3 -0
- package/lib/commonjs/NativeDeviceSecurity.js.map +1 -1
- package/lib/commonjs/api.js +137 -2
- package/lib/commonjs/api.js.map +1 -1
- package/lib/commonjs/components/SecurityBlockedScreen.js +12 -2
- package/lib/commonjs/components/SecurityBlockedScreen.js.map +1 -1
- package/lib/commonjs/hooks/useDeviceSecurity.js +13 -7
- package/lib/commonjs/hooks/useDeviceSecurity.js.map +1 -1
- package/lib/module/NativeDeviceSecurity.js.map +1 -1
- package/lib/module/api.js +137 -2
- package/lib/module/api.js.map +1 -1
- package/lib/module/components/SecurityBlockedScreen.js +12 -2
- package/lib/module/components/SecurityBlockedScreen.js.map +1 -1
- package/lib/module/hooks/useDeviceSecurity.js +14 -8
- package/lib/module/hooks/useDeviceSecurity.js.map +1 -1
- package/lib/typescript/NativeDeviceSecurity.d.ts +7 -0
- package/lib/typescript/NativeDeviceSecurity.d.ts.map +1 -1
- package/lib/typescript/api.d.ts +29 -1
- package/lib/typescript/api.d.ts.map +1 -1
- package/lib/typescript/components/SecurityBlockedScreen.d.ts.map +1 -1
- package/lib/typescript/hooks/useDeviceSecurity.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +30 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/react-native-device-security.podspec +4 -4
- package/src/NativeDeviceSecurity.ts +9 -0
- package/src/api.ts +143 -0
- package/src/components/SecurityBlockedScreen.tsx +10 -0
- package/src/hooks/useDeviceSecurity.ts +14 -11
- package/src/types.ts +36 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package
|
|
1
|
+
package com.devicedefense
|
|
2
2
|
|
|
3
3
|
import android.util.Log
|
|
4
4
|
import com.facebook.react.bridge.*
|
|
@@ -133,6 +133,107 @@ class DeviceSecurityModule(reactContext: ReactApplicationContext) :
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
// ===== SSL Security Methods =====
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Check if SSL validation has been bypassed
|
|
140
|
+
*/
|
|
141
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
142
|
+
fun hasSSLValidationBypass(): Boolean {
|
|
143
|
+
return try {
|
|
144
|
+
NativeSecurityCheck.hasSSLValidationBypass()
|
|
145
|
+
} catch (e: Exception) {
|
|
146
|
+
Log.e(NAME, "Error checking SSL validation bypass", e)
|
|
147
|
+
false
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Check if SSL pinning bypass tools are present
|
|
153
|
+
*/
|
|
154
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
155
|
+
fun hasSSLPinningBypass(): Boolean {
|
|
156
|
+
return try {
|
|
157
|
+
NativeSecurityCheck.hasSSLPinningBypass()
|
|
158
|
+
} catch (e: Exception) {
|
|
159
|
+
Log.e(NAME, "Error checking SSL pinning bypass", e)
|
|
160
|
+
false
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Check if proxy is configured (potential MITM)
|
|
166
|
+
*/
|
|
167
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
168
|
+
fun hasProxyConfiguration(): Boolean {
|
|
169
|
+
return try {
|
|
170
|
+
NativeSecurityCheck.hasProxyConfiguration()
|
|
171
|
+
} catch (e: Exception) {
|
|
172
|
+
Log.e(NAME, "Error checking proxy configuration", e)
|
|
173
|
+
false
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Check if SSL libraries have been modified
|
|
179
|
+
*/
|
|
180
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
181
|
+
fun hasModifiedSSLLibraries(): Boolean {
|
|
182
|
+
return try {
|
|
183
|
+
NativeSecurityCheck.hasModifiedSSLLibraries()
|
|
184
|
+
} catch (e: Exception) {
|
|
185
|
+
Log.e(NAME, "Error checking modified SSL libraries", e)
|
|
186
|
+
false
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Check if certificates have been tampered with
|
|
192
|
+
*/
|
|
193
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
194
|
+
fun hasCertificateTampering(): Boolean {
|
|
195
|
+
return try {
|
|
196
|
+
NativeSecurityCheck.hasCertificateTampering()
|
|
197
|
+
} catch (e: Exception) {
|
|
198
|
+
Log.e(NAME, "Error checking certificate tampering", e)
|
|
199
|
+
false
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Comprehensive SSL security check
|
|
205
|
+
*/
|
|
206
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
207
|
+
fun hasSSLSecurityIssue(): Boolean {
|
|
208
|
+
return try {
|
|
209
|
+
NativeSecurityCheck.hasSSLSecurityIssue()
|
|
210
|
+
} catch (e: Exception) {
|
|
211
|
+
Log.e(NAME, "Error checking SSL security", e)
|
|
212
|
+
false
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Get detailed SSL security status
|
|
218
|
+
*/
|
|
219
|
+
@ReactMethod
|
|
220
|
+
fun getSSLSecurityStatus(promise: Promise) {
|
|
221
|
+
try {
|
|
222
|
+
val sslStatus = JSONObject().apply {
|
|
223
|
+
put("hasSSLValidationBypass", NativeSecurityCheck.hasSSLValidationBypass())
|
|
224
|
+
put("hasSSLPinningBypass", NativeSecurityCheck.hasSSLPinningBypass())
|
|
225
|
+
put("hasProxyConfiguration", NativeSecurityCheck.hasProxyConfiguration())
|
|
226
|
+
put("hasModifiedSSLLibraries", NativeSecurityCheck.hasModifiedSSLLibraries())
|
|
227
|
+
put("hasCertificateTampering", NativeSecurityCheck.hasCertificateTampering())
|
|
228
|
+
put("hasSSLSecurityIssue", NativeSecurityCheck.hasSSLSecurityIssue())
|
|
229
|
+
}
|
|
230
|
+
promise.resolve(sslStatus.toString())
|
|
231
|
+
} catch (e: Exception) {
|
|
232
|
+
Log.e(NAME, "Error getting SSL security status", e)
|
|
233
|
+
promise.reject("SSL_STATUS_ERROR", e.message)
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
136
237
|
/**
|
|
137
238
|
* Get comprehensive security status
|
|
138
239
|
*/
|
|
@@ -146,6 +247,13 @@ class DeviceSecurityModule(reactContext: ReactApplicationContext) :
|
|
|
146
247
|
val isDebuggable = debugDetection.isDebuggable()
|
|
147
248
|
val isEmulator = emulatorDetection.isEmulator()
|
|
148
249
|
|
|
250
|
+
// SSL security checks
|
|
251
|
+
val hasSSLValidationBypass = NativeSecurityCheck.hasSSLValidationBypass()
|
|
252
|
+
val hasSSLPinningBypass = NativeSecurityCheck.hasSSLPinningBypass()
|
|
253
|
+
val hasProxyConfiguration = NativeSecurityCheck.hasProxyConfiguration()
|
|
254
|
+
val hasModifiedSSLLibraries = NativeSecurityCheck.hasModifiedSSLLibraries()
|
|
255
|
+
val hasCertificateTampering = NativeSecurityCheck.hasCertificateTampering()
|
|
256
|
+
|
|
149
257
|
val threats = mutableListOf<String>()
|
|
150
258
|
|
|
151
259
|
if (rootResult.isRooted) {
|
|
@@ -161,6 +269,11 @@ class DeviceSecurityModule(reactContext: ReactApplicationContext) :
|
|
|
161
269
|
if (hasMagisk) threats.add("magisk_detected")
|
|
162
270
|
if (isDebuggable) threats.add("debugger_detected")
|
|
163
271
|
if (isEmulator) threats.add("emulator_detected")
|
|
272
|
+
if (hasSSLValidationBypass) threats.add("ssl_validation_bypass")
|
|
273
|
+
if (hasSSLPinningBypass) threats.add("ssl_pinning_bypass")
|
|
274
|
+
if (hasProxyConfiguration) threats.add("proxy_configuration")
|
|
275
|
+
if (hasModifiedSSLLibraries) threats.add("modified_ssl_libraries")
|
|
276
|
+
if (hasCertificateTampering) threats.add("certificate_tampering")
|
|
164
277
|
|
|
165
278
|
val securityStatus = JSONObject().apply {
|
|
166
279
|
put("isSecure", threats.isEmpty())
|
|
@@ -176,6 +289,14 @@ class DeviceSecurityModule(reactContext: ReactApplicationContext) :
|
|
|
176
289
|
put("hasMagisk", hasMagisk)
|
|
177
290
|
put("isDebuggable", isDebuggable)
|
|
178
291
|
put("isEmulator", isEmulator)
|
|
292
|
+
// SSL security fields
|
|
293
|
+
put("hasSSLValidationBypass", hasSSLValidationBypass)
|
|
294
|
+
put("hasSSLPinningBypass", hasSSLPinningBypass)
|
|
295
|
+
put("hasProxyConfiguration", hasProxyConfiguration)
|
|
296
|
+
put("hasModifiedSSLLibraries", hasModifiedSSLLibraries)
|
|
297
|
+
put("hasCertificateTampering", hasCertificateTampering)
|
|
298
|
+
put("hasSSLSecurityIssue", hasSSLValidationBypass || hasSSLPinningBypass ||
|
|
299
|
+
hasProxyConfiguration || hasModifiedSSLLibraries || hasCertificateTampering)
|
|
179
300
|
put("details", JSONObject().apply {
|
|
180
301
|
put("emulatorType", emulatorDetection.getEmulatorType())
|
|
181
302
|
val nativeLibLoaded = try {
|
|
@@ -206,7 +327,8 @@ class DeviceSecurityModule(reactContext: ReactApplicationContext) :
|
|
|
206
327
|
!hookDetection.hasXposed() &&
|
|
207
328
|
!hookDetection.hasMagisk() &&
|
|
208
329
|
!debugDetection.isDebuggable() &&
|
|
209
|
-
!emulatorDetection.isEmulator()
|
|
330
|
+
!emulatorDetection.isEmulator() &&
|
|
331
|
+
!NativeSecurityCheck.hasSSLSecurityIssue()
|
|
210
332
|
|
|
211
333
|
promise.resolve(isSecure)
|
|
212
334
|
} catch (e: Exception) {
|
|
@@ -233,13 +355,15 @@ class DeviceSecurityModule(reactContext: ReactApplicationContext) :
|
|
|
233
355
|
val hasMagisk = hookDetection.hasMagisk()
|
|
234
356
|
val isDebuggable = debugDetection.isDebuggable()
|
|
235
357
|
val isEmulator = emulatorDetection.isEmulator()
|
|
358
|
+
val hasSSLIssue = NativeSecurityCheck.hasSSLSecurityIssue()
|
|
236
359
|
|
|
237
360
|
val hasThreat = rootResult.isRooted ||
|
|
238
361
|
hasFrida ||
|
|
239
362
|
hasXposed ||
|
|
240
363
|
hasMagisk ||
|
|
241
364
|
isDebuggable ||
|
|
242
|
-
isEmulator
|
|
365
|
+
isEmulator ||
|
|
366
|
+
hasSSLIssue
|
|
243
367
|
|
|
244
368
|
if (hasThreat) {
|
|
245
369
|
Log.w(NAME, "Security threat detected, blocking app")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package
|
|
1
|
+
package com.devicedefense
|
|
2
2
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import android.content.pm.PackageManager
|
|
@@ -19,8 +19,7 @@ class EmulatorDetection(private val context: Context) {
|
|
|
19
19
|
checkEmulatorBuildProps() ||
|
|
20
20
|
checkEmulatorFiles() ||
|
|
21
21
|
checkEmulatorFeatures() ||
|
|
22
|
-
checkNetworkInterfaces()
|
|
23
|
-
checkCamera()
|
|
22
|
+
checkNetworkInterfaces()
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
/**
|
|
@@ -117,25 +116,37 @@ class EmulatorDetection(private val context: Context) {
|
|
|
117
116
|
* Check for emulator features
|
|
118
117
|
*/
|
|
119
118
|
private fun checkEmulatorFeatures(): Boolean {
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
try {
|
|
120
|
+
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
|
|
121
|
+
?: return false
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
// Check for invalid network operator (only check for known emulator fake values, not null/empty which happens on tablets)
|
|
124
|
+
val networkOperator = telephonyManager.networkOperator
|
|
125
|
+
if (networkOperator == "000000000000000") {
|
|
126
|
+
return true
|
|
127
|
+
}
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
// Check for invalid subscriber ID (requires READ_PHONE_STATE, might throw SecurityException)
|
|
130
|
+
try {
|
|
131
|
+
val subscriberId = telephonyManager.subscriberId
|
|
132
|
+
if (subscriberId == "000000000000000") {
|
|
133
|
+
return true
|
|
134
|
+
}
|
|
135
|
+
} catch (e: SecurityException) {
|
|
136
|
+
// Ignore if permission denied
|
|
137
|
+
}
|
|
134
138
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
+
// Check for invalid IMEI/MEID (requires READ_PHONE_STATE)
|
|
140
|
+
try {
|
|
141
|
+
val deviceId = telephonyManager.deviceId
|
|
142
|
+
if (deviceId == "000000000000000" || deviceId == "0") {
|
|
143
|
+
return true
|
|
144
|
+
}
|
|
145
|
+
} catch (e: SecurityException) {
|
|
146
|
+
// Ignore if permission denied
|
|
147
|
+
}
|
|
148
|
+
} catch (e: Exception) {
|
|
149
|
+
// Ignore other telephony errors
|
|
139
150
|
}
|
|
140
151
|
|
|
141
152
|
return false
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package
|
|
1
|
+
package com.devicedefense
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Native (JNI) security checks
|
|
@@ -45,9 +45,51 @@ object NativeSecurityCheck {
|
|
|
45
45
|
*/
|
|
46
46
|
external fun isDebuggerAttached(): Boolean
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Native check for SSL validation bypass
|
|
50
|
+
* Checks if SSL certificate validation has been bypassed
|
|
51
|
+
* @return true if SSL validation is bypassed
|
|
52
|
+
*/
|
|
53
|
+
external fun hasSSLValidationBypass(): Boolean
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Native check for SSL pinning bypass tools
|
|
57
|
+
* Checks for common SSL pinning bypass frameworks and tools
|
|
58
|
+
* @return true if SSL pinning bypass detected
|
|
59
|
+
*/
|
|
60
|
+
external fun hasSSLPinningBypass(): Boolean
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Native check for proxy configuration
|
|
64
|
+
* Checks if HTTP/HTTPS proxy is configured (potential MITM)
|
|
65
|
+
* @return true if proxy is configured
|
|
66
|
+
*/
|
|
67
|
+
external fun hasProxyConfiguration(): Boolean
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Native check for modified SSL libraries
|
|
71
|
+
* Checks if SSL libraries are from unexpected locations
|
|
72
|
+
* @return true if modified SSL libraries detected
|
|
73
|
+
*/
|
|
74
|
+
external fun hasModifiedSSLLibraries(): Boolean
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Native check for certificate tampering
|
|
78
|
+
* Checks for excessive user-installed CA certificates
|
|
79
|
+
* @return true if certificate tampering detected
|
|
80
|
+
*/
|
|
81
|
+
external fun hasCertificateTampering(): Boolean
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Native comprehensive SSL security check
|
|
85
|
+
* Checks all SSL security aspects
|
|
86
|
+
* @return true if any SSL security issue detected
|
|
87
|
+
*/
|
|
88
|
+
external fun hasSSLSecurityIssue(): Boolean
|
|
89
|
+
|
|
48
90
|
/**
|
|
49
91
|
* Get native security status as JSON string
|
|
50
|
-
* @return JSON string with security status
|
|
92
|
+
* @return JSON string with security status including SSL checks
|
|
51
93
|
*/
|
|
52
94
|
external fun getSecurityStatus(): String
|
|
53
95
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeDeviceSecurity.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeDeviceSecurity.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAwCpCC,gCAAmB,CAACC,YAAY,CAAO,gBAAgB,CAAC","ignoreList":[]}
|
package/lib/commonjs/api.js
CHANGED
|
@@ -51,7 +51,13 @@ class DeviceSecurity {
|
|
|
51
51
|
hasXposed: false,
|
|
52
52
|
hasMagisk: false,
|
|
53
53
|
isDebuggable: false,
|
|
54
|
-
isEmulator: false
|
|
54
|
+
isEmulator: false,
|
|
55
|
+
hasSSLValidationBypass: false,
|
|
56
|
+
hasSSLPinningBypass: false,
|
|
57
|
+
hasProxyConfiguration: false,
|
|
58
|
+
hasModifiedSSLLibraries: false,
|
|
59
|
+
hasCertificateTampering: false,
|
|
60
|
+
hasSSLSecurityIssue: false
|
|
55
61
|
};
|
|
56
62
|
}
|
|
57
63
|
try {
|
|
@@ -63,6 +69,37 @@ class DeviceSecurity {
|
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Get detailed SSL security status
|
|
74
|
+
*/
|
|
75
|
+
async getSSLSecurityStatus() {
|
|
76
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
77
|
+
// iOS: no-op for now, return secure status
|
|
78
|
+
return {
|
|
79
|
+
hasSSLValidationBypass: false,
|
|
80
|
+
hasSSLPinningBypass: false,
|
|
81
|
+
hasProxyConfiguration: false,
|
|
82
|
+
hasModifiedSSLLibraries: false,
|
|
83
|
+
hasCertificateTampering: false,
|
|
84
|
+
hasSSLSecurityIssue: false
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const statusJson = await _NativeDeviceSecurity.default.getSSLSecurityStatus();
|
|
89
|
+
return JSON.parse(statusJson);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.error('DeviceSecurity: Error getting SSL security status', error);
|
|
92
|
+
return {
|
|
93
|
+
hasSSLValidationBypass: false,
|
|
94
|
+
hasSSLPinningBypass: false,
|
|
95
|
+
hasProxyConfiguration: false,
|
|
96
|
+
hasModifiedSSLLibraries: false,
|
|
97
|
+
hasCertificateTampering: false,
|
|
98
|
+
hasSSLSecurityIssue: false
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
66
103
|
/**
|
|
67
104
|
* Check if device is rooted (synchronous, Android only)
|
|
68
105
|
*/
|
|
@@ -153,6 +190,98 @@ class DeviceSecurity {
|
|
|
153
190
|
}
|
|
154
191
|
}
|
|
155
192
|
|
|
193
|
+
// ===== SSL Security Methods =====
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Check if SSL validation has been bypassed
|
|
197
|
+
*/
|
|
198
|
+
hasSSLValidationBypass() {
|
|
199
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
return _NativeDeviceSecurity.default.hasSSLValidationBypass();
|
|
204
|
+
} catch (error) {
|
|
205
|
+
console.error('DeviceSecurity: Error checking SSL validation bypass', error);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Check if SSL pinning bypass tools are present
|
|
212
|
+
*/
|
|
213
|
+
hasSSLPinningBypass() {
|
|
214
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
return _NativeDeviceSecurity.default.hasSSLPinningBypass();
|
|
219
|
+
} catch (error) {
|
|
220
|
+
console.error('DeviceSecurity: Error checking SSL pinning bypass', error);
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Check if proxy is configured (potential MITM)
|
|
227
|
+
*/
|
|
228
|
+
hasProxyConfiguration() {
|
|
229
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
return _NativeDeviceSecurity.default.hasProxyConfiguration();
|
|
234
|
+
} catch (error) {
|
|
235
|
+
console.error('DeviceSecurity: Error checking proxy configuration', error);
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Check if SSL libraries have been modified
|
|
242
|
+
*/
|
|
243
|
+
hasModifiedSSLLibraries() {
|
|
244
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
return _NativeDeviceSecurity.default.hasModifiedSSLLibraries();
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error('DeviceSecurity: Error checking modified SSL libraries', error);
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Check if certificates have been tampered with
|
|
257
|
+
*/
|
|
258
|
+
hasCertificateTampering() {
|
|
259
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
return _NativeDeviceSecurity.default.hasCertificateTampering();
|
|
264
|
+
} catch (error) {
|
|
265
|
+
console.error('DeviceSecurity: Error checking certificate tampering', error);
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Comprehensive SSL security check
|
|
272
|
+
*/
|
|
273
|
+
hasSSLSecurityIssue() {
|
|
274
|
+
if (_reactNative.Platform.OS !== 'android') {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
return _NativeDeviceSecurity.default.hasSSLSecurityIssue();
|
|
279
|
+
} catch (error) {
|
|
280
|
+
console.error('DeviceSecurity: Error checking SSL security', error);
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
156
285
|
/**
|
|
157
286
|
* Block app when security threat detected
|
|
158
287
|
* This will show an alert and potentially exit the app
|
|
@@ -201,7 +330,13 @@ class DeviceSecurity {
|
|
|
201
330
|
hasXposed: false,
|
|
202
331
|
hasMagisk: false,
|
|
203
332
|
isDebuggable: false,
|
|
204
|
-
isEmulator: false
|
|
333
|
+
isEmulator: false,
|
|
334
|
+
hasSSLValidationBypass: false,
|
|
335
|
+
hasSSLPinningBypass: false,
|
|
336
|
+
hasProxyConfiguration: false,
|
|
337
|
+
hasModifiedSSLLibraries: false,
|
|
338
|
+
hasCertificateTampering: false,
|
|
339
|
+
hasSSLSecurityIssue: false
|
|
205
340
|
};
|
|
206
341
|
}
|
|
207
342
|
}
|
package/lib/commonjs/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_NativeDeviceSecurity","_interopRequireDefault","e","__esModule","default","DeviceSecurity","isDeviceSecure","Platform","OS","NativeDeviceSecurity","error","console","getSecurityStatus","isSecure","threats","isRooted","hasRootBeerDetected","hasNativeRootDetected","hasDangerousBins","hasRootApps","hasSystemPropsModified","hasFrida","hasXposed","hasMagisk","isDebuggable","isEmulator","statusJson","JSON","parse","getDefaultSecurityStatus","blockOnSecurityThreat","options","showAlert","alertTitle","alertMessage","alertButtonText","onBlocked","then","status","exports","deviceSecurityInstance","_default"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":";;;;;;AAKA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA0D,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAN1D;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_NativeDeviceSecurity","_interopRequireDefault","e","__esModule","default","DeviceSecurity","isDeviceSecure","Platform","OS","NativeDeviceSecurity","error","console","getSecurityStatus","isSecure","threats","isRooted","hasRootBeerDetected","hasNativeRootDetected","hasDangerousBins","hasRootApps","hasSystemPropsModified","hasFrida","hasXposed","hasMagisk","isDebuggable","isEmulator","hasSSLValidationBypass","hasSSLPinningBypass","hasProxyConfiguration","hasModifiedSSLLibraries","hasCertificateTampering","hasSSLSecurityIssue","statusJson","JSON","parse","getDefaultSecurityStatus","getSSLSecurityStatus","blockOnSecurityThreat","options","showAlert","alertTitle","alertMessage","alertButtonText","onBlocked","then","status","exports","deviceSecurityInstance","_default"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -24,7 +24,12 @@ const THREAT_TITLES = {
|
|
|
24
24
|
xposed_detected: 'Phát hiện Xposed Framework',
|
|
25
25
|
magisk_detected: 'Phát hiện Magisk',
|
|
26
26
|
debugger_detected: 'Phát hiện Debugger',
|
|
27
|
-
emulator_detected: 'Phát hiện Bộ giả lập'
|
|
27
|
+
emulator_detected: 'Phát hiện Bộ giả lập',
|
|
28
|
+
ssl_validation_bypass: 'SSL Validation bị bypass',
|
|
29
|
+
ssl_pinning_bypass: 'SSL Pinning bị bypass',
|
|
30
|
+
proxy_configuration: 'Phát hiện Proxy (MITM)',
|
|
31
|
+
modified_ssl_libraries: 'SSL Library đã sửa đổi',
|
|
32
|
+
certificate_tampering: 'Certificate bị can thiệp'
|
|
28
33
|
};
|
|
29
34
|
const THREAT_DESCRIPTIONS = {
|
|
30
35
|
root_detected: 'Thiết bị của bạn đã được root, làm giảm tính bảo mật của ứng dụng.',
|
|
@@ -37,7 +42,12 @@ const THREAT_DESCRIPTIONS = {
|
|
|
37
42
|
xposed_detected: 'Phát hiện Xposed Framework - có thể can thiệp vào ứng dụng.',
|
|
38
43
|
magisk_detected: 'Phát hiện Magisk - công cụ root ẩn danh.',
|
|
39
44
|
debugger_detected: 'Phát hiện debugger đang gắn vào ứng dụng.',
|
|
40
|
-
emulator_detected: 'Ứng dụng đang chạy trên bộ giả lập, không an toàn cho môi trường production.'
|
|
45
|
+
emulator_detected: 'Ứng dụng đang chạy trên bộ giả lập, không an toàn cho môi trường production.',
|
|
46
|
+
ssl_validation_bypass: 'SSL certificate validation đã bị bypass, kết nối có thể không an toàn.',
|
|
47
|
+
ssl_pinning_bypass: 'Phát hiện công cụ SSL pinning bypass (Frida, Xposed...) - tấn công MITM có thể xảy ra.',
|
|
48
|
+
proxy_configuration: 'Phát hiện cấu hình proxy - có thể là dấu hiệu của tấn công MITM.',
|
|
49
|
+
modified_ssl_libraries: 'SSL libraries đã bị sửa đổi - có thể dẫn đến kết nối không an toàn.',
|
|
50
|
+
certificate_tampering: 'Phát hiện certificate đã bị can thiệp - kết nối có thể bị theo dõi.'
|
|
41
51
|
};
|
|
42
52
|
|
|
43
53
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","e","__esModule","default","THREAT_TITLES","root_detected","root_beer_detected","native_root_detected","dangerous_bins_detected","root_apps_detected","system_props_modified","frida_detected","xposed_detected","magisk_detected","debugger_detected","emulator_detected","THREAT_DESCRIPTIONS","SecurityBlockedScreen","threats","title","message","icon","createElement","SafeAreaView","style","styles","container","ScrollView","contentContainerStyle","scrollContent","bounces","View","iconContainer","Text","length","Fragment","threatsTitle","threatsList","map","threat","key","threatItem","bullet","threatContent","threatTitle","threatDescription","footer","footerText","exports","StyleSheet","create","flex","backgroundColor","padding","alignItems","width","height","borderRadius","justifyContent","marginBottom","fontSize","fontWeight","color","textAlign","lineHeight","alignSelf","flexDirection","borderLeftWidth","borderLeftColor","marginTop","marginRight","paddingTop","borderTopWidth","borderTopColor","_default"],"sourceRoot":"../../../src","sources":["components/SecurityBlockedScreen.tsx"],"mappings":";;;;;;AAMA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAOsB,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAdtB;AACA;AACA;AACA;AACA;;AAwBA,MAAMG,aAA6C,GAAG;EACpDC,aAAa,EAAE,kBAAkB;EACjCC,kBAAkB,EAAE,2BAA2B;EAC/CC,oBAAoB,EAAE,yBAAyB;EAC/CC,uBAAuB,EAAE,4BAA4B;EACrDC,kBAAkB,EAAE,yBAAyB;EAC7CC,qBAAqB,EAAE,gCAAgC;EACvDC,cAAc,EAAE,2BAA2B;EAC3CC,eAAe,EAAE,4BAA4B;EAC7CC,eAAe,EAAE,kBAAkB;EACnCC,iBAAiB,EAAE,oBAAoB;EACvCC,iBAAiB,EAAE;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","e","__esModule","default","THREAT_TITLES","root_detected","root_beer_detected","native_root_detected","dangerous_bins_detected","root_apps_detected","system_props_modified","frida_detected","xposed_detected","magisk_detected","debugger_detected","emulator_detected","ssl_validation_bypass","ssl_pinning_bypass","proxy_configuration","modified_ssl_libraries","certificate_tampering","THREAT_DESCRIPTIONS","SecurityBlockedScreen","threats","title","message","icon","createElement","SafeAreaView","style","styles","container","ScrollView","contentContainerStyle","scrollContent","bounces","View","iconContainer","Text","length","Fragment","threatsTitle","threatsList","map","threat","key","threatItem","bullet","threatContent","threatTitle","threatDescription","footer","footerText","exports","StyleSheet","create","flex","backgroundColor","padding","alignItems","width","height","borderRadius","justifyContent","marginBottom","fontSize","fontWeight","color","textAlign","lineHeight","alignSelf","flexDirection","borderLeftWidth","borderLeftColor","marginTop","marginRight","paddingTop","borderTopWidth","borderTopColor","_default"],"sourceRoot":"../../../src","sources":["components/SecurityBlockedScreen.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,15 +15,18 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
15
15
|
|
|
16
16
|
function useDeviceSecurity(options = {}) {
|
|
17
17
|
const {
|
|
18
|
-
onSecurityThreat,
|
|
19
|
-
blockOnThreat = false,
|
|
20
|
-
blockOptions,
|
|
21
18
|
checkInterval = 0
|
|
22
19
|
} = options;
|
|
23
20
|
const [isSecure, setIsSecure] = (0, _react.useState)(null);
|
|
24
21
|
const [isLoading, setIsLoading] = (0, _react.useState)(true);
|
|
25
22
|
const [securityStatus, setSecurityStatus] = (0, _react.useState)(null);
|
|
26
23
|
const [error, setError] = (0, _react.useState)(null);
|
|
24
|
+
|
|
25
|
+
// Use refs for options to avoid infinite loops when inline objects/functions are passed
|
|
26
|
+
const optionsRef = (0, _react.useRef)(options);
|
|
27
|
+
(0, _react.useEffect)(() => {
|
|
28
|
+
optionsRef.current = options;
|
|
29
|
+
}, [options]);
|
|
27
30
|
const checkSecurity = (0, _react.useCallback)(async () => {
|
|
28
31
|
if (_reactNative.Platform.OS !== 'android') {
|
|
29
32
|
setIsSecure(true);
|
|
@@ -39,14 +42,17 @@ function useDeviceSecurity(options = {}) {
|
|
|
39
42
|
|
|
40
43
|
// Handle security threats
|
|
41
44
|
if (!status.isSecure) {
|
|
45
|
+
const currentOptions = optionsRef.current;
|
|
46
|
+
|
|
42
47
|
// Call callback for each threat
|
|
43
48
|
for (const threat of status.threats) {
|
|
44
|
-
|
|
49
|
+
var _currentOptions$onSec;
|
|
50
|
+
(_currentOptions$onSec = currentOptions.onSecurityThreat) === null || _currentOptions$onSec === void 0 || _currentOptions$onSec.call(currentOptions, threat, status);
|
|
45
51
|
}
|
|
46
52
|
|
|
47
53
|
// Block if requested
|
|
48
|
-
if (blockOnThreat) {
|
|
49
|
-
_api.default.blockOnSecurityThreat(blockOptions);
|
|
54
|
+
if (currentOptions.blockOnThreat) {
|
|
55
|
+
_api.default.blockOnSecurityThreat(currentOptions.blockOptions);
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
} catch (err) {
|
|
@@ -56,7 +62,7 @@ function useDeviceSecurity(options = {}) {
|
|
|
56
62
|
} finally {
|
|
57
63
|
setIsLoading(false);
|
|
58
64
|
}
|
|
59
|
-
}, [
|
|
65
|
+
}, []);
|
|
60
66
|
const recheck = (0, _react.useCallback)(async () => {
|
|
61
67
|
await checkSecurity();
|
|
62
68
|
}, [checkSecurity]);
|