From 61947d17af58f89b04b261fe996f9759e082f759 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 20:51:11 +0100 Subject: [PATCH 1/5] Add new iOS versions and build numbers (#738) --- src/mvt/ios/data/ios_versions.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/mvt/ios/data/ios_versions.json b/src/mvt/ios/data/ios_versions.json index 1ceccf6..0b95e5e 100644 --- a/src/mvt/ios/data/ios_versions.json +++ b/src/mvt/ios/data/ios_versions.json @@ -631,6 +631,10 @@ "build": "16H81", "version": "12.5.7" }, + { + "version": "12.5.8", + "build": "16H88" + }, { "build": "17A577", "version": "13.0" @@ -899,6 +903,10 @@ "version": "15.8.5", "build": "19H394" }, + { + "version": "15.8.6", + "build": "19H402" + }, { "build": "20A362", "version": "16.0" @@ -1008,6 +1016,10 @@ "version": "16.7.12", "build": "20H364" }, + { + "version": "16.7.14", + "build": "20H370" + }, { "version": "17.0", "build": "21A327" @@ -1164,6 +1176,10 @@ "version": "18.7.3", "build": "22H217" }, + { + "version": "18.7.4", + "build": "22H218" + }, { "version": "26", "build": "23A341" @@ -1179,5 +1195,9 @@ { "version": "26.2", "build": "23C55" + }, + { + "version": "26.2.1", + "build": "23C71" } ] \ No newline at end of file From c8f82f796bcfab80ed15e292758a7de20b8de3fb Mon Sep 17 00:00:00 2001 From: Max-RSF Date: Mon, 16 Feb 2026 17:11:16 +0100 Subject: [PATCH 2/5] Add AQF support for bugreport modules (#741) --- src/mvt/android/modules/bugreport/base.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mvt/android/modules/bugreport/base.py b/src/mvt/android/modules/bugreport/base.py index 158bc28..367393b 100644 --- a/src/mvt/android/modules/bugreport/base.py +++ b/src/mvt/android/modules/bugreport/base.py @@ -84,13 +84,17 @@ class BugReportModule(MVTModule): return self._get_file_content(main_content.decode().strip()) except KeyError: return None - else: - dumpstate_logs = self._get_files_by_pattern("dumpState_*.log") - if not dumpstate_logs: - return None + dumpstate_logs = self._get_files_by_pattern("dumpState_*.log") + if dumpstate_logs: return self._get_file_content(dumpstate_logs[0]) + dumpsys_files = self._get_files_by_pattern("*/dumpsys.txt") + if dumpsys_files: + return self._get_file_content(dumpsys_files[0]) + + return None + def _get_file_modification_time(self, file_path: str) -> dict: if self.zip_archive: file_timetuple = self.zip_archive.getinfo(file_path).date_time From 0134bf80d17a0a0e0c69d43ae465be3d8ffbe624 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 08:47:07 -0500 Subject: [PATCH 3/5] Add new iOS versions and build numbers (#739) Co-authored-by: DonnchaC --- src/mvt/ios/data/ios_versions.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mvt/ios/data/ios_versions.json b/src/mvt/ios/data/ios_versions.json index 0b95e5e..9d0096e 100644 --- a/src/mvt/ios/data/ios_versions.json +++ b/src/mvt/ios/data/ios_versions.json @@ -1180,6 +1180,10 @@ "version": "18.7.4", "build": "22H218" }, + { + "version": "18.7.5", + "build": "22H311" + }, { "version": "26", "build": "23A341" @@ -1199,5 +1203,9 @@ { "version": "26.2.1", "build": "23C71" + }, + { + "version": "26.3", + "build": "23D127" } ] \ No newline at end of file From e2f8437831ee606803b39d63d98046f005b3cb56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 05:48:15 +0100 Subject: [PATCH 4/5] Add new iOS versions and build numbers (#742) Co-authored-by: DonnchaC --- src/mvt/ios/data/ios_versions.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/mvt/ios/data/ios_versions.json b/src/mvt/ios/data/ios_versions.json index 9d0096e..418da6c 100644 --- a/src/mvt/ios/data/ios_versions.json +++ b/src/mvt/ios/data/ios_versions.json @@ -1184,6 +1184,10 @@ "version": "18.7.5", "build": "22H311" }, + { + "version": "18.7.6", + "build": "22H320" + }, { "version": "26", "build": "23A341" @@ -1207,5 +1211,9 @@ { "version": "26.3", "build": "23D127" + }, + { + "version": "26.3.1", + "build": "23D8133" } ] \ No newline at end of file From f2d9f420f214ad4b6f5f002ee9e396efc6069d36 Mon Sep 17 00:00:00 2001 From: besendorf Date: Mon, 16 Mar 2026 12:32:54 +0100 Subject: [PATCH 5/5] Detect uninstall and downgrade in battery daily (#736) --- .../artifacts/dumpsys_battery_daily.py | 63 +++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/src/mvt/android/artifacts/dumpsys_battery_daily.py b/src/mvt/android/artifacts/dumpsys_battery_daily.py index 06b980b..c7bcc6a 100644 --- a/src/mvt/android/artifacts/dumpsys_battery_daily.py +++ b/src/mvt/android/artifacts/dumpsys_battery_daily.py @@ -14,12 +14,23 @@ class DumpsysBatteryDailyArtifact(AndroidArtifact): """ def serialize(self, record: dict) -> Union[dict, list]: + action = record.get("action", "update") + package_name = record["package_name"] + vers = record["vers"] + + if vers == "0": + data = f"Recorded uninstall of package {package_name} (vers 0)" + elif action == "downgrade": + prev_vers = record.get("previous_vers", "unknown") + data = f"Recorded downgrade of package {package_name} from vers {prev_vers} to vers {vers}" + else: + data = f"Recorded update of package {package_name} with vers {vers}" + return { "timestamp": record["from"], "module": self.__class__.__name__, "event": "battery_daily", - "data": f"Recorded update of package {record['package_name']} " - f"with vers {record['vers']}", + "data": data, } def check_indicators(self) -> None: @@ -36,6 +47,7 @@ class DumpsysBatteryDailyArtifact(AndroidArtifact): def parse(self, output: str) -> None: daily = None daily_updates = [] + package_versions = {} # Track package versions to detect downgrades for line in output.splitlines(): if line.startswith(" Daily from "): if len(daily_updates) > 0: @@ -64,15 +76,44 @@ class DumpsysBatteryDailyArtifact(AndroidArtifact): break if not already_seen: - daily_updates.append( - { - "action": "update", - "from": daily["from"], - "to": daily["to"], - "package_name": package_name, - "vers": vers_nr, - } - ) + update_record = { + "action": "update", + "from": daily["from"], + "to": daily["to"], + "package_name": package_name, + "vers": vers_nr, + } + + # Check for uninstall (version 0) + if vers_nr == "0": + self.log.warning( + "Detected uninstall of package %s (vers 0) on %s", + package_name, + daily["from"], + ) + # Check for downgrade + elif package_name in package_versions: + try: + current_vers = int(vers_nr) + previous_vers = int(package_versions[package_name]) + if current_vers < previous_vers: + update_record["action"] = "downgrade" + update_record["previous_vers"] = str(previous_vers) + self.log.warning( + "Detected downgrade of package %s from vers %d to vers %d on %s", + package_name, + previous_vers, + current_vers, + daily["from"], + ) + except ValueError: + # If version numbers aren't integers, skip comparison + pass + + # Update tracking dictionary + package_versions[package_name] = vers_nr + + daily_updates.append(update_record) if len(daily_updates) > 0: self.results.extend(daily_updates)