Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
3a8ca95
build(deps): bump h11 from 0.14.0 to 0.16.0
dependabot[bot] May 26, 2026
22b2499
Bump pynacl from 1.5.0 to 1.6.2
dependabot[bot] Jun 10, 2026
213e1f5
Bump aiohttp from 3.13.2 to 3.14.0
dependabot[bot] Jun 10, 2026
bd12405
Bump pyjwt from 2.10.1 to 2.13.0
dependabot[bot] Jun 15, 2026
46ca4bc
Bump python-multipart from 0.0.27 to 0.0.31
dependabot[bot] Jun 17, 2026
6ccc9cd
Bump cryptography from 44.0.1 to 48.0.1
dependabot[bot] Jun 17, 2026
241be96
Bump ujson from 5.12.1 to 5.13.0
dependabot[bot] Jun 19, 2026
b2db441
Bump pydantic-settings from 2.13.1 to 2.14.2
dependabot[bot] Jun 19, 2026
ca54014
resultserver: spawn (not fork) the multiworker per-VM worker processes
node5-sublime Jul 4, 2026
b394ae8
Merge pull request #3087 from kevoreilly/dependabot/uv/pydantic-setti…
kevoreilly Jul 7, 2026
528b8d4
Merge pull request #3086 from kevoreilly/dependabot/uv/ujson-5.13.0
kevoreilly Jul 7, 2026
08eb187
Merge pull request #3082 from kevoreilly/dependabot/uv/cryptography-4…
kevoreilly Jul 7, 2026
eb5607c
Merge pull request #3079 from kevoreilly/dependabot/uv/python-multipa…
kevoreilly Jul 7, 2026
125c162
Merge pull request #3077 from kevoreilly/dependabot/uv/pyjwt-2.13.0
kevoreilly Jul 7, 2026
a361c0f
Merge pull request #3061 from kevoreilly/dependabot/uv/aiohttp-3.14.0
kevoreilly Jul 7, 2026
a588472
Merge pull request #3044 from kevoreilly/dependabot/uv/pynacl-1.6.2
kevoreilly Jul 7, 2026
c06696c
Merge pull request #3043 from kevoreilly/dependabot/uv/h11-0.16.0
kevoreilly Jul 7, 2026
4df1de8
Merge pull request #3099 from wmetcalf/fix/resultserver-multiworker-s…
kevoreilly Jul 7, 2026
d51f927
Monitor updates: see changelog for details
kevoreilly Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified analyzer/windows/dll/capemon.dll
Binary file not shown.
Binary file modified analyzer/windows/dll/capemon_x64.dll
Binary file not shown.
7 changes: 7 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
### [07.07.2026]
* Monitor updates:
* New hooks for SystemFunction036, SystemFunction040, SystemFunction041 (RtlGenRandom, RtlEncryptMemory, RtlDecryptMemory), Thread32First, Thread32Next, clipboard functions
* Enable hooks: MapFileAndCheckSumA, GetVolumeInformationA, GetVolumeInformationW & NtQueryVolumeInformationFile
* Crypto hook overhaul
* Misc fixes

### [08.06.2026]
* Threat Discovery & Hunting Workstation Dashboard:
* Integrated centralized dynamic multi-faceted database clustering across 12 categories (Domains, IPs, Mutexes, Dropped Files, Commands, Registry Keys, Hashes, ImpHashes, and Signatures).
Expand Down
20 changes: 17 additions & 3 deletions lib/cuckoo/core/resultserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,19 @@ def cancel_task(self, task_id):
task_log_stop_force(task_id)


class ResultServerWorkerProcess(multiprocessing.Process):
# Use a SPAWN context (not the default fork) for the per-VM ResultServer worker
# processes. cape monkey-patches threading with gevent, and gevent's Thread lacks
# CPython's _reset_internal_locks; forking a running gevent-patched process makes
# threading._after_fork raise AttributeError on every live aux Thread (Mitmdump,
# QEMUScreenshots, ...) in the child, leaving locks unreset -> intermittent
# deadlocks (e.g. a later sniffer subprocess fork wedging an analysis). spawn
# starts a fresh interpreter with NO inherited threads, so _after_fork never runs
# on them. (2026-07-02: a 12-job multiworker load test wedged a task and logged
# _after_fork AttributeErrors for Mitmdump + QEMUScreenshots.)
_rs_spawn_ctx = multiprocessing.get_context("spawn")


class ResultServerWorkerProcess(_rs_spawn_ctx.Process):
"""Dedicated ResultServer process for a single VM.

Each worker runs its own gevent event loop and StreamServer,
Expand All @@ -709,8 +721,10 @@ def __init__(self, ip, port, listen_ip):
self.ip = ip
self.port = port
self.listen_ip = listen_ip
self._task_id = multiprocessing.Value("i", 0)
self._ready = multiprocessing.Event()
# Value/Event must come from the same spawn context as the Process so they
# are shared correctly across the spawn boundary (pickled into the child).
self._task_id = _rs_spawn_ctx.Value("i", 0)
self._ready = _rs_spawn_ctx.Event()

def run(self):
"""Entry point for the worker process. Sets up a standalone
Expand Down
Loading
Loading