Skip to content

Commit

Permalink
Merge branch '2293-rename-event-serializers' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
mssalvatore committed Sep 16, 2022
2 parents 5669bdd + 998c1d7 commit 4e1ca65
Show file tree
Hide file tree
Showing 47 changed files with 276 additions and 263 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Changelog](https://keepachangelog.com/en/1.0.0/).
- `/api/clear-simulation-data` endpoint. #2036
- `/api/registration-status` endpoint. #2149
- authentication to `/api/island/version`. #2109
- `/api/events` endpoint. #2155
- `/api/agent-events` endpoint. #2155, #2300
- The ability to customize the file extension used by ransomware when
encrypting files. #1242
- `/api/agents` endpoint.
Expand Down
5 changes: 5 additions & 0 deletions monkey/common/agent_event_serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .consts import EVENT_TYPE_FIELD
from .i_agent_event_serializer import IAgentEventSerializer, JSONSerializable
from .agent_event_serializer_registry import AgentEventSerializerRegistry
from .pydantic_agent_event_serializer import PydanticAgentEventSerializer
from .register import register_common_agent_event_serializers
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
from typing import Type, Union

from common.event_serializers import IEventSerializer
from common.events import AbstractAgentEvent
from common.agent_event_serializers import IAgentEventSerializer
from common.agent_events import AbstractAgentEvent


class EventSerializerRegistry:
class AgentEventSerializerRegistry:
"""
Registry for event serializers using event class.
Example:
event_serializer_registry = EventSerializerRegistry()
event_serializer_registry = AgentEventSerializerRegistry()
event_serializer_registry[MyEvent] = MyEventSerializer()
my_event_dict = {"type": "MyEvent", "data": "123"}
Expand All @@ -22,18 +22,20 @@ def __init__(self):
self._registry = {}

def __setitem__(
self, event_class: Type[AbstractAgentEvent], event_serializer: IEventSerializer
self, event_class: Type[AbstractAgentEvent], event_serializer: IAgentEventSerializer
):
if not issubclass(event_class, AbstractAgentEvent):
raise TypeError(f"Event class must be of type: {AbstractAgentEvent.__name__}")

if not isinstance(event_serializer, IEventSerializer):
raise TypeError(f"Event serializer must be of type: {IEventSerializer.__name__}")
if not isinstance(event_serializer, IAgentEventSerializer):
raise TypeError(f"Event serializer must be of type: {IAgentEventSerializer.__name__}")

self._registry[event_class] = event_serializer
self._registry[event_class.__name__] = event_serializer

def __getitem__(self, event_class: Union[str, Type[AbstractAgentEvent]]) -> IEventSerializer:
def __getitem__(
self, event_class: Union[str, Type[AbstractAgentEvent]]
) -> IAgentEventSerializer:
if not (isinstance(event_class, str) or issubclass(event_class, AbstractAgentEvent)):
raise TypeError(
f"Registry get key {event_class} must be of type: {AbstractAgentEvent.__name__} or "
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from abc import ABC, abstractmethod
from typing import Dict, List, Union

from common.events import AbstractAgentEvent
from common.agent_events import AbstractAgentEvent

JSONSerializable = Union[ # type: ignore[misc]
Dict[str, "JSONSerializable"], # type: ignore[misc]
Expand All @@ -14,7 +14,7 @@
]


class IEventSerializer(ABC):
class IAgentEventSerializer(ABC):
"""
Manages serialization and deserialization of events
"""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import logging
from typing import Generic, Type, TypeVar

from common.events import AbstractAgentEvent
from common.agent_events import AbstractAgentEvent
from common.utils.code_utils import del_key

from . import EVENT_TYPE_FIELD, IEventSerializer, JSONSerializable
from . import EVENT_TYPE_FIELD, IAgentEventSerializer, JSONSerializable

logger = logging.getLogger(__name__)

T = TypeVar("T", bound=AbstractAgentEvent)


class PydanticEventSerializer(IEventSerializer, Generic[T]):
class PydanticAgentEventSerializer(IAgentEventSerializer, Generic[T]):
def __init__(self, event_class: Type[T]):
self._event_class = event_class

Expand Down
11 changes: 11 additions & 0 deletions monkey/common/agent_event_serializers/register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from common.agent_events import CredentialsStolenEvent

from . import AgentEventSerializerRegistry, PydanticAgentEventSerializer


def register_common_agent_event_serializers(
event_serializer_registry: AgentEventSerializerRegistry,
):
event_serializer_registry[CredentialsStolenEvent] = PydanticAgentEventSerializer(
CredentialsStolenEvent
)
File renamed without changes.
2 changes: 1 addition & 1 deletion monkey/common/event_queue/i_agent_event_queue.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from abc import ABC, abstractmethod
from typing import Type

from common.events import AbstractAgentEvent
from common.agent_events import AbstractAgentEvent

from . import AgentEventSubscriber

Expand Down
2 changes: 1 addition & 1 deletion monkey/common/event_queue/pypubsub_agent_event_queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

from pubsub.core import Publisher

from common.agent_events import AbstractAgentEvent
from common.event_queue import PyPubSubPublisherWrapper
from common.events import AbstractAgentEvent

from . import AgentEventSubscriber, IAgentEventQueue

Expand Down
2 changes: 1 addition & 1 deletion monkey/common/event_queue/types.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from typing import Callable

from common.events import AbstractAgentEvent
from common.agent_events import AbstractAgentEvent

AgentEventSubscriber = Callable[[AbstractAgentEvent], None]
5 changes: 0 additions & 5 deletions monkey/common/event_serializers/__init__.py

This file was deleted.

9 changes: 0 additions & 9 deletions monkey/common/event_serializers/register.py

This file was deleted.

13 changes: 6 additions & 7 deletions monkey/infection_monkey/agent_event_forwarder.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@

import requests

from common.agent_event_serializers import AgentEventSerializerRegistry, JSONSerializable
from common.agent_events import AbstractAgentEvent
from common.common_consts.timeouts import MEDIUM_REQUEST_TIMEOUT
from common.event_serializers import EventSerializerRegistry
from common.event_serializers.i_event_serializer import JSONSerializable
from common.events import AbstractAgentEvent
from infection_monkey.utils.threading import create_daemon_thread

logger = logging.getLogger(__name__)


DEFAULT_TIME_PERIOD_SECONDS = 5
EVENTS_API_URL = "https://%s/api/events"
AGENT_EVENTS_API_URL = "https://%s/api/agent-events"


class AgentEventForwarder:
Expand All @@ -24,7 +23,7 @@ class AgentEventForwarder:
"""

def __init__(
self, server_address: str, agent_event_serializer_registry: EventSerializerRegistry
self, server_address: str, agent_event_serializer_registry: AgentEventSerializerRegistry
):
self._server_address = server_address
self._agent_event_serializer_registry = agent_event_serializer_registry
Expand Down Expand Up @@ -85,9 +84,9 @@ def _send_events_to_island(self):
events.append(self._queue.get(block=False))

try:
logger.debug(f"Sending events to Island at {self._server_address}: {events}")
logger.debug(f"Sending Agent events to Island at {self._server_address}: {events}")
requests.post( # noqa: DUO123
EVENTS_API_URL % (self._server_address,),
AGENT_EVENTS_API_URL % (self._server_address,),
json=events,
verify=False,
timeout=MEDIUM_REQUEST_TIMEOUT,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import logging
from typing import Sequence

from common.agent_events import CredentialsStolenEvent
from common.credentials import Credentials, LMHash, NTHash, Password, Username
from common.event_queue import IAgentEventQueue
from common.events import CredentialsStolenEvent
from infection_monkey.i_puppet import ICredentialCollector
from infection_monkey.model import USERNAME_PREFIX
from infection_monkey.utils.ids import get_agent_id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import os
from typing import Dict, Iterable, Sequence

from common.agent_events import CredentialsStolenEvent
from common.credentials import Credentials, SSHKeypair, Username
from common.event_queue import IAgentEventQueue
from common.events import CredentialsStolenEvent
from common.utils.attack_utils import ScanStatus
from infection_monkey.telemetry.attack.t1005_telem import T1005Telem
from infection_monkey.telemetry.attack.t1145_telem import T1145Telem
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging

from common.events import CredentialsStolenEvent
from common.agent_events import CredentialsStolenEvent

from . import IPropagationCredentialsRepository

Expand Down
2 changes: 1 addition & 1 deletion monkey/infection_monkey/exploit/zerologon.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
from impacket.dcerpc.v5 import epm, nrpc, rpcrt, transport
from impacket.dcerpc.v5.dtypes import NULL

from common.agent_events import CredentialsStolenEvent
from common.common_consts.timeouts import LONG_REQUEST_TIMEOUT
from common.credentials import Credentials, LMHash, NTHash, Username
from common.events import CredentialsStolenEvent
from infection_monkey.exploit.HostExploiter import HostExploiter
from infection_monkey.exploit.tools.wmi_tools import WmiTools
from infection_monkey.exploit.zerologon_utils.dump_secrets import DumpSecrets
Expand Down
14 changes: 7 additions & 7 deletions monkey/infection_monkey/monkey.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@

from pubsub.core import Publisher

from common.event_queue import IAgentEventQueue, PyPubSubAgentEventQueue
from common.event_serializers import (
EventSerializerRegistry,
from common.agent_event_serializers import (
AgentEventSerializerRegistry,
register_common_agent_event_serializers,
)
from common.events import CredentialsStolenEvent
from common.agent_events import CredentialsStolenEvent
from common.event_queue import IAgentEventQueue, PyPubSubAgentEventQueue
from common.network.network_utils import (
address_to_ip_port,
get_my_ip_addresses,
Expand Down Expand Up @@ -217,8 +217,8 @@ def _setup(self):
register_signal_handlers(self._master)

# TODO: This is just a placeholder for now. We will modify/integrate it with PR #2279.
def _setup_agent_event_serializers(self) -> EventSerializerRegistry:
agent_event_serializer_registry = EventSerializerRegistry()
def _setup_agent_event_serializers(self) -> AgentEventSerializerRegistry:
agent_event_serializer_registry = AgentEventSerializerRegistry()
register_common_agent_event_serializers(agent_event_serializer_registry)

return agent_event_serializer_registry
Expand Down Expand Up @@ -263,7 +263,7 @@ def _subscribe_events(
event_queue: IAgentEventQueue,
propagation_credentials_repository: IPropagationCredentialsRepository,
server_address: str,
agent_event_serializer_registry: EventSerializerRegistry,
agent_event_serializer_registry: AgentEventSerializerRegistry,
):
event_queue.subscribe_type(
CredentialsStolenEvent,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import logging

from common.events import AbstractAgentEvent
from monkey_island.cc.repository import IEventRepository, StorageError
from common.agent_events import AbstractAgentEvent
from monkey_island.cc.repository import IAgentEventRepository, StorageError

logger = logging.getLogger(__name__)


class save_event_to_event_repository:
def __init__(self, event_repository: IEventRepository):
def __init__(self, event_repository: IAgentEventRepository):
self._event_repository = event_repository

def __call__(self, event: AbstractAgentEvent):
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging

from common.events import CredentialsStolenEvent
from common.agent_events import CredentialsStolenEvent
from monkey_island.cc.repository import ICredentialsRepository, StorageError

logger = logging.getLogger(__name__)
Expand Down
4 changes: 2 additions & 2 deletions monkey/monkey_island/cc/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
from monkey_island.cc.resources import (
AgentBinaries,
AgentConfiguration,
AgentEvents,
Agents,
ClearSimulationData,
Events,
IPAddresses,
IslandLog,
PBAFileDownload,
Expand Down Expand Up @@ -187,7 +187,7 @@ def init_restful_endpoints(api: FlaskDIWrapper):
api.add_resource(IslandLog)
api.add_resource(IPAddresses)

api.add_resource(Events)
api.add_resource(AgentEvents)

# API Spec: These two should be the same resource, GET for download and POST for upload
api.add_resource(PBAFileDownload)
Expand Down
2 changes: 1 addition & 1 deletion monkey/monkey_island/cc/repository/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from .i_machine_repository import IMachineRepository
from .i_agent_repository import IAgentRepository
from .i_node_repository import INodeRepository
from .i_event_repository import IEventRepository
from .i_agent_event_repository import IAgentEventRepository


from .local_storage_file_repository import LocalStorageFileRepository
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from abc import ABC, abstractmethod
from typing import Sequence, Type, TypeVar

from common.events import AbstractAgentEvent
from common.agent_events import AbstractAgentEvent
from common.types import AgentID

T = TypeVar("T", bound=AbstractAgentEvent)


class IEventRepository(ABC):
class IAgentEventRepository(ABC):
"""A repository used to store and retrieve event objects"""

@abstractmethod
Expand Down
12 changes: 7 additions & 5 deletions monkey/monkey_island/cc/repository/mongo_event_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,21 @@

from pymongo import MongoClient

from common.event_serializers import EVENT_TYPE_FIELD, EventSerializerRegistry
from common.events import AbstractAgentEvent
from common.agent_event_serializers import EVENT_TYPE_FIELD, AgentEventSerializerRegistry
from common.agent_events import AbstractAgentEvent
from common.types import AgentID
from monkey_island.cc.repository import IEventRepository
from monkey_island.cc.repository import IAgentEventRepository

from . import RemovalError, RetrievalError, StorageError
from .consts import MONGO_OBJECT_ID_KEY


class MongoEventRepository(IEventRepository):
class MongoEventRepository(IAgentEventRepository):
"""A repository for storing and retrieving events in MongoDB"""

def __init__(self, mongo_client: MongoClient, serializer_registry: EventSerializerRegistry):
def __init__(
self, mongo_client: MongoClient, serializer_registry: AgentEventSerializerRegistry
):
self._events_collection = mongo_client.monkey_island.events
self._serializers = serializer_registry

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
from typing import Sequence, Type, TypeVar

from common.events import AbstractAgentEvent
from common.agent_events import AbstractAgentEvent
from common.types import AgentID

from . import IEventRepository
from . import IAgentEventRepository

T = TypeVar("T", bound=AbstractAgentEvent)


# TODO: Remove this class after #2180 is complete
class StubbedEventRepository(IEventRepository):
class StubbedEventRepository(IAgentEventRepository):
def save_event(self, event: AbstractAgentEvent):
return

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from monkey_island.cc.models.zero_trust.event import Event


class IEventRepository(ABC):
class IAgentEventRepository(ABC):
def get_events(self, finding_id: Optional[str] = None) -> Sequence[Event]:
pass

Expand Down
Loading

0 comments on commit 4e1ca65

Please sign in to comment.