@necessarysdk/react-native 0.0.0-stage → 0.1.6

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.
Files changed (117) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +2 -0
  4. package/NecessaryReactNative.podspec +23 -0
  5. package/README.md +429 -2
  6. package/android/build.gradle +83 -0
  7. package/android/src/main/AndroidManifest.xml +41 -0
  8. package/android/src/main/cpp/CMakeLists.txt +7 -0
  9. package/android/src/main/cpp/code_integrity.cpp +484 -0
  10. package/android/src/main/java/com/necessarysdk/reactnative/Causes.kt +49 -0
  11. package/android/src/main/java/com/necessarysdk/reactnative/InstallationKeyManager.kt +388 -0
  12. package/android/src/main/java/com/necessarysdk/reactnative/IntegrityProbeManager.kt +1157 -0
  13. package/android/src/main/java/com/necessarysdk/reactnative/KeyPresence.kt +62 -0
  14. package/android/src/main/java/com/necessarysdk/reactnative/NecessaryModules.kt +94 -0
  15. package/android/src/main/java/com/necessarysdk/reactnative/NecessaryNative.kt +338 -0
  16. package/android/src/main/java/com/necessarysdk/reactnative/NecessaryPackage.kt +38 -0
  17. package/android/src/main/java/com/necessarysdk/reactnative/ProbeReads.kt +333 -0
  18. package/android/src/main/java/com/necessarysdk/reactnative/ScreenGuard.kt +56 -0
  19. package/android/src/main/java/com/necessarysdk/reactnative/SecureStore.kt +127 -0
  20. package/android/src/main/java/com/necessarysdk/reactnative/StepUpKeyEntry.kt +57 -0
  21. package/android/src/main/java/com/necessarysdk/reactnative/StepUpKeyManager.kt +767 -0
  22. package/contract/report-1/android-8-ios-5/RULES.md +149 -0
  23. package/contract/report-1/android-8-ios-5/report.schema.json +2753 -0
  24. package/contract/report-1/android-8-ios-5/samples/android-8-complete.json +205 -0
  25. package/contract/report-1/android-8-ios-5/samples/android-8-incomplete.json +205 -0
  26. package/contract/report-1/android-8-ios-5/samples/android-8-invalid.json +205 -0
  27. package/contract/report-1/android-8-ios-5/samples/android-8-location-one-fix.json +228 -0
  28. package/contract/report-1/android-8-ios-5/samples/android-8-location-two-fixes.json +228 -0
  29. package/contract/report-1/android-8-ios-5/samples/android-8-refused.json +208 -0
  30. package/contract/report-1/android-8-ios-5/samples/ios-5-complete.json +106 -0
  31. package/contract/report-1/android-8-ios-5/samples/ios-5-incomplete.json +105 -0
  32. package/contract/report-1/android-8-ios-5/samples/ios-5-invalid.json +107 -0
  33. package/contract/report-1/android-8-ios-5/samples/ios-5-partial.json +110 -0
  34. package/contract/report-1/android-8-ios-5/samples/ios-5-refused.json +109 -0
  35. package/doc/integration_guide.md +771 -0
  36. package/doc/measurements.md +774 -0
  37. package/ios/InstallationKeyManager.swift +694 -0
  38. package/ios/IntegrityProbeManager.swift +959 -0
  39. package/ios/NecessaryModules.h +34 -0
  40. package/ios/NecessaryModules.mm +208 -0
  41. package/ios/NecessaryNative.swift +327 -0
  42. package/ios/PrivacyInfo.xcprivacy +14 -0
  43. package/ios/ProbeReads.swift +370 -0
  44. package/lib/client.d.ts +105 -0
  45. package/lib/client.js +176 -0
  46. package/lib/collector.d.ts +18 -0
  47. package/lib/collector.js +49 -0
  48. package/lib/deviceTrust.d.ts +253 -0
  49. package/lib/deviceTrust.js +699 -0
  50. package/lib/errors.d.ts +43 -0
  51. package/lib/errors.js +56 -0
  52. package/lib/index.d.ts +18 -0
  53. package/lib/index.js +34 -0
  54. package/lib/installationKey.d.ts +62 -0
  55. package/lib/installationKey.js +185 -0
  56. package/lib/installationStore.d.ts +49 -0
  57. package/lib/installationStore.js +127 -0
  58. package/lib/native/NativeNecessaryInstallationKey.d.ts +10 -0
  59. package/lib/native/NativeNecessaryInstallationKey.js +4 -0
  60. package/lib/native/NativeNecessaryIntegrity.d.ts +8 -0
  61. package/lib/native/NativeNecessaryIntegrity.js +4 -0
  62. package/lib/native/NativeNecessarySecureScreen.d.ts +7 -0
  63. package/lib/native/NativeNecessarySecureScreen.js +4 -0
  64. package/lib/native/NativeNecessaryStepUpKey.d.ts +9 -0
  65. package/lib/native/NativeNecessaryStepUpKey.js +4 -0
  66. package/lib/native/NativeNecessaryStorage.d.ts +14 -0
  67. package/lib/native/NativeNecessaryStorage.js +4 -0
  68. package/lib/protocol.d.ts +24 -0
  69. package/lib/protocol.js +50 -0
  70. package/lib/reinstallHint.d.ts +23 -0
  71. package/lib/reinstallHint.js +65 -0
  72. package/lib/report.d.ts +62 -0
  73. package/lib/report.js +134 -0
  74. package/lib/requestProof.d.ts +116 -0
  75. package/lib/requestProof.js +220 -0
  76. package/lib/secureScreen.d.ts +15 -0
  77. package/lib/secureScreen.js +32 -0
  78. package/lib/stepUpKey.d.ts +105 -0
  79. package/lib/stepUpKey.js +187 -0
  80. package/lib/transport.d.ts +39 -0
  81. package/lib/transport.js +117 -0
  82. package/lib/util/answers.d.ts +6 -0
  83. package/lib/util/answers.js +16 -0
  84. package/lib/util/bytes.d.ts +18 -0
  85. package/lib/util/bytes.js +207 -0
  86. package/lib/util/native.d.ts +20 -0
  87. package/lib/util/native.js +49 -0
  88. package/lib/util/release.d.ts +2 -0
  89. package/lib/util/release.js +7 -0
  90. package/lib/util/target.d.ts +18 -0
  91. package/lib/util/target.js +128 -0
  92. package/package.json +81 -4
  93. package/src/client.ts +221 -0
  94. package/src/collector.ts +64 -0
  95. package/src/deviceTrust.ts +851 -0
  96. package/src/errors.ts +71 -0
  97. package/src/index.ts +19 -0
  98. package/src/installationKey.ts +223 -0
  99. package/src/installationStore.ts +143 -0
  100. package/src/native/NativeNecessaryInstallationKey.ts +12 -0
  101. package/src/native/NativeNecessaryIntegrity.ts +15 -0
  102. package/src/native/NativeNecessarySecureScreen.ts +9 -0
  103. package/src/native/NativeNecessaryStepUpKey.ts +11 -0
  104. package/src/native/NativeNecessaryStorage.ts +16 -0
  105. package/src/protocol.ts +52 -0
  106. package/src/reinstallHint.ts +69 -0
  107. package/src/report.ts +168 -0
  108. package/src/requestProof.ts +295 -0
  109. package/src/secureScreen.ts +29 -0
  110. package/src/stepUpKey.ts +238 -0
  111. package/src/transport.ts +145 -0
  112. package/src/util/answers.ts +15 -0
  113. package/src/util/bytes.ts +194 -0
  114. package/src/util/native.ts +56 -0
  115. package/src/util/release.ts +6 -0
  116. package/src/util/target.ts +132 -0
  117. package/vectors/client_server.json +264 -0
