mirror of
https://github.com/mvt-project/mvt.git
synced 2026-03-26 21:40:25 +01:00
Compare commits
6 Commits
feature/up
...
bugfix/ioc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17b58ac90b | ||
|
|
5cba61b180 | ||
|
|
29475acb47 | ||
|
|
1d5c83582c | ||
|
|
2dd1428787 | ||
|
|
f2d9f420f2 |
@@ -2,4 +2,4 @@ mkdocs==1.6.1
|
|||||||
mkdocs-autorefs==1.4.3
|
mkdocs-autorefs==1.4.3
|
||||||
mkdocs-material==9.6.20
|
mkdocs-material==9.6.20
|
||||||
mkdocs-material-extensions==1.3.1
|
mkdocs-material-extensions==1.3.1
|
||||||
mkdocstrings==0.30.1
|
mkdocstrings==1.0.0
|
||||||
@@ -17,7 +17,7 @@ classifiers = [
|
|||||||
"Programming Language :: Python",
|
"Programming Language :: Python",
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"click==8.3.0",
|
"click==8.3.1",
|
||||||
"rich==14.1.0",
|
"rich==14.1.0",
|
||||||
"tld==0.13.1",
|
"tld==0.13.1",
|
||||||
"requests==2.32.5",
|
"requests==2.32.5",
|
||||||
@@ -27,11 +27,11 @@ dependencies = [
|
|||||||
"iOSbackup==0.9.925",
|
"iOSbackup==0.9.925",
|
||||||
"adb-shell[usb]==0.4.4",
|
"adb-shell[usb]==0.4.4",
|
||||||
"libusb1==3.3.1",
|
"libusb1==3.3.1",
|
||||||
"cryptography==46.0.3",
|
"cryptography==46.0.5",
|
||||||
"PyYAML>=6.0.2",
|
"PyYAML>=6.0.2",
|
||||||
"pyahocorasick==2.2.0",
|
"pyahocorasick==2.2.0",
|
||||||
"betterproto==1.2.5",
|
"betterproto==1.2.5",
|
||||||
"pydantic==2.12.3",
|
"pydantic==2.12.5",
|
||||||
"pydantic-settings==2.10.1",
|
"pydantic-settings==2.10.1",
|
||||||
"NSKeyedUnArchiver==1.5.2",
|
"NSKeyedUnArchiver==1.5.2",
|
||||||
"python-dateutil==2.9.0.post0",
|
"python-dateutil==2.9.0.post0",
|
||||||
@@ -81,8 +81,8 @@ addopts = "-ra -q --cov=mvt --cov-report html --junitxml=pytest.xml --cov-report
|
|||||||
testpaths = ["tests"]
|
testpaths = ["tests"]
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
select = ["C90", "E", "F", "W"] # flake8 default set
|
lint.select = ["C90", "E", "F", "W"] # flake8 default set
|
||||||
ignore = [
|
lint.ignore = [
|
||||||
"E501", # don't enforce line length violations
|
"E501", # don't enforce line length violations
|
||||||
"C901", # complex-structure
|
"C901", # complex-structure
|
||||||
|
|
||||||
@@ -95,10 +95,10 @@ ignore = [
|
|||||||
# "E203", # whitespace-before-punctuation
|
# "E203", # whitespace-before-punctuation
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.ruff.per-file-ignores]
|
[tool.ruff.lint.per-file-ignores]
|
||||||
"__init__.py" = ["F401"] # unused-import
|
"__init__.py" = ["F401"] # unused-import
|
||||||
|
|
||||||
[tool.ruff.mccabe]
|
[tool.ruff.lint.mccabe]
|
||||||
max-complexity = 10
|
max-complexity = 10
|
||||||
|
|
||||||
[tool.setuptools]
|
[tool.setuptools]
|
||||||
|
|||||||
@@ -14,12 +14,23 @@ class DumpsysBatteryDailyArtifact(AndroidArtifact):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def serialize(self, record: dict) -> Union[dict, list]:
|
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 {
|
return {
|
||||||
"timestamp": record["from"],
|
"timestamp": record["from"],
|
||||||
"module": self.__class__.__name__,
|
"module": self.__class__.__name__,
|
||||||
"event": "battery_daily",
|
"event": "battery_daily",
|
||||||
"data": f"Recorded update of package {record['package_name']} "
|
"data": data,
|
||||||
f"with vers {record['vers']}",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def check_indicators(self) -> None:
|
def check_indicators(self) -> None:
|
||||||
@@ -36,6 +47,7 @@ class DumpsysBatteryDailyArtifact(AndroidArtifact):
|
|||||||
def parse(self, output: str) -> None:
|
def parse(self, output: str) -> None:
|
||||||
daily = None
|
daily = None
|
||||||
daily_updates = []
|
daily_updates = []
|
||||||
|
package_versions = {} # Track package versions to detect downgrades
|
||||||
for line in output.splitlines():
|
for line in output.splitlines():
|
||||||
if line.startswith(" Daily from "):
|
if line.startswith(" Daily from "):
|
||||||
if len(daily_updates) > 0:
|
if len(daily_updates) > 0:
|
||||||
@@ -64,15 +76,44 @@ class DumpsysBatteryDailyArtifact(AndroidArtifact):
|
|||||||
break
|
break
|
||||||
|
|
||||||
if not already_seen:
|
if not already_seen:
|
||||||
daily_updates.append(
|
update_record = {
|
||||||
{
|
"action": "update",
|
||||||
"action": "update",
|
"from": daily["from"],
|
||||||
"from": daily["from"],
|
"to": daily["to"],
|
||||||
"to": daily["to"],
|
"package_name": package_name,
|
||||||
"package_name": package_name,
|
"vers": vers_nr,
|
||||||
"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:
|
if len(daily_updates) > 0:
|
||||||
self.results.extend(daily_updates)
|
self.results.extend(daily_updates)
|
||||||
|
|||||||
@@ -52,9 +52,7 @@ class Indicators:
|
|||||||
if os.path.isfile(path) and path.lower().endswith(".stix2"):
|
if os.path.isfile(path) and path.lower().endswith(".stix2"):
|
||||||
self.parse_stix2(path)
|
self.parse_stix2(path)
|
||||||
elif os.path.isdir(path):
|
elif os.path.isdir(path):
|
||||||
for file in glob.glob(
|
for file in glob.glob(os.path.join(path, "**", "*.stix2"), recursive=True):
|
||||||
os.path.join(path, "**", "*.stix2", recursive=True)
|
|
||||||
):
|
|
||||||
self.parse_stix2(file)
|
self.parse_stix2(file)
|
||||||
else:
|
else:
|
||||||
self.log.error(
|
self.log.error(
|
||||||
|
|||||||
Reference in New Issue
Block a user