fix(backend): complete c2 task→simulation mapping per spec + sanitize adapter errors (sprint 8 code-review)
mapping.py — full §0.11 contract:
1. execution_result: append '$ <command>\n<output>\n' block (previously
wrote raw output without command header, making multi-task blobs
unreadable in exports)
2. executed_at: set from task.completed_at when currently null (was
completely missing — simulation.executed_at stayed null forever)
3. commands: append task.command deduplicated line-by-line (was
completely missing — simulation.commands stayed empty)
mythic.py — sanitize transport errors:
Replace 'raise C2Error(str(exc))' (which leaks the Mythic URL via
requests exception repr) with 'raise C2Error(f"C2 transport error:
{type(exc).__name__}")'. Original exc stays chained for backend logs.
api/c2.py — remove redundant 'task.mapping_applied = True' in import
endpoint (apply_task_to_simulation() already sets it).
test_c2_mapping.py — full rewrite: 19 tests covering command blocks,
executed_at set/preserve, commands dedup, idempotency.
test_c2_adapter_mythic.py — add URL-leak sanitization assertion.
468 passed; ruff + mypy clean.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -124,6 +124,20 @@ class TestMythicAdapterCreateTask:
|
||||
adapter.create_task(1, "whoami")
|
||||
|
||||
|
||||
class TestMythicAdapterErrorSanitization:
|
||||
def test_connection_error_message_does_not_contain_url(self, adapter):
|
||||
"""C2Error message must not expose the configured Mythic URL."""
|
||||
with rm_module.Mocker() as m:
|
||||
m.post(_GQL_URL, exc=requests.exceptions.ConnectionError(
|
||||
f"HTTPSConnectionPool(host='{_BASE_URL}', port=7443): Max retries exceeded"
|
||||
))
|
||||
with pytest.raises(C2Error) as exc_info:
|
||||
adapter.list_callbacks()
|
||||
|
||||
assert _BASE_URL not in str(exc_info.value)
|
||||
assert "ConnectionError" in str(exc_info.value)
|
||||
|
||||
|
||||
class TestMythicAdapterNoRedirects:
|
||||
def test_does_not_follow_redirect(self, adapter):
|
||||
"""Adapter must not follow HTTP redirects (allow_redirects=False)."""
|
||||
|
||||
Reference in New Issue
Block a user