From 5356a399c9cef8b5ae45f8cbe3938f1f70877a3a Mon Sep 17 00:00:00 2001 From: tek Date: Wed, 17 Aug 2022 18:24:51 +0200 Subject: [PATCH] Moves dumpsys parsing to android parsers and use the same parser for adb and bugreport modules --- mvt/android/modules/adb/packages.py | 46 ++---- mvt/android/modules/bugreport/packages.py | 91 +----------- mvt/android/parsers/dumpsys.py | 131 ++++++++++++++++++ ..._bugreport_appops.py => test_bugreport.py} | 20 ++- tests/android/test_dumpsys_parser.py | 18 ++- .../android_data/bugreport/dumpstate.txt | 125 +++++++++++++++++ .../android_data/dumpsys_packages.txt | 126 +++++++++++++++++ 7 files changed, 430 insertions(+), 127 deletions(-) rename tests/android/{test_bugreport_appops.py => test_bugreport.py} (57%) create mode 100644 tests/artifacts/android_data/dumpsys_packages.txt diff --git a/mvt/android/modules/adb/packages.py b/mvt/android/modules/adb/packages.py index 55cc832..c22aa1d 100644 --- a/mvt/android/modules/adb/packages.py +++ b/mvt/android/modules/adb/packages.py @@ -11,6 +11,7 @@ from rich.progress import track from rich.table import Table from rich.text import Text +from mvt.android.parsers.dumpsys import parse_dumpsys_package_for_details from mvt.common.virustotal import VTNoKey, VTQuotaExceeded, virustotal_lookup from .base import AndroidExtraction @@ -191,43 +192,18 @@ class Packages(AndroidExtraction): @staticmethod def parse_package_for_details(output: str) -> dict: - details = { - "uid": "", - "version_name": "", - "version_code": "", - "timestamp": "", - "first_install_time": "", - "last_update_time": "", - "requested_permissions": [], - } - - in_permissions = False + # Get only the package information + lines = [] + in_packages = False for line in output.splitlines(): - if in_permissions: - if line.startswith(" " * 4) and not line.startswith(" " * 6): - in_permissions = False - continue + if in_packages: + if line.strip() == "": + break + lines.append(line) + if line.strip() == "Packages:": + in_packages = True - permission = line.strip().split(":")[0] - details["requested_permissions"].append(permission) - - if line.strip().startswith("userId="): - details["uid"] = line.split("=")[1].strip() - elif line.strip().startswith("versionName="): - details["version_name"] = line.split("=")[1].strip() - elif line.strip().startswith("versionCode="): - details["version_code"] = line.split("=", 1)[1].strip() - elif line.strip().startswith("timeStamp="): - details["timestamp"] = line.split("=")[1].strip() - elif line.strip().startswith("firstInstallTime="): - details["first_install_time"] = line.split("=")[1].strip() - elif line.strip().startswith("lastUpdateTime="): - details["last_update_time"] = line.split("=")[1].strip() - elif line.strip() == "requested permissions:": - in_permissions = True - continue - - return details + return parse_dumpsys_package_for_details("\n".join(lines)) def _get_files_for_package(self, package_name: str) -> list: output = self._adb_command(f"pm path {package_name}") diff --git a/mvt/android/modules/bugreport/packages.py b/mvt/android/modules/bugreport/packages.py index e63ff5d..941822d 100644 --- a/mvt/android/modules/bugreport/packages.py +++ b/mvt/android/modules/bugreport/packages.py @@ -4,9 +4,9 @@ # https://license.mvt.re/1.1/ import logging -import re from typing import Optional, Union +from mvt.android.parsers.dumpsys import parse_dumpsys_packages from mvt.android.modules.adb.packages import (DANGEROUS_PERMISSIONS, DANGEROUS_PERMISSIONS_THRESHOLD, ROOT_PACKAGES) @@ -76,89 +76,6 @@ class Packages(BugReportModule): self.detected.append(result) continue - @staticmethod - def parse_package_for_details(output: str) -> dict: - details = { - "uid": "", - "version_name": "", - "version_code": "", - "timestamp": "", - "first_install_time": "", - "last_update_time": "", - "requested_permissions": [], - } - - in_install_permissions = False - in_runtime_permissions = False - for line in output.splitlines(): - if in_install_permissions: - if line.startswith(" " * 4) and not line.startswith(" " * 6): - in_install_permissions = False - continue - - permission = line.strip().split(":")[0] - if permission not in details["requested_permissions"]: - details["requested_permissions"].append(permission) - - if in_runtime_permissions: - if not line.startswith(" " * 8): - in_runtime_permissions = False - continue - - permission = line.strip().split(":")[0] - if permission not in details["requested_permissions"]: - details["requested_permissions"].append(permission) - - if line.strip().startswith("userId="): - details["uid"] = line.split("=")[1].strip() - elif line.strip().startswith("versionName="): - details["version_name"] = line.split("=")[1].strip() - elif line.strip().startswith("versionCode="): - details["version_code"] = line.split("=", 1)[1].strip() - elif line.strip().startswith("timeStamp="): - details["timestamp"] = line.split("=")[1].strip() - elif line.strip().startswith("firstInstallTime="): - details["first_install_time"] = line.split("=")[1].strip() - elif line.strip().startswith("lastUpdateTime="): - details["last_update_time"] = line.split("=")[1].strip() - elif line.strip() == "install permissions:": - in_install_permissions = True - elif line.strip() == "runtime permissions:": - in_runtime_permissions = True - - return details - - def parse_packages_list(self, output: str) -> list: - pkg_rxp = re.compile(r" Package \[(.+?)\].*") - - results = [] - package_name = None - package = {} - lines = [] - for line in output.splitlines(): - if line.startswith(" Package ["): - if len(lines) > 0: - details = self.parse_package_for_details("\n".join(lines)) - package.update(details) - results.append(package) - lines = [] - package = {} - - matches = pkg_rxp.findall(line) - if not matches: - continue - - package_name = matches[0] - package["package_name"] = package_name - continue - - if not package_name: - continue - - lines.append(line) - - return results - def run(self) -> None: content = self._get_dumpstate_file() if not content: @@ -189,12 +106,12 @@ class Packages(BugReportModule): lines.append(line) - self.results = self.parse_packages_list("\n".join(lines)) + self.results = parse_dumpsys_packages("\n".join(lines)) for result in self.results: dangerous_permissions_count = 0 - for perm in result["requested_permissions"]: - if perm in DANGEROUS_PERMISSIONS: + for perm in result["permissions"]: + if perm["name"] in DANGEROUS_PERMISSIONS: dangerous_permissions_count += 1 if dangerous_permissions_count >= DANGEROUS_PERMISSIONS_THRESHOLD: diff --git a/mvt/android/parsers/dumpsys.py b/mvt/android/parsers/dumpsys.py index 1302d54..ac8d3fd 100644 --- a/mvt/android/parsers/dumpsys.py +++ b/mvt/android/parsers/dumpsys.py @@ -387,3 +387,134 @@ def parse_dumpsys_appops(output: str) -> list: results.append(package) return results + + +def parse_dumpsys_package_for_details(output: str) -> dict: + """ + Parse one entry of a dumpsys package information + """ + details = { + "uid": "", + "version_name": "", + "version_code": "", + "timestamp": "", + "first_install_time": "", + "last_update_time": "", + "permissions": [], + "requested_permissions": [], + } + + in_install_permissions = False + in_runtime_permissions = False + in_declared_permissions = False + in_requested_permissions = True + for line in output.splitlines(): + if in_install_permissions: + if line.startswith(" " * 4) and not line.startswith(" " * 6): + in_install_permissions = False + else: + lineinfo = line.strip().split(":") + permission = lineinfo[0] + granted = None + if "granted=" in lineinfo[1]: + granted = ("granted=true" in lineinfo[1]) + + details["permissions"].append({ + "name": permission, + "granted": granted, + "type": "install" + }) + + if in_runtime_permissions: + if not line.startswith(" " * 8): + in_runtime_permissions = False + else: + lineinfo = line.strip().split(":") + permission = lineinfo[0] + granted = None + if "granted=" in lineinfo[1]: + granted = ("granted=true" in lineinfo[1]) + + details["permissions"].append({ + "name": permission, + "granted": granted, + "type": "runtime" + }) + + if in_declared_permissions: + if not line.startswith(" " * 6): + in_declared_permissions = False + else: + permission = line.strip().split(":")[0] + details["permissions"].append({ + "name": permission, + "type": "declared" + }) + if in_requested_permissions: + if not line.startswith(" " * 6): + in_requested_permissions = False + else: + details["requested_permissions"].append(line.strip()) + + if line.strip().startswith("userId="): + details["uid"] = line.split("=")[1].strip() + elif line.strip().startswith("versionName="): + details["version_name"] = line.split("=")[1].strip() + elif line.strip().startswith("versionCode="): + details["version_code"] = line.split("=", 1)[1].strip() + elif line.strip().startswith("timeStamp="): + details["timestamp"] = line.split("=")[1].strip() + elif line.strip().startswith("firstInstallTime="): + details["first_install_time"] = line.split("=")[1].strip() + elif line.strip().startswith("lastUpdateTime="): + details["last_update_time"] = line.split("=")[1].strip() + elif line.strip() == "install permissions:": + in_install_permissions = True + elif line.strip() == "runtime permissions:": + in_runtime_permissions = True + elif line.strip() == "declared permissions:": + in_declared_permissions = True + elif line.strip() == "requested permissions:": + in_requested_permissions = True + + return details + + +def parse_dumpsys_packages(output: str) -> list: + """ + Parse the dumpsys package service data + """ + pkg_rxp = re.compile(r" Package \[(.+?)\].*") + + results = [] + package_name = None + package = {} + lines = [] + for line in output.splitlines(): + if line.startswith(" Package ["): + if len(lines) > 0: + details = parse_dumpsys_package_for_details("\n".join(lines)) + package.update(details) + results.append(package) + lines = [] + package = {} + + matches = pkg_rxp.findall(line) + if not matches: + continue + + package_name = matches[0] + package["package_name"] = package_name + continue + + if not package_name: + continue + + lines.append(line) + + if len(lines) > 0: + details = parse_dumpsys_package_for_details("\n".join(lines)) + package.update(details) + results.append(package) + + return results diff --git a/tests/android/test_bugreport_appops.py b/tests/android/test_bugreport.py similarity index 57% rename from tests/android/test_bugreport_appops.py rename to tests/android/test_bugreport.py index 98bb278..36a92c7 100644 --- a/tests/android/test_bugreport_appops.py +++ b/tests/android/test_bugreport.py @@ -7,24 +7,36 @@ import os from pathlib import Path from mvt.android.modules.bugreport.appops import Appops +from mvt.android.modules.bugreport.packages import Packages from mvt.common.module import run_module from ..utils import get_artifact_folder -class TestAppopsModule: +class TestBugreportAnalysis: - def test_appops_parsing(self): + def launch_bug_report_module(self, module): fpath = os.path.join(get_artifact_folder(), "android_data/bugreport/") - m = Appops(target_path=fpath) + m = module(target_path=fpath) folder_files = [] parent_path = Path(fpath).absolute().as_posix() for root, subdirs, subfiles in os.walk(os.path.abspath(fpath)): for file_name in subfiles: folder_files.append(os.path.relpath(os.path.join(root, file_name), parent_path)) m.from_folder(fpath, folder_files) - run_module(m) + return m + + def test_appops_module(self): + m = self.launch_bug_report_module(Appops) assert len(m.results) == 12 assert len(m.timeline) == 16 assert len(m.detected) == 0 + + def test_packages_module(self): + m = self.launch_bug_report_module(Packages) + assert len(m.results) == 2 + assert m.results[0]["package_name"] == "com.samsung.android.provider.filterprovider" + assert m.results[1]["package_name"] == "com.instagram.android" + assert len(m.results[0]["permissions"]) == 4 + assert len(m.results[1]["permissions"]) == 32 diff --git a/tests/android/test_dumpsys_parser.py b/tests/android/test_dumpsys_parser.py index da5dcbc..7675c94 100644 --- a/tests/android/test_dumpsys_parser.py +++ b/tests/android/test_dumpsys_parser.py @@ -4,7 +4,8 @@ # https://license.mvt.re/1.1/ from mvt.android.parsers.dumpsys import (parse_dumpsys_appops, - parse_dumpsys_battery_history) + parse_dumpsys_battery_history, + parse_dumpsys_packages) from ..utils import get_artifact @@ -43,3 +44,18 @@ class TestDumpsysParsing: assert res[2]["package_name"] == "com.whatsapp" assert res[3]["event"] == "end_top" assert res[4]["package_name"] == "com.sec.android.app.launcher" + + def test_packages_parsing(self): + file = get_artifact("android_data/dumpsys_packages.txt") + with open(file) as f: + data = f.read() + + res = parse_dumpsys_packages(data) + + assert len(res) == 2 + assert res[0]["package_name"] == "com.samsung.android.provider.filterprovider" + assert res[1]["package_name"] == "com.sec.android.app.DataCreate" + assert len(res[0]["permissions"]) == 4 + assert len(res[0]["requested_permissions"]) == 0 + assert len(res[1]["permissions"]) == 34 + assert len(res[1]["requested_permissions"]) == 11 diff --git a/tests/artifacts/android_data/bugreport/dumpstate.txt b/tests/artifacts/android_data/bugreport/dumpstate.txt index aace052..b30d30b 100644 --- a/tests/artifacts/android_data/bugreport/dumpstate.txt +++ b/tests/artifacts/android_data/bugreport/dumpstate.txt @@ -124,3 +124,128 @@ DUMP OF SERVICE appwidget: Providers: [0] provider ProviderId{user:0, app:10107, cmp:ComponentInfo{com.sec.android.app.clockpackage/com.sec.android.app.clockpackage.alarmwidget.ClockAlarmWidgetProvider}} +--------- 0.002s was the duration of dumpsys overlay, ending at: 2022-08-17 15:31:55 +------------------------------------------------------------------------------- +DUMP OF SERVICE package: +Database versions: + Internal: + sdkVersion=29 databaseVersion=3 + External: + sdkVersion=28 databaseVersion=3 + +Verifiers: + Required: com.android.vending (uid=10019) + +Intent Filter Verifier: + Using: com.google.android.gms (uid=10012) + +Packages: + Package [com.samsung.android.provider.filterprovider] (d64f8e0): + userId=1000 + sharedUser=SharedUserSetting{cb92b86 android.uid.system/1000} + pkg=Package{5be8c47 com.samsung.android.provider.filterprovider} + codePath=/system/app/FilterProvider + resourcePath=/system/app/FilterProvider + legacyNativeLibraryDir=/system/app/FilterProvider/lib + primaryCpuAbi=armeabi-v7a + secondaryCpuAbi=null + versionCode=500700000 minSdk=28 targetSdk=28 + versionName=5.0.07 + splits=[base] + apkSigningVersion=2 + applicationInfo=ApplicationInfo{acc0439 com.samsung.android.provider.filterprovider} + flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ] + privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE ] + dataDir=/data/user/0/com.samsung.android.provider.filterprovider + supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] + usesLibraries: + android.hidl.manager-V1.0-java + android.hidl.base-V1.0-java + usesLibraryFiles: + /system/framework/android.hidl.manager-V1.0-java.jar + /system/framework/android.hidl.base-V1.0-java.jar + timeStamp=2008-12-31 16:00:00 + firstInstallTime=2008-12-31 16:00:00 + lastUpdateTime=2008-12-31 16:00:00 + signatures=PackageSignatures{6c98c74 version:2, signatures:[b378e95c], past signatures:[]} + installPermissionsFixed=true + pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ] + declared permissions: + com.samsung.android.provider.filterprovider.permission.READ_FILTER: prot=normal, INSTALLED + com.samsung.android.provider.filterprovider.permission.WRITE_FILTER: prot=signature, INSTALLED + com.samsung.android.provider.filterprovider.permission.RECEIVE_UPDATE: prot=signature, INSTALLED + com.sec.android.camera.permission.USE_EFFECT_FILTER: prot=signature, INSTALLED + User 0: ceDataInode=-4294835840 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false virtual=false + Package [com.instagram.android] (c716d35): + userId=10164 + pkg=Package{a61df24 com.instagram.android} + codePath=/data/app/com.instagram.android-0mrt4tCf3oHIUTc_FFSStA== + resourcePath=/data/app/com.instagram.android-0mrt4tCf3oHIUTc_FFSStA== + legacyNativeLibraryDir=/data/app/com.instagram.android-0mrt4tCf3oHIUTc_FFSStA==/lib + primaryCpuAbi=armeabi-v7a + secondaryCpuAbi=null + versionCode=364105349 minSdk=21 targetSdk=31 + versionName=241.1.0.18.114 + splits=[base] + apkSigningVersion=2 + applicationInfo=ApplicationInfo{80b0d30 com.instagram.android} + flags=[ HAS_CODE ALLOW_TASK_REPARENTING ALLOW_CLEAR_USER_DATA ALLOW_BACKUP KILL_AFTER_RESTORE LARGE_HEAP ] + privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE ALLOW_AUDIO_PLAYBACK_CAPTURE PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE HAS_DOMAIN_URLS PARTIALLY_DIRECT_BOOT_AWARE ] + dataDir=/data/user/0/com.instagram.android + supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] + timeStamp=2022-06-29 23:28:46 + firstInstallTime=2020-06-12 00:41:34 + lastUpdateTime=2022-06-29 23:28:51 + installerPackageName=com.android.vending + signatures=PackageSignatures{7812a8d version:2, signatures:[43c4b509], past signatures:[]} + installPermissionsFixed=true + pkgFlags=[ HAS_CODE ALLOW_TASK_REPARENTING ALLOW_CLEAR_USER_DATA ALLOW_BACKUP KILL_AFTER_RESTORE LARGE_HEAP ] + declared permissions: + com.instagram.android.permission.SYSTEM_ONLY: prot=signature|privileged, INSTALLED + com.instagram.android.permission.RECEIVE_ADM_MESSAGE: prot=signature, INSTALLED + com.instagram.android.permission.CROSS_PROCESS_BROADCAST_MANAGER: prot=signature, INSTALLED + install permissions: + com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE: granted=true + com.google.android.c2dm.permission.RECEIVE: granted=true + android.permission.USE_CREDENTIALS: granted=true + android.permission.MODIFY_AUDIO_SETTINGS: granted=true + android.permission.FOREGROUND_SERVICE: granted=true + android.permission.RECEIVE_BOOT_COMPLETED: granted=true + com.instagram.android.permission.CROSS_PROCESS_BROADCAST_MANAGER: granted=true + com.android.launcher.permission.UNINSTALL_SHORTCUT: granted=true + android.permission.READ_PROFILE: granted=true + android.permission.BLUETOOTH: granted=true + com.facebook.services.identity.FEO2: granted=true + android.permission.INTERNET: granted=true + android.permission.REORDER_TASKS: granted=true + com.android.vending.BILLING: granted=true + android.permission.BLUETOOTH_ADMIN: granted=true + android.permission.USE_FULL_SCREEN_INTENT: granted=true + android.permission.BROADCAST_STICKY: granted=true + User 0: ceDataInode=-4294835341 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=4 instant=false virtual=false + lastDisabledCaller: auto_disabler + gids=[3002, 3003, 3001] + runtime permissions: + android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.READ_PHONE_NUMBERS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.READ_EXTERNAL_STORAGE: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED|RESTRICTION_INSTALLER_EXEMPT|RESTRICTION_UPGRADE_EXEMPT] + android.permission.ACCESS_COARSE_LOCATION: granted=false, flags=[ USER_SET|REVOKE_WHEN_REQUESTED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.READ_PHONE_STATE: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.CALL_PHONE: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.CAMERA: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.GET_ACCOUNTS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.WRITE_EXTERNAL_STORAGE: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED|RESTRICTION_INSTALLER_EXEMPT|RESTRICTION_UPGRADE_EXEMPT] + android.permission.RECORD_AUDIO: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.READ_CONTACTS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + android.permission.ACCESS_MEDIA_LOCATION: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] + disabledComponents: + com.instagram.direct.share.handler.DirectExternalMediaShareActivityVideoInterop + com.instagram.direct.share.handler.DirectShareHandlerActivityInterop + com.instagram.direct.share.handler.DirectExternalPhotoShareActivityInterop + com.facebook.rti.push.service.FbnsService + com.instagram.direct.share.handler.DirectMultipleExternalMediaShareActivity + com.instagram.share.handleractivity.ClipsShareHandlerActivity + com.instagram.direct.share.handler.DirectMultipleExternalMediaShareActivityInterop + + + diff --git a/tests/artifacts/android_data/dumpsys_packages.txt b/tests/artifacts/android_data/dumpsys_packages.txt new file mode 100644 index 0000000..356f185 --- /dev/null +++ b/tests/artifacts/android_data/dumpsys_packages.txt @@ -0,0 +1,126 @@ +Verifiers: + Required: com.android.vending (uid=10019) + +Intent Filter Verifier: + Using: com.google.android.gms (uid=10012) + +Libraries: + android.test.base -> (jar) /system/framework/android.test.base.jar + android.test.mock -> (jar) /system/framework/android.test.mock.jar + + + +Packages: + Package [com.samsung.android.provider.filterprovider] (d64f8e0): + userId=1000 + sharedUser=SharedUserSetting{cb92b86 android.uid.system/1000} + pkg=Package{5be8c47 com.samsung.android.provider.filterprovider} + codePath=/system/app/FilterProvider + resourcePath=/system/app/FilterProvider + legacyNativeLibraryDir=/system/app/FilterProvider/lib + primaryCpuAbi=armeabi-v7a + secondaryCpuAbi=null + versionCode=500700000 minSdk=28 targetSdk=28 + versionName=5.0.07 + splits=[base] + apkSigningVersion=2 + applicationInfo=ApplicationInfo{acc0439 com.samsung.android.provider.filterprovider} + flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ] + privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE ] + dataDir=/data/user/0/com.samsung.android.provider.filterprovider + supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] + usesLibraries: + android.hidl.manager-V1.0-java + android.hidl.base-V1.0-java + usesLibraryFiles: + /system/framework/android.hidl.manager-V1.0-java.jar + /system/framework/android.hidl.base-V1.0-java.jar + timeStamp=2008-12-31 16:00:00 + firstInstallTime=2008-12-31 16:00:00 + lastUpdateTime=2008-12-31 16:00:00 + signatures=PackageSignatures{6c98c74 version:2, signatures:[b378e95c], past signatures:[]} + installPermissionsFixed=true + pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ] + declared permissions: + com.samsung.android.provider.filterprovider.permission.READ_FILTER: prot=normal, INSTALLED + com.samsung.android.provider.filterprovider.permission.WRITE_FILTER: prot=signature, INSTALLED + com.samsung.android.provider.filterprovider.permission.RECEIVE_UPDATE: prot=signature, INSTALLED + com.sec.android.camera.permission.USE_EFFECT_FILTER: prot=signature, INSTALLED + User 0: ceDataInode=-4294835840 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false virtual=false + Package [com.sec.android.app.DataCreate] (d151a2): + userId=10143 + pkg=Package{254559d com.sec.android.app.DataCreate} + codePath=/system/app/AutomationTest_FB + resourcePath=/system/app/AutomationTest_FB + legacyNativeLibraryDir=/system/app/AutomationTest_FB/lib + primaryCpuAbi=null + secondaryCpuAbi=null + versionCode=1 minSdk=29 targetSdk=29 + versionName=1.0 + splits=[base] + apkSigningVersion=2 + applicationInfo=ApplicationInfo{46c7a12 com.sec.android.app.DataCreate} + flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ] + privateFlags=[ PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ALLOW_AUDIO_PLAYBACK_CAPTURE ] + dataDir=/data/user/0/com.sec.android.app.DataCreate + supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] + timeStamp=2008-12-31 16:00:00 + firstInstallTime=2008-12-31 16:00:00 + lastUpdateTime=2008-12-31 16:00:00 + signatures=PackageSignatures{b4da5e3 version:2, signatures:[b378e95c], past signatures:[]} + installPermissionsFixed=true + pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ] + declared permissions: + com.sec.android.app.DataCreate.permission.KEYSTRING: prot=signature|privileged, INSTALLED + requested permissions: + android.permission.ACCESS_WIFI_STATE + android.permission.INTERNET + android.permission.ACCESS_NETWORK_STATE + android.permission.WAKE_LOCK + android.permission.GET_ACCOUNTS + android.permission.USE_CREDENTIALS + android.permission.RECEIVE_BOOT_COMPLETED + android.permission.VIBRATE + android.permission.FOREGROUND_SERVICE + android.permission.USE_FULL_SCREEN_INTENT + com.google.android.c2dm.permission.RECEIVE + install permissions: + android.permission.WRITE_SETTINGS: granted=true + com.samsung.android.launcher.permission.WRITE_SETTINGS: granted=true + android.permission.RESTART_PACKAGES: granted=true + android.permission.ACCESS_CHECKIN_PROPERTIES: granted=true + com.sec.android.app.clockpackage.permission.READ_WCCONTENT: granted=true + android.permission.BLUETOOTH: granted=true + android.permission.WRITE_MEDIA_STORAGE: granted=true + com.sec.android.app.DataCreate.permission.KEYSTRING: granted=true + android.permission.INTERNET: granted=true + com.android.browser.permission.READ_HISTORY_BOOKMARKS: granted=true + android.permission.WRITE_SECURE_SETTINGS: granted=true + android.permission.READ_PRIVILEGED_PHONE_STATE: granted=true + android.permission.WRITE_SMS: granted=true + com.sec.android.app.clockpackage.permission.WRITE_WCCONTENT: granted=true + android.permission.sec.RECEIVE_BLOCKED_SMS_MMS: granted=true + android.permission.START_ACTIVITIES_FROM_BACKGROUND: granted=true + com.android.browser.permission.WRITE_HISTORY_BOOKMARKS: granted=true + com.sec.android.app.phoneutil.permission.KEYSTRING: granted=true + android.permission.ACCESS_WIFI_STATE: granted=true + android.permission.MANAGE_APP_OPS_MODES: granted=true + User 0: ceDataInode=-4294835694 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false virtual=false + gids=[3002, 1023, 3003] + runtime permissions: + android.permission.READ_SMS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.READ_CALENDAR: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED] + android.permission.READ_CALL_LOG: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.RECEIVE_MMS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.READ_EXTERNAL_STORAGE: granted=false, flags=[ REVOKE_WHEN_REQUESTED|USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.SEND_SMS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.WRITE_CONTACTS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED] + android.permission.CAMERA: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED] + android.permission.WRITE_CALENDAR: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED] + android.permission.WRITE_CALL_LOG: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.GET_ACCOUNTS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED] + android.permission.WRITE_EXTERNAL_STORAGE: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|RESTRICTION_UPGRADE_EXEMPT] + android.permission.READ_CONTACTS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED] + + +