{"id":"CVE-2026-61854","kind":"vulnerability","aliases":["CVE-2026-61854"],"related":[],"title":"VoiceSentinel: race in report buffer cleanup can corrupt transcripts and fill disk","description":"VoiceSentinel is a real-time voice moderation system for Minecraft servers. From 2.2.1 until 3.3.1, the optional report buffer feature has a race between retention cleanup and normal transcript writes. In `report_buffer.py`, `_maybe_cleanup()` uses an unlocked dictionary for once-per-hour cleanup throttling, allowing simultaneous `_cleanup_tenant()` operations for one tenant. Cleanup reads `transcripts.jsonl` and rewrites it in place without file locking or atomic replacement, while `report_buffer_append_async` uses `asyncio.to_thread` to append without synchronization. In `main.py`, concurrent `_processing_worker` tasks make this reachable in normal operation; `processing.worker_count` of two or more and public-pool servers sharing a `server_key` increase collisions. With `report_buffer.enabled` set to true, racing writes can lose, duplicate or corrupt transcript data and defeat `report_buffer.retention_seconds` pruning, allowing unbounded disk growth that can exhaust storage and crash the host or other services sharing it. The feature is opt-in and disabled by default. This issue is fixed in version 3.3.1.","summary":"VoiceSentinel, a voice moderation system for Minecraft servers, has a race between retention cleanup and transcript writes in its optional report buffer. Racing writes can lose or corrupt transcript data and stop retention pruning, so disk usage can grow until storage is exhausted.","severity":"high","cvss":8.2,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["minecraft","package","python","self-hosted","voicesentinel"],"not_affected_if":["default-config","report-buffer-disabled"],"how_to_check":"- Check the installed VoiceSentinel version and whether it is between `2.2.1` and `3.3.1`\n- Check whether `report_buffer.enabled` is set to true in the config\n- Check whether `processing.worker_count` is `2` or higher","fix":"- Move to VoiceSentinel `3.3.1` or later","status":"open","published_at":"2026-10-30T19:18:28+00:00","first_seen_at":"2026-10-30T19:25:29+00:00","triaged_at":"2026-10-30T19:25:54+00:00","updated_at":"2026-10-30T19:25:54+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-30T19:25:54Z","model":"claude-haiku-5-5","output":{"fix":"- Move to VoiceSentinel `3.3.1` or later","reach":"local","title":"VoiceSentinel: race in report buffer cleanup can corrupt transcripts and fill disk","impact":"medium","summary":"VoiceSentinel, a voice moderation system for Minecraft servers, has a race between retention cleanup and transcript writes in its optional report buffer. Racing writes can lose or corrupt transcript data and stop retention pruning, so disk usage can grow until storage is exhausted.","audience":"developers","category":"package","nicknames":[],"who_cares":["minecraft","voicesentinel","self-hosted","python"],"confidence":0.7,"fix_status":"available","needs_auth":"unknown","worst_case":"transcript data corrupted and disk fills until host crashes","analyst_note":"","how_to_check":"- Check the installed VoiceSentinel version and whether it is between `2.2.1` and `3.3.1`\n- Check whether `report_buffer.enabled` is set to true in the config\n- Check whether `processing.worker_count` is `2` or higher","plain_action":"","needs_analyst":false,"not_affected_if":["default-config","report-buffer-disabled"],"who_is_affected":"Only servers running VoiceSentinel from 2.2.1 up to 3.3.1 with the opt-in report buffer turned on are exposed. The risk is higher with two or more processing workers and with public-pool servers sharing a server key. Servers with the report buffer disabled, the default, are not affected.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000723,"input_tokens":4424,"output_tokens":562,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':14A,17A '-61854':15A,18A '2.2.1':82C '3.3.1':84C,230C 'allow':115C,197C 'append':140C,146C 'async':141C 'asyncio.to':143C 'atom':135C 'buffer':5A,47B,88C,139C 'cleanup':6A,39B,95C,103C,113C,117C,123C 'collis':177C 'concurr':151C 'corrupt':8A,53B,189C 'count':162C 'crash':206C 'cve':13A,16A 'data':55B,191C 'default':223C 'defeat':193C 'dictionari':107C 'disabl':221C 'disk':12A,61B,199C 'duplic':187C 'exhaust':68B,203C 'featur':89C,215C 'file':132C 'fill':11A 'fix':227C 'grow':64B 'growth':200C 'host':24B,208C 'hour':112C 'increas':176C 'issu':225C 'key':175C 'lock':133C 'lose':51B,186C 'main.py':150C 'make':155C 'mayb':102C 'minecraft':19B,32B,79C 'moder':29B,76C 'normal':97C,159C 'once-per-hour':109C 'one':121C 'oper':119C,160C 'opt':218C 'opt-in':217C 'option':45B,86C 'packag':20B 'per':111C 'place':130C 'pool':170C 'process':152C 'processing.worker':161C 'prune':59B,196C 'public':169C 'public-pool':168C 'python':21B 'race':2A,36B,48B,92C,183C 'reachabl':157C 'read':124C 'real':73C 'real-tim':72C 'replac':136C 'report':4A,46B,87C,138C 'report_buffer.enabled':179C 'report_buffer.py':101C 'report_buffer.retention':194C 'retent':38B,58B,94C 'rewrit':127C 'second':195C 'self':23B 'self-host':22B 'server':33B,80C,171C,174C 'servic':211C 'set':180C 'share':172C,212C 'simultan':116C 'stop':57B 'storag':66B,204C 'synchron':148C 'system':30B,77C 'task':154C 'tenant':118C,122C 'thread':144C 'throttl':114C 'time':74C 'transcript':9A,41B,54B,98C,190C 'transcripts.jsonl':125C 'true':182C 'two':164C 'unbound':198C 'unlock':106C 'usag':62B 'use':104C,142C 'version':229C 'voic':28B,75C 'voicesentinel':1A,25B,26B,69C 'without':131C,147C 'worker':153C 'write':42B,49B,99C,184C","nicknames":[],"mitigations":[],"who_affected":"Only servers running VoiceSentinel from 2.2.1 up to 3.3.1 with the opt-in report buffer turned on are exposed. The risk is higher with two or more processing workers and with public-pool servers sharing a server key. Servers with the report buffer disabled, the default, are not affected.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"first_public_at":"2026-10-30T19:18:28+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:H","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-61854","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-61854","severity":null,"published_at":"2026-10-30T19:18:28+00:00","modified_at":"2026-10-30T19:18:28+00:00","first_seen_at":"2026-10-30T19:25:29+00:00","fetched_at":"2026-10-30T19:25:29+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}