react-native-device-defense 1.0.1 → 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 +92 -1
- package/android/build.gradle +1 -1
- package/android/src/main/cpp/device-security.cpp +281 -7
- package/android/src/main/java/com/devicedefense/DeviceSecurityModule.kt +126 -2
- package/android/src/main/java/com/devicedefense/EmulatorDetection.kt +29 -18
- package/android/src/main/java/com/devicedefense/NativeSecurityCheck.kt +43 -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 +4 -2
- 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
package/lib/module/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","NativeDeviceSecurity","DeviceSecurity","isDeviceSecure","OS","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","deviceSecurityInstance"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,oBAAoB,MAAM,wBAAwB;
|
|
1
|
+
{"version":3,"names":["Platform","NativeDeviceSecurity","DeviceSecurity","isDeviceSecure","OS","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","deviceSecurityInstance"],"sourceRoot":"../../src","sources":["api.ts"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,QAAQ,cAAc;AACvC,OAAOC,oBAAoB,MAAM,wBAAwB;AAQzD;AACA;AACA;AACA,MAAMC,cAAc,CAAC;EACnB;AACF;AACA;EACE,MAAMC,cAAcA,CAAA,EAAqB;IACvC,IAAIH,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B;MACA,OAAO,IAAI;IACb;IAEA,IAAI;MACF,OAAO,MAAMH,oBAAoB,CAACE,cAAc,CAAC,CAAC;IACpD,CAAC,CAAC,OAAOE,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,gDAAgD,EAAEA,KAAK,CAAC;MACtE,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACE,MAAME,iBAAiBA,CAAA,EAA4B;IACjD,IAAIP,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B;MACA,OAAO;QACLI,QAAQ,EAAE,IAAI;QACdC,OAAO,EAAE,EAAE;QACXC,QAAQ,EAAE,KAAK;QACfC,mBAAmB,EAAE,KAAK;QAC1BC,qBAAqB,EAAE,KAAK;QAC5BC,gBAAgB,EAAE,KAAK;QACvBC,WAAW,EAAE,KAAK;QAClBC,sBAAsB,EAAE,KAAK;QAC7BC,QAAQ,EAAE,KAAK;QACfC,SAAS,EAAE,KAAK;QAChBC,SAAS,EAAE,KAAK;QAChBC,YAAY,EAAE,KAAK;QACnBC,UAAU,EAAE,KAAK;QACjBC,sBAAsB,EAAE,KAAK;QAC7BC,mBAAmB,EAAE,KAAK;QAC1BC,qBAAqB,EAAE,KAAK;QAC5BC,uBAAuB,EAAE,KAAK;QAC9BC,uBAAuB,EAAE,KAAK;QAC9BC,mBAAmB,EAAE;MACvB,CAAC;IACH;IAEA,IAAI;MACF,MAAMC,UAAU,GAAG,MAAM1B,oBAAoB,CAACM,iBAAiB,CAAC,CAAC;MACjE,OAAOqB,IAAI,CAACC,KAAK,CAACF,UAAU,CAAC;IAC/B,CAAC,CAAC,OAAOtB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,+CAA+C,EAAEA,KAAK,CAAC;MACrE,OAAO,IAAI,CAACyB,wBAAwB,CAAC,CAAC;IACxC;EACF;;EAEA;AACF;AACA;EACE,MAAMC,oBAAoBA,CAAA,EAA+B;IACvD,IAAI/B,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B;MACA,OAAO;QACLiB,sBAAsB,EAAE,KAAK;QAC7BC,mBAAmB,EAAE,KAAK;QAC1BC,qBAAqB,EAAE,KAAK;QAC5BC,uBAAuB,EAAE,KAAK;QAC9BC,uBAAuB,EAAE,KAAK;QAC9BC,mBAAmB,EAAE;MACvB,CAAC;IACH;IAEA,IAAI;MACF,MAAMC,UAAU,GAAG,MAAM1B,oBAAoB,CAAC8B,oBAAoB,CAAC,CAAC;MACpE,OAAOH,IAAI,CAACC,KAAK,CAACF,UAAU,CAAC;IAC/B,CAAC,CAAC,OAAOtB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,mDAAmD,EAAEA,KAAK,CAAC;MACzE,OAAO;QACLgB,sBAAsB,EAAE,KAAK;QAC7BC,mBAAmB,EAAE,KAAK;QAC1BC,qBAAqB,EAAE,KAAK;QAC5BC,uBAAuB,EAAE,KAAK;QAC9BC,uBAAuB,EAAE,KAAK;QAC9BC,mBAAmB,EAAE;MACvB,CAAC;IACH;EACF;;EAEA;AACF;AACA;EACEhB,QAAQA,CAAA,EAAY;IAClB,IAAIV,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACS,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,OAAOL,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,4CAA4C,EAAEA,KAAK,CAAC;MAClE,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEW,QAAQA,CAAA,EAAY;IAClB,IAAIhB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACe,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,OAAOX,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,sCAAsC,EAAEA,KAAK,CAAC;MAC5D,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEY,SAASA,CAAA,EAAY;IACnB,IAAIjB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACgB,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,OAAOZ,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,uCAAuC,EAAEA,KAAK,CAAC;MAC7D,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEa,SAASA,CAAA,EAAY;IACnB,IAAIlB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACiB,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,OAAOb,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,uCAAuC,EAAEA,KAAK,CAAC;MAC7D,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEc,YAAYA,CAAA,EAAY;IACtB,IAAInB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACkB,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,OAAOd,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,2CAA2C,EAAEA,KAAK,CAAC;MACjE,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEe,UAAUA,CAAA,EAAY;IACpB,IAAIpB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACmB,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,OAAOf,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yCAAyC,EAAEA,KAAK,CAAC;MAC/D,OAAO,KAAK;IACd;EACF;;EAEA;;EAEA;AACF;AACA;EACEgB,sBAAsBA,CAAA,EAAY;IAChC,IAAIrB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACoB,sBAAsB,CAAC,CAAC;IACtD,CAAC,CAAC,OAAOhB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,sDAAsD,EAAEA,KAAK,CAAC;MAC5E,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEiB,mBAAmBA,CAAA,EAAY;IAC7B,IAAItB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACqB,mBAAmB,CAAC,CAAC;IACnD,CAAC,CAAC,OAAOjB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,mDAAmD,EAAEA,KAAK,CAAC;MACzE,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEkB,qBAAqBA,CAAA,EAAY;IAC/B,IAAIvB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACsB,qBAAqB,CAAC,CAAC;IACrD,CAAC,CAAC,OAAOlB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,oDAAoD,EAAEA,KAAK,CAAC;MAC1E,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEmB,uBAAuBA,CAAA,EAAY;IACjC,IAAIxB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACuB,uBAAuB,CAAC,CAAC;IACvD,CAAC,CAAC,OAAOnB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,uDAAuD,EAAEA,KAAK,CAAC;MAC7E,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEoB,uBAAuBA,CAAA,EAAY;IACjC,IAAIzB,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACwB,uBAAuB,CAAC,CAAC;IACvD,CAAC,CAAC,OAAOpB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,sDAAsD,EAAEA,KAAK,CAAC;MAC5E,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;EACEqB,mBAAmBA,CAAA,EAAY;IAC7B,IAAI1B,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,KAAK;IACd;IAEA,IAAI;MACF,OAAOH,oBAAoB,CAACyB,mBAAmB,CAAC,CAAC;IACnD,CAAC,CAAC,OAAOrB,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,6CAA6C,EAAEA,KAAK,CAAC;MACnE,OAAO,KAAK;IACd;EACF;;EAEA;AACF;AACA;AACA;EACE2B,qBAAqBA,CAACC,OAAqC,GAAG,CAAC,CAAC,EAAQ;IACtE,IAAIjC,QAAQ,CAACI,EAAE,KAAK,SAAS,EAAE;MAC7B;IACF;IAEA,MAAM;MACJ8B,SAAS,GAAG,IAAI;MAChBC,UAAU,GAAG,kBAAkB;MAC/BC,YAAY,GAAG,8EAA8E;MAC7FC,eAAe,GAAG,IAAI;MACtBC;IACF,CAAC,GAAGL,OAAO;IAEX,IAAI;MACFhC,oBAAoB,CAAC+B,qBAAqB,CACxCE,SAAS,EACTC,UAAU,EACVC,YAAY,EACZC,eACF,CAAC;;MAED;MACA,IAAIC,SAAS,EAAE;QACb;QACA,IAAI,CAAC/B,iBAAiB,CAAC,CAAC,CAACgC,IAAI,CAACC,MAAM,IAAI;UACtCF,SAAS,CAACE,MAAM,CAAC;QACnB,CAAC,CAAC;MACJ;IACF,CAAC,CAAC,OAAOnC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,mDAAmD,EAAEA,KAAK,CAAC;IAC3E;EACF;;EAEA;AACF;AACA;EACUyB,wBAAwBA,CAAA,EAAmB;IACjD,OAAO;MACLtB,QAAQ,EAAE,KAAK;MACfC,OAAO,EAAE,CAAC,mBAAmB,CAAC;MAAE;MAChCC,QAAQ,EAAE,KAAK;MACfC,mBAAmB,EAAE,KAAK;MAC1BC,qBAAqB,EAAE,KAAK;MAC5BC,gBAAgB,EAAE,KAAK;MACvBC,WAAW,EAAE,KAAK;MAClBC,sBAAsB,EAAE,KAAK;MAC7BC,QAAQ,EAAE,KAAK;MACfC,SAAS,EAAE,KAAK;MAChBC,SAAS,EAAE,KAAK;MAChBC,YAAY,EAAE,KAAK;MACnBC,UAAU,EAAE,KAAK;MACjBC,sBAAsB,EAAE,KAAK;MAC7BC,mBAAmB,EAAE,KAAK;MAC1BC,qBAAqB,EAAE,KAAK;MAC5BC,uBAAuB,EAAE,KAAK;MAC9BC,uBAAuB,EAAE,KAAK;MAC9BC,mBAAmB,EAAE;IACvB,CAAC;EACH;AACF;;AAEA;AACA,MAAMe,sBAAsB,GAAG,IAAIvC,cAAc,CAAC,CAAC;AACnD,eAAeuC,sBAAsB;AACrC,SAASvC,cAAc","ignoreList":[]}
|
|
@@ -17,7 +17,12 @@ const THREAT_TITLES = {
|
|
|
17
17
|
xposed_detected: 'Phát hiện Xposed Framework',
|
|
18
18
|
magisk_detected: 'Phát hiện Magisk',
|
|
19
19
|
debugger_detected: 'Phát hiện Debugger',
|
|
20
|
-
emulator_detected: 'Phát hiện Bộ giả lập'
|
|
20
|
+
emulator_detected: 'Phát hiện Bộ giả lập',
|
|
21
|
+
ssl_validation_bypass: 'SSL Validation bị bypass',
|
|
22
|
+
ssl_pinning_bypass: 'SSL Pinning bị bypass',
|
|
23
|
+
proxy_configuration: 'Phát hiện Proxy (MITM)',
|
|
24
|
+
modified_ssl_libraries: 'SSL Library đã sửa đổi',
|
|
25
|
+
certificate_tampering: 'Certificate bị can thiệp'
|
|
21
26
|
};
|
|
22
27
|
const THREAT_DESCRIPTIONS = {
|
|
23
28
|
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.',
|
|
@@ -30,7 +35,12 @@ const THREAT_DESCRIPTIONS = {
|
|
|
30
35
|
xposed_detected: 'Phát hiện Xposed Framework - có thể can thiệp vào ứng dụng.',
|
|
31
36
|
magisk_detected: 'Phát hiện Magisk - công cụ root ẩn danh.',
|
|
32
37
|
debugger_detected: 'Phát hiện debugger đang gắn vào ứng dụng.',
|
|
33
|
-
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.'
|
|
38
|
+
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.',
|
|
39
|
+
ssl_validation_bypass: 'SSL certificate validation đã bị bypass, kết nối có thể không an toàn.',
|
|
40
|
+
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.',
|
|
41
|
+
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.',
|
|
42
|
+
modified_ssl_libraries: 'SSL libraries đã bị sửa đổi - có thể dẫn đến kết nối không an toàn.',
|
|
43
|
+
certificate_tampering: 'Phát hiện certificate đã bị can thiệp - kết nối có thể bị theo dõi.'
|
|
34
44
|
};
|
|
35
45
|
|
|
36
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","View","Text","StyleSheet","ScrollView","SafeAreaView","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","style","styles","container","contentContainerStyle","scrollContent","bounces","iconContainer","length","Fragment","threatsTitle","threatsList","map","threat","key","threatItem","bullet","threatContent","threatTitle","threatDescription","footer","footerText","create","flex","backgroundColor","padding","alignItems","width","height","borderRadius","justifyContent","marginBottom","fontSize","fontWeight","color","textAlign","lineHeight","alignSelf","flexDirection","borderLeftWidth","borderLeftColor","marginTop","marginRight","paddingTop","borderTopWidth","borderTopColor"],"sourceRoot":"../../../src","sources":["components/SecurityBlockedScreen.tsx"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,IAAI,EACJC,IAAI,EACJC,UAAU,EACVC,UAAU,EACVC,YAAY,QAEP,cAAc;AAcrB,MAAMC,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","View","Text","StyleSheet","ScrollView","SafeAreaView","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","style","styles","container","contentContainerStyle","scrollContent","bounces","iconContainer","length","Fragment","threatsTitle","threatsList","map","threat","key","threatItem","bullet","threatContent","threatTitle","threatDescription","footer","footerText","create","flex","backgroundColor","padding","alignItems","width","height","borderRadius","justifyContent","marginBottom","fontSize","fontWeight","color","textAlign","lineHeight","alignSelf","flexDirection","borderLeftWidth","borderLeftColor","marginTop","marginRight","paddingTop","borderTopWidth","borderTopColor"],"sourceRoot":"../../../src","sources":["components/SecurityBlockedScreen.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,20 +2,23 @@
|
|
|
2
2
|
* React hook for device security
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
5
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
6
|
import { Platform } from 'react-native';
|
|
7
7
|
import deviceSecurity from '../api';
|
|
8
8
|
export function useDeviceSecurity(options = {}) {
|
|
9
9
|
const {
|
|
10
|
-
onSecurityThreat,
|
|
11
|
-
blockOnThreat = false,
|
|
12
|
-
blockOptions,
|
|
13
10
|
checkInterval = 0
|
|
14
11
|
} = options;
|
|
15
12
|
const [isSecure, setIsSecure] = useState(null);
|
|
16
13
|
const [isLoading, setIsLoading] = useState(true);
|
|
17
14
|
const [securityStatus, setSecurityStatus] = useState(null);
|
|
18
15
|
const [error, setError] = useState(null);
|
|
16
|
+
|
|
17
|
+
// Use refs for options to avoid infinite loops when inline objects/functions are passed
|
|
18
|
+
const optionsRef = useRef(options);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
optionsRef.current = options;
|
|
21
|
+
}, [options]);
|
|
19
22
|
const checkSecurity = useCallback(async () => {
|
|
20
23
|
if (Platform.OS !== 'android') {
|
|
21
24
|
setIsSecure(true);
|
|
@@ -31,14 +34,17 @@ export function useDeviceSecurity(options = {}) {
|
|
|
31
34
|
|
|
32
35
|
// Handle security threats
|
|
33
36
|
if (!status.isSecure) {
|
|
37
|
+
const currentOptions = optionsRef.current;
|
|
38
|
+
|
|
34
39
|
// Call callback for each threat
|
|
35
40
|
for (const threat of status.threats) {
|
|
36
|
-
|
|
41
|
+
var _currentOptions$onSec;
|
|
42
|
+
(_currentOptions$onSec = currentOptions.onSecurityThreat) === null || _currentOptions$onSec === void 0 || _currentOptions$onSec.call(currentOptions, threat, status);
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
// Block if requested
|
|
40
|
-
if (blockOnThreat) {
|
|
41
|
-
deviceSecurity.blockOnSecurityThreat(blockOptions);
|
|
46
|
+
if (currentOptions.blockOnThreat) {
|
|
47
|
+
deviceSecurity.blockOnSecurityThreat(currentOptions.blockOptions);
|
|
42
48
|
}
|
|
43
49
|
}
|
|
44
50
|
} catch (err) {
|
|
@@ -48,7 +54,7 @@ export function useDeviceSecurity(options = {}) {
|
|
|
48
54
|
} finally {
|
|
49
55
|
setIsLoading(false);
|
|
50
56
|
}
|
|
51
|
-
}, [
|
|
57
|
+
}, []);
|
|
52
58
|
const recheck = useCallback(async () => {
|
|
53
59
|
await checkSecurity();
|
|
54
60
|
}, [checkSecurity]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useState","Platform","deviceSecurity","useDeviceSecurity","options","
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useRef","useState","Platform","deviceSecurity","useDeviceSecurity","options","checkInterval","isSecure","setIsSecure","isLoading","setIsLoading","securityStatus","setSecurityStatus","error","setError","optionsRef","current","checkSecurity","OS","status","getSecurityStatus","currentOptions","threat","threats","_currentOptions$onSec","onSecurityThreat","call","blockOnThreat","blockOnSecurityThreat","blockOptions","err","errorObj","Error","recheck","intervalId","setInterval","clearInterval"],"sourceRoot":"../../../src","sources":["hooks/useDeviceSecurity.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,6 +7,13 @@ export interface Spec extends TurboModule {
|
|
|
7
7
|
hasMagisk(): boolean;
|
|
8
8
|
isDebuggable(): boolean;
|
|
9
9
|
isEmulator(): boolean;
|
|
10
|
+
hasSSLValidationBypass(): boolean;
|
|
11
|
+
hasSSLPinningBypass(): boolean;
|
|
12
|
+
hasProxyConfiguration(): boolean;
|
|
13
|
+
hasModifiedSSLLibraries(): boolean;
|
|
14
|
+
hasCertificateTampering(): boolean;
|
|
15
|
+
hasSSLSecurityIssue(): boolean;
|
|
16
|
+
getSSLSecurityStatus(): Promise<string>;
|
|
10
17
|
getSecurityStatus(): Promise<string>;
|
|
11
18
|
isDeviceSecure(): Promise<boolean>;
|
|
12
19
|
blockOnSecurityThreat(showAlert: boolean, alertTitle: string, alertMessage: string, alertButtonText: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeDeviceSecurity.d.ts","sourceRoot":"","sources":["../../src/NativeDeviceSecurity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,QAAQ,IAAI,OAAO,CAAC;IACpB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGvC,QAAQ,IAAI,OAAO,CAAC;IACpB,SAAS,IAAI,OAAO,CAAC;IACrB,SAAS,IAAI,OAAO,CAAC;IAGrB,YAAY,IAAI,OAAO,CAAC;IAGxB,UAAU,IAAI,OAAO,CAAC;IAGtB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAGnC,qBAAqB,CACnB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,IAAI,CAAC;CACT;;AAED,wBAAwE"}
|
|
1
|
+
{"version":3,"file":"NativeDeviceSecurity.d.ts","sourceRoot":"","sources":["../../src/NativeDeviceSecurity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IAEvC,QAAQ,IAAI,OAAO,CAAC;IACpB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGvC,QAAQ,IAAI,OAAO,CAAC;IACpB,SAAS,IAAI,OAAO,CAAC;IACrB,SAAS,IAAI,OAAO,CAAC;IAGrB,YAAY,IAAI,OAAO,CAAC;IAGxB,UAAU,IAAI,OAAO,CAAC;IAGtB,sBAAsB,IAAI,OAAO,CAAC;IAClC,mBAAmB,IAAI,OAAO,CAAC;IAC/B,qBAAqB,IAAI,OAAO,CAAC;IACjC,uBAAuB,IAAI,OAAO,CAAC;IACnC,uBAAuB,IAAI,OAAO,CAAC;IACnC,mBAAmB,IAAI,OAAO,CAAC;IAC/B,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAGxC,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAGnC,qBAAqB,CACnB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,IAAI,CAAC;CACT;;AAED,wBAAwE"}
|
package/lib/typescript/api.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* DeviceSecurity API
|
|
3
3
|
* Main singleton class for device security checks
|
|
4
4
|
*/
|
|
5
|
-
import type { BlockOnSecurityThreatOptions, SecurityStatus } from './types';
|
|
5
|
+
import type { BlockOnSecurityThreatOptions, SecurityStatus, SSLSecurityStatus } from './types';
|
|
6
6
|
/**
|
|
7
7
|
* Main DeviceSecurity API class
|
|
8
8
|
*/
|
|
@@ -15,6 +15,10 @@ declare class DeviceSecurity {
|
|
|
15
15
|
* Get detailed security status
|
|
16
16
|
*/
|
|
17
17
|
getSecurityStatus(): Promise<SecurityStatus>;
|
|
18
|
+
/**
|
|
19
|
+
* Get detailed SSL security status
|
|
20
|
+
*/
|
|
21
|
+
getSSLSecurityStatus(): Promise<SSLSecurityStatus>;
|
|
18
22
|
/**
|
|
19
23
|
* Check if device is rooted (synchronous, Android only)
|
|
20
24
|
*/
|
|
@@ -39,6 +43,30 @@ declare class DeviceSecurity {
|
|
|
39
43
|
* Check if running on emulator
|
|
40
44
|
*/
|
|
41
45
|
isEmulator(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if SSL validation has been bypassed
|
|
48
|
+
*/
|
|
49
|
+
hasSSLValidationBypass(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Check if SSL pinning bypass tools are present
|
|
52
|
+
*/
|
|
53
|
+
hasSSLPinningBypass(): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Check if proxy is configured (potential MITM)
|
|
56
|
+
*/
|
|
57
|
+
hasProxyConfiguration(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Check if SSL libraries have been modified
|
|
60
|
+
*/
|
|
61
|
+
hasModifiedSSLLibraries(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Check if certificates have been tampered with
|
|
64
|
+
*/
|
|
65
|
+
hasCertificateTampering(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Comprehensive SSL security check
|
|
68
|
+
*/
|
|
69
|
+
hasSSLSecurityIssue(): boolean;
|
|
42
70
|
/**
|
|
43
71
|
* Block app when security threat detected
|
|
44
72
|
* This will show an alert and potentially exit the app
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,4BAA4B,EAC5B,cAAc,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,4BAA4B,EAC5B,cAAc,EAEd,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,cAAM,cAAc;IAClB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAcxC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAmClD;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IA6BxD;;OAEG;IACH,QAAQ,IAAI,OAAO;IAanB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAanB;;OAEG;IACH,SAAS,IAAI,OAAO;IAapB;;OAEG;IACH,SAAS,IAAI,OAAO;IAapB;;OAEG;IACH,YAAY,IAAI,OAAO;IAavB;;OAEG;IACH,UAAU,IAAI,OAAO;IAerB;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAajC;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAa9B;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAahC;;OAEG;IACH,uBAAuB,IAAI,OAAO;IAalC;;OAEG;IACH,uBAAuB,IAAI,OAAO;IAalC;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAa9B;;;OAGG;IACH,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,IAAI;IAiCvE;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAuBjC;AAGD,QAAA,MAAM,sBAAsB,gBAAuB,CAAC;AACpD,eAAe,sBAAsB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityBlockedScreen.d.ts","sourceRoot":"","sources":["../../../src/components/SecurityBlockedScreen.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/D,UAAU,0BAA0B;IAClC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"SecurityBlockedScreen.d.ts","sourceRoot":"","sources":["../../../src/components/SecurityBlockedScreen.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/D,UAAU,0BAA0B;IAClC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAwCD;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAoDtE,CAAC;AA4FF,eAAe,qBAAqB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDeviceSecurity.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDeviceSecurity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAEV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAElB,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"useDeviceSecurity.d.ts","sourceRoot":"","sources":["../../../src/hooks/useDeviceSecurity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAEV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAElB,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CA4EzB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Security threat types
|
|
3
3
|
*/
|
|
4
|
-
export type SecurityThreat = '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';
|
|
4
|
+
export type SecurityThreat = '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';
|
|
5
|
+
/**
|
|
6
|
+
* SSL Security Status
|
|
7
|
+
*/
|
|
8
|
+
export interface SSLSecurityStatus {
|
|
9
|
+
/** SSL validation has been bypassed */
|
|
10
|
+
hasSSLValidationBypass: boolean;
|
|
11
|
+
/** SSL pinning bypass tools detected */
|
|
12
|
+
hasSSLPinningBypass: boolean;
|
|
13
|
+
/** Proxy configuration detected (potential MITM) */
|
|
14
|
+
hasProxyConfiguration: boolean;
|
|
15
|
+
/** SSL libraries have been modified */
|
|
16
|
+
hasModifiedSSLLibraries: boolean;
|
|
17
|
+
/** Certificate tampering detected */
|
|
18
|
+
hasCertificateTampering: boolean;
|
|
19
|
+
/** Any SSL security issue detected */
|
|
20
|
+
hasSSLSecurityIssue: boolean;
|
|
21
|
+
}
|
|
5
22
|
/**
|
|
6
23
|
* Detailed security status
|
|
7
24
|
*/
|
|
@@ -32,6 +49,18 @@ export interface SecurityStatus {
|
|
|
32
49
|
isDebuggable: boolean;
|
|
33
50
|
/** Running on emulator */
|
|
34
51
|
isEmulator: boolean;
|
|
52
|
+
/** SSL validation has been bypassed */
|
|
53
|
+
hasSSLValidationBypass: boolean;
|
|
54
|
+
/** SSL pinning bypass tools detected */
|
|
55
|
+
hasSSLPinningBypass: boolean;
|
|
56
|
+
/** Proxy configuration detected */
|
|
57
|
+
hasProxyConfiguration: boolean;
|
|
58
|
+
/** SSL libraries have been modified */
|
|
59
|
+
hasModifiedSSLLibraries: boolean;
|
|
60
|
+
/** Certificate tampering detected */
|
|
61
|
+
hasCertificateTampering: boolean;
|
|
62
|
+
/** Any SSL security issue detected */
|
|
63
|
+
hasSSLSecurityIssue: boolean;
|
|
35
64
|
/** Additional details about detection */
|
|
36
65
|
details?: Record<string, boolean | string | number>;
|
|
37
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,oBAAoB,GACpB,sBAAsB,GACtB,yBAAyB,GACzB,oBAAoB,GACpB,uBAAuB,GACvB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-device-defense",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Multi-layer device security detection for React Native (root, hook, debugger, emulator detection)",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -52,6 +52,8 @@
|
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/react": "^18.0.0",
|
|
54
54
|
"@types/react-native": "^0.72.0",
|
|
55
|
+
"@typescript-eslint/parser": "^8.59.2",
|
|
56
|
+
"eslint": "^8.57.1",
|
|
55
57
|
"react-native-builder-bob": "^0.20.0",
|
|
56
58
|
"typescript": "^5.0.0"
|
|
57
59
|
},
|
|
@@ -69,4 +71,4 @@
|
|
|
69
71
|
]
|
|
70
72
|
]
|
|
71
73
|
}
|
|
72
|
-
}
|
|
74
|
+
}
|
|
@@ -17,6 +17,15 @@ export interface Spec extends TurboModule {
|
|
|
17
17
|
// Emulator detection
|
|
18
18
|
isEmulator(): boolean;
|
|
19
19
|
|
|
20
|
+
// SSL security methods
|
|
21
|
+
hasSSLValidationBypass(): boolean;
|
|
22
|
+
hasSSLPinningBypass(): boolean;
|
|
23
|
+
hasProxyConfiguration(): boolean;
|
|
24
|
+
hasModifiedSSLLibraries(): boolean;
|
|
25
|
+
hasCertificateTampering(): boolean;
|
|
26
|
+
hasSSLSecurityIssue(): boolean;
|
|
27
|
+
getSSLSecurityStatus(): Promise<string>;
|
|
28
|
+
|
|
20
29
|
// Comprehensive security check
|
|
21
30
|
getSecurityStatus(): Promise<string>;
|
|
22
31
|
isDeviceSecure(): Promise<boolean>;
|
package/src/api.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
BlockOnSecurityThreatOptions,
|
|
10
10
|
SecurityStatus,
|
|
11
11
|
SecurityThreat,
|
|
12
|
+
SSLSecurityStatus,
|
|
12
13
|
} from './types';
|
|
13
14
|
|
|
14
15
|
/**
|
|
@@ -52,6 +53,12 @@ class DeviceSecurity {
|
|
|
52
53
|
hasMagisk: false,
|
|
53
54
|
isDebuggable: false,
|
|
54
55
|
isEmulator: false,
|
|
56
|
+
hasSSLValidationBypass: false,
|
|
57
|
+
hasSSLPinningBypass: false,
|
|
58
|
+
hasProxyConfiguration: false,
|
|
59
|
+
hasModifiedSSLLibraries: false,
|
|
60
|
+
hasCertificateTampering: false,
|
|
61
|
+
hasSSLSecurityIssue: false,
|
|
55
62
|
};
|
|
56
63
|
}
|
|
57
64
|
|
|
@@ -64,6 +71,38 @@ class DeviceSecurity {
|
|
|
64
71
|
}
|
|
65
72
|
}
|
|
66
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Get detailed SSL security status
|
|
76
|
+
*/
|
|
77
|
+
async getSSLSecurityStatus(): Promise<SSLSecurityStatus> {
|
|
78
|
+
if (Platform.OS !== 'android') {
|
|
79
|
+
// iOS: no-op for now, return secure status
|
|
80
|
+
return {
|
|
81
|
+
hasSSLValidationBypass: false,
|
|
82
|
+
hasSSLPinningBypass: false,
|
|
83
|
+
hasProxyConfiguration: false,
|
|
84
|
+
hasModifiedSSLLibraries: false,
|
|
85
|
+
hasCertificateTampering: false,
|
|
86
|
+
hasSSLSecurityIssue: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const statusJson = await NativeDeviceSecurity.getSSLSecurityStatus();
|
|
92
|
+
return JSON.parse(statusJson) as SSLSecurityStatus;
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('DeviceSecurity: Error getting SSL security status', error);
|
|
95
|
+
return {
|
|
96
|
+
hasSSLValidationBypass: false,
|
|
97
|
+
hasSSLPinningBypass: false,
|
|
98
|
+
hasProxyConfiguration: false,
|
|
99
|
+
hasModifiedSSLLibraries: false,
|
|
100
|
+
hasCertificateTampering: false,
|
|
101
|
+
hasSSLSecurityIssue: false,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
67
106
|
/**
|
|
68
107
|
* Check if device is rooted (synchronous, Android only)
|
|
69
108
|
*/
|
|
@@ -160,6 +199,104 @@ class DeviceSecurity {
|
|
|
160
199
|
}
|
|
161
200
|
}
|
|
162
201
|
|
|
202
|
+
// ===== SSL Security Methods =====
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Check if SSL validation has been bypassed
|
|
206
|
+
*/
|
|
207
|
+
hasSSLValidationBypass(): boolean {
|
|
208
|
+
if (Platform.OS !== 'android') {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
return NativeDeviceSecurity.hasSSLValidationBypass();
|
|
214
|
+
} catch (error) {
|
|
215
|
+
console.error('DeviceSecurity: Error checking SSL validation bypass', error);
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Check if SSL pinning bypass tools are present
|
|
222
|
+
*/
|
|
223
|
+
hasSSLPinningBypass(): boolean {
|
|
224
|
+
if (Platform.OS !== 'android') {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
return NativeDeviceSecurity.hasSSLPinningBypass();
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.error('DeviceSecurity: Error checking SSL pinning bypass', error);
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Check if proxy is configured (potential MITM)
|
|
238
|
+
*/
|
|
239
|
+
hasProxyConfiguration(): boolean {
|
|
240
|
+
if (Platform.OS !== 'android') {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
return NativeDeviceSecurity.hasProxyConfiguration();
|
|
246
|
+
} catch (error) {
|
|
247
|
+
console.error('DeviceSecurity: Error checking proxy configuration', error);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Check if SSL libraries have been modified
|
|
254
|
+
*/
|
|
255
|
+
hasModifiedSSLLibraries(): boolean {
|
|
256
|
+
if (Platform.OS !== 'android') {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
return NativeDeviceSecurity.hasModifiedSSLLibraries();
|
|
262
|
+
} catch (error) {
|
|
263
|
+
console.error('DeviceSecurity: Error checking modified SSL libraries', error);
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Check if certificates have been tampered with
|
|
270
|
+
*/
|
|
271
|
+
hasCertificateTampering(): boolean {
|
|
272
|
+
if (Platform.OS !== 'android') {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
return NativeDeviceSecurity.hasCertificateTampering();
|
|
278
|
+
} catch (error) {
|
|
279
|
+
console.error('DeviceSecurity: Error checking certificate tampering', error);
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Comprehensive SSL security check
|
|
286
|
+
*/
|
|
287
|
+
hasSSLSecurityIssue(): boolean {
|
|
288
|
+
if (Platform.OS !== 'android') {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
try {
|
|
293
|
+
return NativeDeviceSecurity.hasSSLSecurityIssue();
|
|
294
|
+
} catch (error) {
|
|
295
|
+
console.error('DeviceSecurity: Error checking SSL security', error);
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
163
300
|
/**
|
|
164
301
|
* Block app when security threat detected
|
|
165
302
|
* This will show an alert and potentially exit the app
|
|
@@ -215,6 +352,12 @@ class DeviceSecurity {
|
|
|
215
352
|
hasMagisk: false,
|
|
216
353
|
isDebuggable: false,
|
|
217
354
|
isEmulator: false,
|
|
355
|
+
hasSSLValidationBypass: false,
|
|
356
|
+
hasSSLPinningBypass: false,
|
|
357
|
+
hasProxyConfiguration: false,
|
|
358
|
+
hasModifiedSSLLibraries: false,
|
|
359
|
+
hasCertificateTampering: false,
|
|
360
|
+
hasSSLSecurityIssue: false,
|
|
218
361
|
};
|
|
219
362
|
}
|
|
220
363
|
}
|
|
@@ -38,6 +38,11 @@ const THREAT_TITLES: Record<SecurityThreat, string> = {
|
|
|
38
38
|
magisk_detected: 'Phát hiện Magisk',
|
|
39
39
|
debugger_detected: 'Phát hiện Debugger',
|
|
40
40
|
emulator_detected: 'Phát hiện Bộ giả lập',
|
|
41
|
+
ssl_validation_bypass: 'SSL Validation bị bypass',
|
|
42
|
+
ssl_pinning_bypass: 'SSL Pinning bị bypass',
|
|
43
|
+
proxy_configuration: 'Phát hiện Proxy (MITM)',
|
|
44
|
+
modified_ssl_libraries: 'SSL Library đã sửa đổi',
|
|
45
|
+
certificate_tampering: 'Certificate bị can thiệp',
|
|
41
46
|
};
|
|
42
47
|
|
|
43
48
|
const THREAT_DESCRIPTIONS: Record<SecurityThreat, string> = {
|
|
@@ -52,6 +57,11 @@ const THREAT_DESCRIPTIONS: Record<SecurityThreat, string> = {
|
|
|
52
57
|
magisk_detected: 'Phát hiện Magisk - công cụ root ẩn danh.',
|
|
53
58
|
debugger_detected: 'Phát hiện debugger đang gắn vào ứng dụng.',
|
|
54
59
|
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.',
|
|
60
|
+
ssl_validation_bypass: 'SSL certificate validation đã bị bypass, kết nối có thể không an toàn.',
|
|
61
|
+
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.',
|
|
62
|
+
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.',
|
|
63
|
+
modified_ssl_libraries: 'SSL libraries đã bị sửa đổi - có thể dẫn đến kết nối không an toàn.',
|
|
64
|
+
certificate_tampering: 'Phát hiện certificate đã bị can thiệp - kết nối có thể bị theo dõi.',
|
|
55
65
|
};
|
|
56
66
|
|
|
57
67
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* React hook for device security
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
5
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
6
|
import { Platform } from 'react-native';
|
|
7
7
|
import deviceSecurity from '../api';
|
|
8
8
|
import type {
|
|
@@ -14,12 +14,7 @@ import type {
|
|
|
14
14
|
export function useDeviceSecurity(
|
|
15
15
|
options: UseDeviceSecurityOptions = {},
|
|
16
16
|
): UseDeviceSecurityReturn {
|
|
17
|
-
const {
|
|
18
|
-
onSecurityThreat,
|
|
19
|
-
blockOnThreat = false,
|
|
20
|
-
blockOptions,
|
|
21
|
-
checkInterval = 0,
|
|
22
|
-
} = options;
|
|
17
|
+
const { checkInterval = 0 } = options;
|
|
23
18
|
|
|
24
19
|
const [isSecure, setIsSecure] = useState<boolean | null>(null);
|
|
25
20
|
const [isLoading, setIsLoading] = useState(true);
|
|
@@ -28,6 +23,12 @@ export function useDeviceSecurity(
|
|
|
28
23
|
);
|
|
29
24
|
const [error, setError] = useState<Error | null>(null);
|
|
30
25
|
|
|
26
|
+
// Use refs for options to avoid infinite loops when inline objects/functions are passed
|
|
27
|
+
const optionsRef = useRef(options);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
optionsRef.current = options;
|
|
30
|
+
}, [options]);
|
|
31
|
+
|
|
31
32
|
const checkSecurity = useCallback(async () => {
|
|
32
33
|
if (Platform.OS !== 'android') {
|
|
33
34
|
setIsSecure(true);
|
|
@@ -45,14 +46,16 @@ export function useDeviceSecurity(
|
|
|
45
46
|
|
|
46
47
|
// Handle security threats
|
|
47
48
|
if (!status.isSecure) {
|
|
49
|
+
const currentOptions = optionsRef.current;
|
|
50
|
+
|
|
48
51
|
// Call callback for each threat
|
|
49
52
|
for (const threat of status.threats) {
|
|
50
|
-
onSecurityThreat?.(threat, status);
|
|
53
|
+
currentOptions.onSecurityThreat?.(threat, status);
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
// Block if requested
|
|
54
|
-
if (blockOnThreat) {
|
|
55
|
-
deviceSecurity.blockOnSecurityThreat(blockOptions);
|
|
57
|
+
if (currentOptions.blockOnThreat) {
|
|
58
|
+
deviceSecurity.blockOnSecurityThreat(currentOptions.blockOptions);
|
|
56
59
|
}
|
|
57
60
|
}
|
|
58
61
|
} catch (err) {
|
|
@@ -63,7 +66,7 @@ export function useDeviceSecurity(
|
|
|
63
66
|
} finally {
|
|
64
67
|
setIsLoading(false);
|
|
65
68
|
}
|
|
66
|
-
}, [
|
|
69
|
+
}, []);
|
|
67
70
|
|
|
68
71
|
const recheck = useCallback(async () => {
|
|
69
72
|
await checkSecurity();
|