mirror of
https://github.com/mvt-project/mvt.git
synced 2026-04-21 11:16:20 +02:00
Abort analysis and warn user when backup is encrypted
When `check-backup` is run against an encrypted backup, Manifest.db cannot be opened as a plain SQLite database. Previously this caused a flood of confusing "file is not a database" errors across all modules. Now the Manifest module detects the sqlite3.DatabaseError on its first query and raises a new EncryptedBackupError. This exception propagates out of run_module() and is caught in Command.run(), which logs a clear critical message instructing the user to decrypt the backup first with `mvt-ios decrypt-backup`, then stops the analysis immediately. Fixes #769
This commit is contained in:
@@ -11,7 +11,7 @@ from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from mvt.common.indicators import Indicators
|
||||
from mvt.common.module import MVTModule, run_module, save_timeline
|
||||
from mvt.common.module import EncryptedBackupError, MVTModule, run_module, save_timeline
|
||||
from mvt.common.utils import (
|
||||
convert_datetime_to_iso,
|
||||
generate_hashes_from_path,
|
||||
@@ -244,7 +244,14 @@ class Command:
|
||||
except NotImplementedError:
|
||||
pass
|
||||
|
||||
run_module(m)
|
||||
try:
|
||||
run_module(m)
|
||||
except EncryptedBackupError:
|
||||
log.critical(
|
||||
"The backup appears to be encrypted. "
|
||||
"Please decrypt it first using `mvt-ios decrypt-backup`."
|
||||
)
|
||||
return
|
||||
|
||||
self.executed.append(m)
|
||||
|
||||
|
||||
@@ -21,6 +21,10 @@ class DatabaseCorruptedError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class EncryptedBackupError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class InsufficientPrivileges(Exception):
|
||||
pass
|
||||
|
||||
@@ -169,6 +173,8 @@ def run_module(module: MVTModule) -> None:
|
||||
|
||||
try:
|
||||
exec_or_profile("module.run()", globals(), locals())
|
||||
except EncryptedBackupError:
|
||||
raise
|
||||
except NotImplementedError:
|
||||
module.log.exception(
|
||||
"The run() procedure of module %s was not implemented yet!",
|
||||
|
||||
@@ -8,9 +8,10 @@ import io
|
||||
import logging
|
||||
import os
|
||||
import plistlib
|
||||
import sqlite3
|
||||
from typing import Optional
|
||||
|
||||
from mvt.common.module import DatabaseNotFoundError
|
||||
from mvt.common.module import DatabaseNotFoundError, EncryptedBackupError
|
||||
from mvt.common.url import URL
|
||||
from mvt.common.utils import convert_datetime_to_iso, convert_unix_to_iso
|
||||
|
||||
@@ -127,7 +128,14 @@ class Manifest(IOSExtraction):
|
||||
conn = self._open_sqlite_db(manifest_db_path)
|
||||
cur = conn.cursor()
|
||||
|
||||
cur.execute("SELECT * FROM Files;")
|
||||
try:
|
||||
cur.execute("SELECT * FROM Files;")
|
||||
except sqlite3.DatabaseError:
|
||||
conn.close()
|
||||
raise EncryptedBackupError(
|
||||
"Manifest.db is not a valid SQLite database. "
|
||||
"The backup may be encrypted."
|
||||
)
|
||||
names = [description[0] for description in cur.description]
|
||||
|
||||
for file_entry in cur:
|
||||
|
||||
Reference in New Issue
Block a user