From d48703f16912fb5b8920bbeb1d6c3a57e3530427 Mon Sep 17 00:00:00 2001 From: pyoor Date: Mon, 2 Dec 2024 16:53:23 -0500 Subject: [PATCH] feat: update autobisect and fuzzfetch --- poetry.lock | 75 ++++++++++++++-------------- pyproject.toml | 4 +- src/bugmon/bug.py | 9 ++-- src/bugmon/bugmon.py | 3 +- src/bugmon/evaluator_configs/base.py | 15 +++--- tests/conftest.py | 12 +---- tests/test_configs.py | 6 ++- 7 files changed, 60 insertions(+), 64 deletions(-) diff --git a/poetry.lock b/poetry.lock index dc3f549..5ee1afc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -30,20 +30,20 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "autobisect" -version = "7.5.0" +version = "8.0.0" description = "Automatic bisection utility for Mozilla Firefox and SpiderMonkey" optional = false -python-versions = ">=3.8.1,<4.0.0" +python-versions = "<4.0,>=3.9" files = [ - {file = "autobisect-7.5.0-py3-none-any.whl", hash = "sha256:809b180d0d94803c3e1848846e5e45127cffc6c326fa6a004c5ac4592e34c38b"}, - {file = "autobisect-7.5.0.tar.gz", hash = "sha256:767009ab62afe9e2ca2faad76ab4c8234418128cd7547b5e6a5be7aa7de8817c"}, + {file = "autobisect-8.0.0-py3-none-any.whl", hash = "sha256:abf1e99c15a7b0f08e8138730a84644ac07011f858e9a2e865f10abbb9c6ea7a"}, + {file = "autobisect-8.0.0.tar.gz", hash = "sha256:8ba0ea58dca00a0aa91212a80d7c6d0e04191010f144c577338d09d98574ed67"}, ] [package.dependencies] -fuzzfetch = ">=2.4.3,<3.0.0" -grizzly-framework = "0.17.0" -lithium-reducer = ">=1.1.1,<2.0.0" -platformdirs = ">=3.10.0,<4.0.0" +fuzzfetch = ">=10.0.0,<11.0.0" +grizzly-framework = ">=0.21.0,<0.22.0" +lithium-reducer = ">=4.0.0,<5.0.0" +platformdirs = ">=4.2.2,<5.0.0" [[package]] name = "backports-tarfile" @@ -604,13 +604,13 @@ files = [ [[package]] name = "ffpuppet" -version = "0.11.2" +version = "0.14.0" description = "A Python module that aids in the automation of Firefox at the process level" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ffpuppet-0.11.2-py3-none-any.whl", hash = "sha256:e46cecc350f9ec6f2caac99c0a85a502cd78ba781c81ff1ff8a7c5f4725a0897"}, - {file = "ffpuppet-0.11.2.tar.gz", hash = "sha256:589bda8b411dbb1de0ab1c8878e0e4facb3409c3a09dc479ce0ba7bf8e602237"}, + {file = "ffpuppet-0.14.0-py3-none-any.whl", hash = "sha256:9c2dc82b0e11c4b780e9391304ac4e2495760df0c35f707d5f1cc983a587c3cf"}, + {file = "ffpuppet-0.14.0.tar.gz", hash = "sha256:bbdf864cd74aff400e24fe9fd513723d025fa3e45f70b726d6fa93e2fca6527e"}, ] [package.dependencies] @@ -686,13 +686,13 @@ setuptools = "*" [[package]] name = "fuzzfetch" -version = "2.4.3" +version = "10.0.0" description = "Downloader for firefox/jsshell builds." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "fuzzfetch-2.4.3-py3-none-any.whl", hash = "sha256:6f61788e5b3e6f45de8d7a37cc9237f06d3a74e42f685c599b45411cb0a41ae2"}, - {file = "fuzzfetch-2.4.3.tar.gz", hash = "sha256:cf8cd48995ffe13f8d80f4bd76fd5e23fecc0d76b0f3ef20f4e92a86b5be2766"}, + {file = "fuzzfetch-10.0.0-py3-none-any.whl", hash = "sha256:59e6d4f6a70597bdf5e3a3f513341b61fd708b387597c8a222e5ce2fa48d3e43"}, + {file = "fuzzfetch-10.0.0.tar.gz", hash = "sha256:ada07a71206988bba113652cd59d94e824f4401439d16ab97480f640d881b69f"}, ] [package.dependencies] @@ -795,25 +795,25 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "grizzly-framework" -version = "0.17.0" +version = "0.21.0" description = "A framework for developing and running browser fuzzers" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "grizzly-framework-0.17.0.tar.gz", hash = "sha256:62e94e11acf9c9d45ee98de8542f418ee9cc5edfe55e7cfc37cd6642ed803620"}, - {file = "grizzly_framework-0.17.0-py3-none-any.whl", hash = "sha256:e0137068eeefcf3224882ea478ae03868b412269a47b32a341a636e42473fdef"}, + {file = "grizzly_framework-0.21.0-py3-none-any.whl", hash = "sha256:7a05a5143625609ff35a84d1157affa074b665706c308903a6cfa990d10a7b34"}, + {file = "grizzly_framework-0.21.0.tar.gz", hash = "sha256:f8325a2377e849916d70351e5a5b6ba5658db4243834d95f51208cd99982195d"}, ] [package.dependencies] +bugsy = "*" cryptography = "*" cssbeautifier = "*" -fasteners = "*" -ffpuppet = ">=0.11.1" +ffpuppet = ">=0.13.1" FuzzManager = "*" jsbeautifier = "*" -lithium-reducer = ">=0.5.3" -prefpicker = ">=1.1.0" -psutil = ">=5.9.0" +lithium-reducer = ">=3.0.0" +prefpicker = ">=1.23.0" +psutil = ">=5.9.4" [package.extras] dev = ["pre-commit", "tox"] @@ -1023,17 +1023,17 @@ type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] [[package]] name = "lithium-reducer" -version = "1.1.1" +version = "4.0.0" description = "Lithium is an automated testcase reduction tool" optional = false python-versions = ">=3.8" files = [ - {file = "lithium-reducer-1.1.1.tar.gz", hash = "sha256:8ebd161546ff969b0b58c38651130cb14da9704e5ca26b3002a39b0edcfd9aa6"}, - {file = "lithium_reducer-1.1.1-py3-none-any.whl", hash = "sha256:26a2cfc882873e83796eba7fe50139bc92f611ac2f4375c3af99dd416c06c621"}, + {file = "lithium_reducer-4.0.0-py3-none-any.whl", hash = "sha256:069a693b9bcccd955c907805736a18f01d25e2ad2d157d9602c3d71535cf96ec"}, + {file = "lithium_reducer-4.0.0.tar.gz", hash = "sha256:1af0695f8bc982c76f3df7da7fdf14f5bb4390b09226d61a19680f75405db3ad"}, ] [package.dependencies] -ffpuppet = ">=0.11.2,<0.12.0" +ffpuppet = ">=0.11.2" [package.extras] dev = ["pre-commit", "tox"] @@ -1198,18 +1198,19 @@ testing = ["pytest", "pytest-cov", "wheel"] [[package]] name = "platformdirs" -version = "3.11.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, - {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "pluggy" @@ -1960,4 +1961,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9.0" -content-hash = "31134d1af85bb20a5d208d69e10ca89fdd6146b125ae2de3f02f3c8c9ebc3009" +content-hash = "7760dcb1363bbc7fd50cabe24ac3f4952cdac04a92bd79911510699e0e315478" diff --git a/pyproject.toml b/pyproject.toml index c1c680f..29c11c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,9 +57,9 @@ repository = "https://github.com/MozillaSecurity/bugmon" version = "4.1.0" [tool.poetry.dependencies] -autobisect = "^7.5.0" +autobisect = "^8.0.0" bugsy = {git = "https://github.com/AutomatedTester/Bugsy.git"} -fuzzfetch = "^2.4.2" +fuzzfetch = "^10.0.0" python = "^3.9.0" typing-extensions = "^4.2.0" diff --git a/src/bugmon/bug.py b/src/bugmon/bug.py index 388811a..8f1ec3a 100644 --- a/src/bugmon/bug.py +++ b/src/bugmon/bug.py @@ -274,10 +274,11 @@ def initial_build_id(self) -> str: creation_time = self.creation_time.split("T")[0] try: instance = Fetcher( - self.branch, - creation_time, - self.build_flags, - self.platform, + branch=self.branch, + build=creation_time, + flags=self.build_flags, + targets=[], + platform=self.platform, nearest=BuildSearchOrder.ASC, ) self._initial_build_id = instance.changeset diff --git a/src/bugmon/bugmon.py b/src/bugmon/bugmon.py index 648a7ad..cb00bad 100644 --- a/src/bugmon/bugmon.py +++ b/src/bugmon/bugmon.py @@ -245,7 +245,7 @@ def _pernosco(self) -> None: log.info("Attempting to record a pernosco session...") # Update config to use no-opt - config.build_flags = config.build_flags._replace(no_opt=True) + config.build_flags.no_opt = True # Update evaluator settings config.evaluator.logs = self.log_dir config.evaluator.pernosco = True @@ -422,6 +422,7 @@ def _reproduce_bug( branch, bid, config.build_flags, + config.evaluator.target, self.bug.platform, nearest=direction, ) diff --git a/src/bugmon/evaluator_configs/base.py b/src/bugmon/evaluator_configs/base.py index 25b12d7..b86a9eb 100644 --- a/src/bugmon/evaluator_configs/base.py +++ b/src/bugmon/evaluator_configs/base.py @@ -3,8 +3,10 @@ # file, You can obtain one at https://mozilla.org/MPL/2.0/. import itertools from abc import ABC, abstractmethod +from copy import copy +from dataclasses import fields from pathlib import Path -from typing import Any, Dict, Iterator, Tuple +from typing import Any, Dict, Iterator, Tuple, cast from autobisect import Evaluator from fuzzfetch import BuildFlags @@ -34,7 +36,7 @@ def iter_build_flags(cls, bug: EnhancedBug) -> Iterator[BuildFlags]: """ yielded = [] # Ignore opt builds and non-fuzzing enabled builds - is_opt = all(flag is False for flag in bug.build_flags) + is_opt = all(cast(bool, flag) is False for flag in fields(bug.build_flags)) if not is_opt and bug.build_flags.fuzzing: yielded.append(bug.build_flags) yield bug.build_flags @@ -49,17 +51,16 @@ def iter_build_flags(cls, bug: EnhancedBug) -> Iterator[BuildFlags]: if not asan and not debug: continue - raw_flags = dict.fromkeys(bug.build_flags._asdict(), False) + new_flags = copy(bug.build_flags) if asan: - raw_flags["asan"] = asan + new_flags.asan = True if debug: - raw_flags["debug"] = debug + new_flags.debug = True if fuzzing: - raw_flags["fuzzing"] = fuzzing + new_flags.fuzzing = True - new_flags = BuildFlags(**raw_flags) if not any(flags == new_flags for flags in yielded): yield new_flags diff --git a/tests/conftest.py b/tests/conftest.py index 7c32d9f..9090f0e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -213,17 +213,7 @@ def bugmon(tmp_path, request, bug, bugsy): @pytest.fixture def build_flags(): - return BuildFlags( - asan=False, - tsan=False, - debug=False, - fuzzing=False, - coverage=False, - valgrind=False, - no_opt=False, - fuzzilli=False, - nyx=False, - ) + return BuildFlags() @pytest.fixture diff --git a/tests/test_configs.py b/tests/test_configs.py index ae06c97..bd36602 100644 --- a/tests/test_configs.py +++ b/tests/test_configs.py @@ -30,7 +30,7 @@ def test_bug_configuration_iter_build_flags_001(bug_data): # Check that all results are BuildFlags assert all(isinstance(x, BuildFlags) for x in build_flags) # Check for duplicates - assert len(build_flags) == len(set(build_flags)) + assert build_flags[0] != build_flags[1] def test_bug_configuration_iter_build_flags_002(bug_data): @@ -45,7 +45,9 @@ def test_bug_configuration_iter_build_flags_002(bug_data): # Check that all results are BuildFlags assert all(isinstance(x, BuildFlags) for x in build_flags) # Check for duplicates - assert len(build_flags) == len(set(build_flags)) + for i in range(len(build_flags)): + for j in range(i + 1, len(build_flags)): + assert build_flags[i] != build_flags[j] def test_bug_configuration_iter_tests_001():