@@ -0,0 +1,228 @@
1
+ {
2
+ "description": "The location and mock-location measurements, requested by the backend and enabled by the app.",
3
+ "plan": {
4
+ "required_probes": [
5
+ "app_identity",
6
+ "debug_state",
7
+ "root_files",
8
+ "system_properties",
9
+ "runtime_maps",
10
+ "tracer",
11
+ "root_shell",
12
+ "selinux",
13
+ "mounts",
14
+ "frida_ports",
15
+ "instrumentation_threads",
16
+ "exec_mappings",
17
+ "code_integrity",
18
+ "developer_settings",
19
+ "emulator"
20
+ ],
21
+ "optional_probes": [
22
+ "location",
23
+ "mock_location"
24
+ ]
25
+ },
26
+ "expect": "complete",
27
+ "why": "Both answers carry the one fix's time: one observation.",
28
+ "report": {
29
+ "installation_id": "00000000-0000-4000-8000-000000000001",
30
+ "challenge_id": "00000000-0000-4000-8000-000000000002",
31
+ "challenge_nonce": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
32
+ "collected_at": 1792857600,
33
+ "version": 1,
34
+ "platform": "android",
35
+ "collector_version": 8,
36
+ "probe_results": {
37
+ "app_identity": {
38
+ "status": "ok",
39
+ "package_name": "com.example.app",
40
+ "version_name": "2.4.1",
41
+ "version_code": 241,
42
+ "debuggable": false,
43
+ "allow_backup": false,
44
+ "cert_sha256": [
45
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
46
+ ],
47
+ "current_signers": [
48
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
49
+ ],
50
+ "signing_lineage": [
51
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
52
+ ],
53
+ "apk_sha256": "6f0c1d2e3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e4f",
54
+ "split_apks": [
55
+ {
56
+ "name": "split_config.arm64_v8a.apk",
57
+ "sha256": "c6c44c7bcd69f06b7a7a3e3c93f4f1869abb38ca56a1bede8ec309250a574036"
58
+ }
59
+ ],
60
+ "installer_package": "com.android.vending",
61
+ "source_dir": "/data/app/com.example.app-1/base.apk"
62
+ },
63
+ "debug_state": {
64
+ "status": "ok",
65
+ "debugger_connected": false,
66
+ "waiting_for_debugger": false
67
+ },
68
+ "root_files": {
69
+ "status": "ok",
70
+ "found_paths": [],
71
+ "build_tags": "release-keys",
72
+ "test_keys": false
73
+ },
74
+ "system_properties": {
75
+ "status": "ok",
76
+ "properties": {
77
+ "ro.secure": "1",
78
+ "ro.debuggable": "0",
79
+ "ro.build.type": "user",
80
+ "ro.build.tags": "release-keys",
81
+ "ro.boot.verifiedbootstate": "green",
82
+ "ro.boot.flash.locked": "1",
83
+ "ro.boot.vbmeta.device_state": "locked",
84
+ "ro.boot.veritymode": "enforcing"
85
+ }
86
+ },
87
+ "runtime_maps": {
88
+ "status": "ok",
89
+ "suspicious_tokens": [],
90
+ "suspicious_line_count": 0,
91
+ "maps_lines": 412
92
+ },
93
+ "tracer": {
94
+ "status": "ok",
95
+ "tracer_pid": 0,
96
+ "seccomp": 2,
97
+ "no_new_privs": 0
98
+ },
99
+ "root_shell": {
100
+ "status": "ok",
101
+ "su_path": "",
102
+ "su_found": false
103
+ },
104
+ "selinux": {
105
+ "status": "ok",
106
+ "mode": "enforcing",
107
+ "getenforce": "Enforcing",
108
+ "enforce_value": "1"
109
+ },
110
+ "mounts": {
111
+ "status": "ok",
112
+ "protected_rw_mounts": []
113
+ },
114
+ "frida_ports": {
115
+ "status": "ok",
116
+ "open_ports": []
117
+ },
118
+ "instrumentation_threads": {
119
+ "status": "ok",
120
+ "frida_threads": [],
121
+ "glib_threads": [],
122
+ "token_threads": [],
123
+ "thread_count": 42
124
+ },
125
+ "exec_mappings": {
126
+ "status": "ok",
127
+ "wx_mappings": 0,
128
+ "wx_bytes": 0,
129
+ "deleted_exec_mappings": 0,
130
+ "deleted_exec_own_code": 0,
131
+ "deleted_exec_jit": 1,
132
+ "anon_exec_labeled": 1,
133
+ "anon_exec_unlabeled": 0,
134
+ "anon_exec_unlabeled_bytes": 0,
135
+ "maps_lines": 412,
136
+ "samples": []
137
+ },
138
+ "code_integrity": {
139
+ "status": "ok",
140
+ "checked": true,
141
+ "diff_bytes": 0,
142
+ "core_diff_bytes": 0,
143
+ "ext_diff_bytes": 0,
144
+ "ext_libs_diff": 0,
145
+ "app_diff_bytes": 0,
146
+ "app_libs_diff": 0,
147
+ "diffed_libs": "",
148
+ "protect_restore_failures": 0,
149
+ "elapsed_ms": 180,
150
+ "core_compared_bytes": 614400,
151
+ "core_expected_bytes": 614400,
152
+ "core_skipped_bytes": 0,
153
+ "core_unreadable_bytes": 0,
154
+ "core_complete": true,
155
+ "ext_compared_bytes": 2097152,
156
+ "ext_expected_bytes": 2097152,
157
+ "ext_skipped_bytes": 0,
158
+ "ext_unreadable_bytes": 0,
159
+ "ext_complete": true,
160
+ "app_compared_bytes": 4194304,
161
+ "app_expected_bytes": 4194304,
162
+ "app_skipped_bytes": 0,
163
+ "app_unreadable_bytes": 0,
164
+ "app_complete": true
165
+ },
166
+ "developer_settings": {
167
+ "status": "ok",
168
+ "developer_options_enabled": false,
169
+ "adb_enabled": false
170
+ },
171
+ "emulator": {
172
+ "status": "ok",
173
+ "suspected": false,
174
+ "reasons": [],
175
+ "model": "Pixel 8",
176
+ "manufacturer": "Google",
177
+ "product": "shiba",
178
+ "hardware": "shiba"
179
+ },
180
+ "device": {
181
+ "status": "ok",
182
+ "release": "14",
183
+ "sdk_int": 34,
184
+ "security_patch": "2026-10-01",
185
+ "manufacturer": "Google",
186
+ "brand": "google",
187
+ "model": "Pixel 8",
188
+ "device": "shiba",
189
+ "build_id": "AP2A.240905.003",
190
+ "fingerprint": "google/shiba/shiba:14/AP2A.240905.003/12231197:user/release-keys",
191
+ "abi": "arm64-v8a",
192
+ "page_size": 4096
193
+ },
194
+ "network": {
195
+ "status": "ok",
196
+ "vpn_active": false,
197
+ "http_proxy_configured": false,
198
+ "transports": [
199
+ "wifi"
200
+ ],
201
+ "interfaces": [
202
+ "wlan0"
203
+ ]
204
+ },
205
+ "location": {
206
+ "status": "ok",
207
+ "permission": "precise",
208
+ "latitude": 51.5072,
209
+ "longitude": -0.1276,
210
+ "accuracy_m": 35.0,
211
+ "age_seconds": 10,
212
+ "provider": "fused",
213
+ "fix_time": 1792857590
214
+ },
215
+ "mock_location": {
216
+ "status": "ok",
217
+ "permission": "precise",
218
+ "mock": false,
219
+ "age_seconds": 10,
220
+ "fix_time": 1792857590
221
+ }
222
+ },
223
+ "enabled_measurements": [
224
+ "location",
225
+ "mock_location"
226
+ ]
227
+ }
228
+ }
@@ -0,0 +1,228 @@
1
+ {
2
+ "description": "The location and mock-location measurements, requested by the backend and enabled by the app.",
3
+ "plan": {
4
+ "required_probes": [
5
+ "app_identity",
6
+ "debug_state",
7
+ "root_files",
8
+ "system_properties",
9
+ "runtime_maps",
10
+ "tracer",
11
+ "root_shell",
12
+ "selinux",
13
+ "mounts",
14
+ "frida_ports",
15
+ "instrumentation_threads",
16
+ "exec_mappings",
17
+ "code_integrity",
18
+ "developer_settings",
19
+ "emulator"
20
+ ],
21
+ "optional_probes": [
22
+ "location",
23
+ "mock_location"
24
+ ]
25
+ },
26
+ "expect": "invalid",
27
+ "why": "The mock flag belongs to another fix than the coordinates: two observations presented as one.",
28
+ "report": {
29
+ "installation_id": "00000000-0000-4000-8000-000000000001",
30
+ "challenge_id": "00000000-0000-4000-8000-000000000002",
31
+ "challenge_nonce": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
32
+ "collected_at": 1792857600,
33
+ "version": 1,
34
+ "platform": "android",
35
+ "collector_version": 8,
36
+ "probe_results": {
37
+ "app_identity": {
38
+ "status": "ok",
39
+ "package_name": "com.example.app",
40
+ "version_name": "2.4.1",
41
+ "version_code": 241,
42
+ "debuggable": false,
43
+ "allow_backup": false,
44
+ "cert_sha256": [
45
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
46
+ ],
47
+ "current_signers": [
48
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
49
+ ],
50
+ "signing_lineage": [
51
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
52
+ ],
53
+ "apk_sha256": "6f0c1d2e3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e4f",
54
+ "split_apks": [
55
+ {
56
+ "name": "split_config.arm64_v8a.apk",
57
+ "sha256": "c6c44c7bcd69f06b7a7a3e3c93f4f1869abb38ca56a1bede8ec309250a574036"
58
+ }
59
+ ],
60
+ "installer_package": "com.android.vending",
61
+ "source_dir": "/data/app/com.example.app-1/base.apk"
62
+ },
63
+ "debug_state": {
64
+ "status": "ok",
65
+ "debugger_connected": false,
66
+ "waiting_for_debugger": false
67
+ },
68
+ "root_files": {
69
+ "status": "ok",
70
+ "found_paths": [],
71
+ "build_tags": "release-keys",
72
+ "test_keys": false
73
+ },
74
+ "system_properties": {
75
+ "status": "ok",
76
+ "properties": {
77
+ "ro.secure": "1",
78
+ "ro.debuggable": "0",
79
+ "ro.build.type": "user",
80
+ "ro.build.tags": "release-keys",
81
+ "ro.boot.verifiedbootstate": "green",
82
+ "ro.boot.flash.locked": "1",
83
+ "ro.boot.vbmeta.device_state": "locked",
84
+ "ro.boot.veritymode": "enforcing"
85
+ }
86
+ },
87
+ "runtime_maps": {
88
+ "status": "ok",
89
+ "suspicious_tokens": [],
90
+ "suspicious_line_count": 0,
91
+ "maps_lines": 412
92
+ },
93
+ "tracer": {
94
+ "status": "ok",
95
+ "tracer_pid": 0,
96
+ "seccomp": 2,
97
+ "no_new_privs": 0
98
+ },
99
+ "root_shell": {
100
+ "status": "ok",
101
+ "su_path": "",
102
+ "su_found": false
103
+ },
104
+ "selinux": {
105
+ "status": "ok",
106
+ "mode": "enforcing",
107
+ "getenforce": "Enforcing",
108
+ "enforce_value": "1"
109
+ },
110
+ "mounts": {
111
+ "status": "ok",
112
+ "protected_rw_mounts": []
113
+ },
114
+ "frida_ports": {
115
+ "status": "ok",
116
+ "open_ports": []
117
+ },
118
+ "instrumentation_threads": {
119
+ "status": "ok",
120
+ "frida_threads": [],
121
+ "glib_threads": [],
122
+ "token_threads": [],
123
+ "thread_count": 42
124
+ },
125
+ "exec_mappings": {
126
+ "status": "ok",
127
+ "wx_mappings": 0,
128
+ "wx_bytes": 0,
129
+ "deleted_exec_mappings": 0,
130
+ "deleted_exec_own_code": 0,
131
+ "deleted_exec_jit": 1,
132
+ "anon_exec_labeled": 1,
133
+ "anon_exec_unlabeled": 0,
134
+ "anon_exec_unlabeled_bytes": 0,
135
+ "maps_lines": 412,
136
+ "samples": []
137
+ },
138
+ "code_integrity": {
139
+ "status": "ok",
140
+ "checked": true,
141
+ "diff_bytes": 0,
142
+ "core_diff_bytes": 0,
143
+ "ext_diff_bytes": 0,
144
+ "ext_libs_diff": 0,
145
+ "app_diff_bytes": 0,
146
+ "app_libs_diff": 0,
147
+ "diffed_libs": "",
148
+ "protect_restore_failures": 0,
149
+ "elapsed_ms": 180,
150
+ "core_compared_bytes": 614400,
151
+ "core_expected_bytes": 614400,
152
+ "core_skipped_bytes": 0,
153
+ "core_unreadable_bytes": 0,
154
+ "core_complete": true,
155
+ "ext_compared_bytes": 2097152,
156
+ "ext_expected_bytes": 2097152,
157
+ "ext_skipped_bytes": 0,
158
+ "ext_unreadable_bytes": 0,
159
+ "ext_complete": true,
160
+ "app_compared_bytes": 4194304,
161
+ "app_expected_bytes": 4194304,
162
+ "app_skipped_bytes": 0,
163
+ "app_unreadable_bytes": 0,
164
+ "app_complete": true
165
+ },
166
+ "developer_settings": {
167
+ "status": "ok",
168
+ "developer_options_enabled": false,
169
+ "adb_enabled": false
170
+ },
171
+ "emulator": {
172
+ "status": "ok",
173
+ "suspected": false,
174
+ "reasons": [],
175
+ "model": "Pixel 8",
176
+ "manufacturer": "Google",
177
+ "product": "shiba",
178
+ "hardware": "shiba"
179
+ },
180
+ "device": {
181
+ "status": "ok",
182
+ "release": "14",
183
+ "sdk_int": 34,
184
+ "security_patch": "2026-10-01",
185
+ "manufacturer": "Google",
186
+ "brand": "google",
187
+ "model": "Pixel 8",
188
+ "device": "shiba",
189
+ "build_id": "AP2A.240905.003",
190
+ "fingerprint": "google/shiba/shiba:14/AP2A.240905.003/12231197:user/release-keys",
191
+ "abi": "arm64-v8a",
192
+ "page_size": 4096
193
+ },
194
+ "network": {
195
+ "status": "ok",
196
+ "vpn_active": false,
197
+ "http_proxy_configured": false,
198
+ "transports": [
199
+ "wifi"
200
+ ],
201
+ "interfaces": [
202
+ "wlan0"
203
+ ]
204
+ },
205
+ "location": {
206
+ "status": "ok",
207
+ "permission": "precise",
208
+ "latitude": 51.5072,
209
+ "longitude": -0.1276,
210
+ "accuracy_m": 35.0,
211
+ "age_seconds": 10,
212
+ "provider": "fused",
213
+ "fix_time": 1792857590
214
+ },
215
+ "mock_location": {
216
+ "status": "ok",
217
+ "permission": "precise",
218
+ "mock": false,
219
+ "age_seconds": 10,
220
+ "fix_time": 1792857595
221
+ }
222
+ },
223
+ "enabled_measurements": [
224
+ "location",
225
+ "mock_location"
226
+ ]
227
+ }
228
+ }
@@ -0,0 +1,208 @@
1
+ {
2
+ "description": "A malformed report.",
3
+ "plan": {
4
+ "required_probes": [
5
+ "app_identity",
6
+ "debug_state",
7
+ "root_files",
8
+ "system_properties",
9
+ "runtime_maps",
10
+ "tracer",
11
+ "root_shell",
12
+ "selinux",
13
+ "mounts",
14
+ "frida_ports",
15
+ "instrumentation_threads",
16
+ "exec_mappings",
17
+ "code_integrity",
18
+ "developer_settings",
19
+ "emulator"
20
+ ],
21
+ "optional_probes": []
22
+ },
23
+ "expect": "refused",
24
+ "why": "unread must name each part with why; a list is malformed, so the report is refused rather than read.",
25
+ "report": {
26
+ "installation_id": "00000000-0000-4000-8000-000000000001",
27
+ "challenge_id": "00000000-0000-4000-8000-000000000002",
28
+ "challenge_nonce": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
29
+ "collected_at": 1792857600,
30
+ "version": 1,
31
+ "platform": "android",
32
+ "collector_version": 8,
33
+ "probe_results": {
34
+ "app_identity": {
35
+ "status": "ok",
36
+ "package_name": "com.example.app",
37
+ "version_name": "2.4.1",
38
+ "version_code": 241,
39
+ "debuggable": false,
40
+ "allow_backup": false,
41
+ "cert_sha256": [
42
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
43
+ ],
44
+ "current_signers": [
45
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
46
+ ],
47
+ "signing_lineage": [
48
+ "1b38e2a5a1b0a2a8c6a5b04a8a7c5b7fbfc1c6f0d6a7a7d1bd2c5fa2b1d0a3c4"
49
+ ],
50
+ "apk_sha256": "6f0c1d2e3a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9a0b1c2d3e4f",
51
+ "split_apks": [
52
+ {
53
+ "name": "split_config.arm64_v8a.apk",
54
+ "sha256": "c6c44c7bcd69f06b7a7a3e3c93f4f1869abb38ca56a1bede8ec309250a574036"
55
+ }
56
+ ],
57
+ "installer_package": "com.android.vending",
58
+ "source_dir": "/data/app/com.example.app-1/base.apk"
59
+ },
60
+ "debug_state": {
61
+ "status": "ok",
62
+ "debugger_connected": false,
63
+ "waiting_for_debugger": false
64
+ },
65
+ "root_files": {
66
+ "status": "ok",
67
+ "found_paths": [],
68
+ "build_tags": "release-keys",
69
+ "test_keys": false
70
+ },
71
+ "system_properties": {
72
+ "status": "ok",
73
+ "properties": {
74
+ "ro.secure": "1",
75
+ "ro.debuggable": "0",
76
+ "ro.build.type": "user",
77
+ "ro.build.tags": "release-keys",
78
+ "ro.boot.verifiedbootstate": "green",
79
+ "ro.boot.flash.locked": "1",
80
+ "ro.boot.vbmeta.device_state": "locked",
81
+ "ro.boot.veritymode": "enforcing"
82
+ }
83
+ },
84
+ "runtime_maps": {
85
+ "status": "ok",
86
+ "suspicious_tokens": [],
87
+ "suspicious_line_count": 0,
88
+ "maps_lines": 412
89
+ },
90
+ "tracer": {
91
+ "status": "ok",
92
+ "tracer_pid": 0,
93
+ "seccomp": 2,
94
+ "no_new_privs": 0
95
+ },
96
+ "root_shell": {
97
+ "status": "ok",
98
+ "su_path": "",
99
+ "su_found": false
100
+ },
101
+ "selinux": {
102
+ "status": "ok",
103
+ "mode": "enforcing",
104
+ "getenforce": "Enforcing",
105
+ "enforce_value": "1"
106
+ },
107
+ "mounts": {
108
+ "status": "ok",
109
+ "protected_rw_mounts": []
110
+ },
111
+ "frida_ports": {
112
+ "status": "ok",
113
+ "open_ports": []
114
+ },
115
+ "instrumentation_threads": {
116
+ "status": "ok",
117
+ "frida_threads": [],
118
+ "glib_threads": [],
119
+ "token_threads": [],
120
+ "thread_count": 42
121
+ },
122
+ "exec_mappings": {
123
+ "status": "ok",
124
+ "wx_mappings": 0,
125
+ "wx_bytes": 0,
126
+ "deleted_exec_mappings": 0,
127
+ "deleted_exec_own_code": 0,
128
+ "deleted_exec_jit": 1,
129
+ "anon_exec_labeled": 1,
130
+ "anon_exec_unlabeled": 0,
131
+ "anon_exec_unlabeled_bytes": 0,
132
+ "maps_lines": 412,
133
+ "samples": []
134
+ },
135
+ "code_integrity": {
136
+ "status": "ok",
137
+ "checked": true,
138
+ "diff_bytes": 0,
139
+ "core_diff_bytes": 0,
140
+ "ext_diff_bytes": 0,
141
+ "ext_libs_diff": 0,
142
+ "app_diff_bytes": 0,
143
+ "app_libs_diff": 0,
144
+ "diffed_libs": "",
145
+ "protect_restore_failures": 0,
146
+ "elapsed_ms": 180,
147
+ "core_compared_bytes": 614400,
148
+ "core_expected_bytes": 614400,
149
+ "core_skipped_bytes": 0,
150
+ "core_unreadable_bytes": 0,
151
+ "core_complete": true,
152
+ "ext_compared_bytes": 2097152,
153
+ "ext_expected_bytes": 2097152,
154
+ "ext_skipped_bytes": 0,
155
+ "ext_unreadable_bytes": 0,
156
+ "ext_complete": true,
157
+ "app_compared_bytes": 4194304,
158
+ "app_expected_bytes": 4194304,
159
+ "app_skipped_bytes": 0,
160
+ "app_unreadable_bytes": 0,
161
+ "app_complete": true
162
+ },
163
+ "developer_settings": {
164
+ "status": "ok",
165
+ "developer_options_enabled": false,
166
+ "adb_enabled": false,
167
+ "unread": [
168
+ "adb_enabled"
169
+ ]
170
+ },
171
+ "emulator": {
172
+ "status": "ok",
173
+ "suspected": false,
174
+ "reasons": [],
175
+ "model": "Pixel 8",
176
+ "manufacturer": "Google",
177
+ "product": "shiba",
178
+ "hardware": "shiba"
179
+ },
180
+ "device": {
181
+ "status": "ok",
182
+ "release": "14",
183
+ "sdk_int": 34,
184
+ "security_patch": "2026-10-01",
185
+ "manufacturer": "Google",
186
+ "brand": "google",
187
+ "model": "Pixel 8",
188
+ "device": "shiba",
189
+ "build_id": "AP2A.240905.003",
190
+ "fingerprint": "google/shiba/shiba:14/AP2A.240905.003/12231197:user/release-keys",
191
+ "abi": "arm64-v8a",
192
+ "page_size": 4096
193
+ },
194
+ "network": {
195
+ "status": "ok",
196
+ "vpn_active": false,
197
+ "http_proxy_configured": false,
198
+ "transports": [
199
+ "wifi"
200
+ ],
201
+ "interfaces": [
202
+ "wlan0"
203
+ ]
204
+ }
205
+ },
206
+ "enabled_measurements": []
207
+ }
208
+ }