From 628d9d9f3a971cad92ce1f6f35f569be5ea9501b Mon Sep 17 00:00:00 2001 From: FerTV Date: Wed, 5 Mar 2025 11:22:30 +0100 Subject: [PATCH 1/2] new attacks implemented --- nebula/addons/attacks/attacks.py | 2 + .../communications/communicationattack.py | 53 ++++++- .../attacks/communications/delayerattack.py | 17 ++- .../attacks/communications/floodingattack.py | 74 +++++++++ nebula/addons/attacks/dataset/datapoison.py | 13 +- .../addons/attacks/dataset/datasetattack.py | 17 ++- .../addons/attacks/dataset/labelflipping.py | 13 +- .../attacks/model/gllneuroninversion.py | 13 +- nebula/addons/attacks/model/modelattack.py | 21 +-- nebula/addons/attacks/model/modelpoison.py | 14 +- nebula/addons/attacks/model/noiseinjection.py | 14 +- .../addons/attacks/model/swappingweights.py | 14 +- nebula/core/engine.py | 4 +- nebula/frontend/templates/deployment.html | 141 +++++++++++++++++- 14 files changed, 357 insertions(+), 53 deletions(-) create mode 100644 nebula/addons/attacks/communications/floodingattack.py diff --git a/nebula/addons/attacks/attacks.py b/nebula/addons/attacks/attacks.py index 5b636648..1aeb1223 100755 --- a/nebula/addons/attacks/attacks.py +++ b/nebula/addons/attacks/attacks.py @@ -111,6 +111,7 @@ def create_attack(engine) -> Attack: AttackException: If the specified attack name is not found in the `ATTACK_MAP`. """ from nebula.addons.attacks.communications.delayerattack import DelayerAttack + from nebula.addons.attacks.communications.floodingattack import FloodingAttack from nebula.addons.attacks.dataset.datapoison import SamplePoisoningAttack from nebula.addons.attacks.dataset.labelflipping import LabelFlippingAttack from nebula.addons.attacks.model.gllneuroninversion import GLLNeuronInversionAttack @@ -123,6 +124,7 @@ def create_attack(engine) -> Attack: "Noise Injection": NoiseInjectionAttack, "Swapping Weights": SwappingWeightsAttack, "Delayer": DelayerAttack, + "Flooding": FloodingAttack, "Label Flipping": LabelFlippingAttack, "Sample Poisoning": SamplePoisoningAttack, "Model Poisoning": ModelPoisonAttack, diff --git a/nebula/addons/attacks/communications/communicationattack.py b/nebula/addons/attacks/communications/communicationattack.py index 53732cd5..a826c930 100644 --- a/nebula/addons/attacks/communications/communicationattack.py +++ b/nebula/addons/attacks/communications/communicationattack.py @@ -1,12 +1,22 @@ import logging import types from abc import abstractmethod +import random from nebula.addons.attacks.attacks import Attack class CommunicationAttack(Attack): - def __init__(self, engine, target_class, target_method, round_start_attack, round_stop_attack, decorator_args=None): + def __init__(self, engine, + target_class, + target_method, + round_start_attack, + round_stop_attack, + attack_interval, + decorator_args=None, + selectivity_percentage: int = 100, + selection_interval: int = None + ): super().__init__() self.engine = engine self.target_class = target_class @@ -14,7 +24,12 @@ def __init__(self, engine, target_class, target_method, round_start_attack, roun self.decorator_args = decorator_args self.round_start_attack = round_start_attack self.round_stop_attack = round_stop_attack + self.attack_interval = attack_interval self.original_method = getattr(target_class, target_method, None) + self.selectivity_percentage = selectivity_percentage + self.selection_interval = selection_interval + self.last_selection_round = 0 + self.targets = set() if not self.original_method: raise AttributeError(f"Method {target_method} not found in class {target_class}") @@ -24,10 +39,28 @@ def decorator(self, *args): """Decorator that adds malicious behavior to the execution of the original method.""" pass + async def select_targets(self): + if self.selectivity_percentage != 100: + if self.selection_interval: + if self.last_selection_round % self.selection_interval == 0: + logging.info("Recalculating targets...") + all_nodes = await self.engine.cm.get_addrs_current_connections(only_direct=True) + num_targets = max(1, int(len(all_nodes) * (self.selectivity_percentage / 100))) + self.targets = set(random.sample(list(all_nodes), num_targets)) + elif not self.targets: + logging.info("Calculating targets...") + all_nodes = await self.engine.cm.get_addrs_current_connections(only_direct=True) + num_targets = max(1, int(len(all_nodes) * (self.selectivity_percentage / 100))) + self.targets = set(random.sample(list(all_nodes), num_targets)) + else: + logging.info("All neighbors selected as targets") + self.targets = await self.engine.cm.get_addrs_current_connections(only_direct=True) + + logging.info(f"Selected {self.selectivity_percentage}% targets from neighbors: {self.targets}") + self.last_selection_round+=1 + async def _inject_malicious_behaviour(self): """Inject malicious behavior into the target method.""" - logging.info("Injecting malicious behavior") - decorated_method = self.decorator(self.decorator_args)(self.original_method) setattr( @@ -38,14 +71,18 @@ async def _inject_malicious_behaviour(self): async def _restore_original_behaviour(self): """Restore the original behavior of the target method.""" - logging.info(f"Restoring original behavior of {self.target_class}.{self.target_method}") setattr(self.target_class, self.target_method, self.original_method) async def attack(self): """Perform the attack logic based on the current round.""" - if self.engine.round == self.round_stop_attack: - logging.info(f"[{self.__class__.__name__}] Restoring original behavior") + if self.engine.round not in range(self.round_start_attack, self.round_stop_attack + 1): + pass + elif self.engine.round == self.round_stop_attack: + logging.info(f"[{self.__class__.__name__}] Stoping attack") await self._restore_original_behaviour() - elif self.engine.round == self.round_start_attack: - logging.info(f"[{self.__class__.__name__}] Injecting malicious behavior") + elif (self.engine.round == self.round_start_attack) or ((self.engine.round - self.round_start_attack) % self.attack_interval == 0): + await self.select_targets() + logging.info(f"[{self.__class__.__name__}] Performing attack") await self._inject_malicious_behaviour() + else: + await self._restore_original_behaviour() diff --git a/nebula/addons/attacks/communications/delayerattack.py b/nebula/addons/attacks/communications/delayerattack.py index f3352ab6..5c4d1d55 100644 --- a/nebula/addons/attacks/communications/delayerattack.py +++ b/nebula/addons/attacks/communications/delayerattack.py @@ -22,6 +22,9 @@ def __init__(self, engine, attack_params: dict): self.delay = int(attack_params["delay"]) round_start = int(attack_params["round_start_attack"]) round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + self.target_percentage = int(attack_params["target_percentage"]) + self.selection_interval = int(attack_params["selection_interval"]) except KeyError as e: raise ValueError(f"Missing required attack parameter: {e}") except ValueError: @@ -29,11 +32,14 @@ def __init__(self, engine, attack_params: dict): super().__init__( engine, - engine._cm._propagator, - "propagate", + engine._cm, + "send_model", round_start, round_stop, + attack_interval, self.delay, + self.target_percentage, + self.selection_interval, ) def decorator(self, delay: int): @@ -50,8 +56,11 @@ def decorator(self, delay: int): def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): - logging.info(f"[DelayerAttack] Adding delay of {delay} seconds to {func.__name__}") - await asyncio.sleep(delay) + if len(args) > 1: + dest_addr = args[1] + if dest_addr in self.targets: + logging.info(f"[DelayerAttack] Delaying model propagation to {dest_addr} by {delay} seconds") + await asyncio.sleep(delay) _, *new_args = args # Exclude self argument return await func(*new_args) diff --git a/nebula/addons/attacks/communications/floodingattack.py b/nebula/addons/attacks/communications/floodingattack.py new file mode 100644 index 00000000..40c6910a --- /dev/null +++ b/nebula/addons/attacks/communications/floodingattack.py @@ -0,0 +1,74 @@ +import logging +from functools import wraps + +from nebula.addons.attacks.communications.communicationattack import CommunicationAttack + + +class FloodingAttack(CommunicationAttack): + """ + Implements an attack that delays the execution of a target method by a specified amount of time. + """ + + def __init__(self, engine, attack_params: dict): + """ + Initializes the DelayerAttack with the engine and attack parameters. + + Args: + engine: The engine managing the attack context. + attack_params (dict): Parameters for the attack, including the delay duration. + """ + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + self.flooding_factor = int(attack_params["flooding_factor"]) + self.target_percentage = int(attack_params["target_percentage"]) + self.selection_interval = int(attack_params["selection_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + self.verbose = False + + super().__init__( + engine, + engine._cm, + "send_message", + round_start, + round_stop, + attack_interval, + self.flooding_factor, + self.target_percentage, + self.selection_interval, + ) + + def decorator(self, flooding_factor: int): + """ + Decorator that adds a delay to the execution of the original method. + + Args: + flooding_factor (int): The number of times to repeat the function execution. + + Returns: + function: A decorator function that wraps the target method with the delay logic. + """ + + def decorator(func): + @wraps(func) + async def wrapper(*args, **kwargs): + if len(args) > 1: + dest_addr = args[1] + if dest_addr in self.targets: + logging.info(f"[FloodingAttack] Flooding message to {dest_addr} by {flooding_factor} times") + for i in range(flooding_factor): + if self.verbose: + logging.info(f"[FloodingAttack] Sending duplicate {i+1}/{flooding_factor} to {dest_addr}") + _, *new_args = args # Exclude self argument + await func(*new_args, **kwargs) + _, *new_args = args # Exclude self argument + return await func(*new_args) + + return wrapper + + return decorator \ No newline at end of file diff --git a/nebula/addons/attacks/dataset/datapoison.py b/nebula/addons/attacks/dataset/datapoison.py index 3cdb2893..c725e3e5 100755 --- a/nebula/addons/attacks/dataset/datapoison.py +++ b/nebula/addons/attacks/dataset/datapoison.py @@ -46,15 +46,22 @@ def __init__(self, engine, attack_params): engine (object): The training engine object. attack_params (dict): Dictionary of attack parameters. """ - super().__init__(engine) + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + super().__init__(engine, round_start, round_stop, attack_interval) self.datamodule = engine._trainer.datamodule self.poisoned_percent = float(attack_params["poisoned_percent"]) self.poisoned_ratio = float(attack_params["poisoned_ratio"]) self.targeted = attack_params["targeted"] self.target_label = int(attack_params["target_label"]) self.noise_type = attack_params["noise_type"] - self.round_start_attack = int(attack_params["round_start_attack"]) - self.round_stop_attack = int(attack_params["round_stop_attack"]) def apply_noise(self, t, noise_type, poisoned_ratio): """ diff --git a/nebula/addons/attacks/dataset/datasetattack.py b/nebula/addons/attacks/dataset/datasetattack.py index fab3e82a..c740b8b9 100644 --- a/nebula/addons/attacks/dataset/datasetattack.py +++ b/nebula/addons/attacks/dataset/datasetattack.py @@ -13,7 +13,7 @@ class DatasetAttack(Attack): data, potentially impacting the model's training process. """ - def __init__(self, engine): + def __init__(self, engine, round_start_attack, round_stop_attack, attack_interval): """ Initializes the DatasetAttack with the given engine. @@ -21,8 +21,9 @@ def __init__(self, engine): engine: The engine managing the attack context. """ self.engine = engine - self.round_start_attack = 0 - self.round_stop_attack = 10 + self.round_start_attack = round_start_attack + self.round_stop_attack = round_stop_attack + self.attack_interval = attack_interval async def attack(self): """ @@ -32,11 +33,13 @@ async def attack(self): with a malicious dataset. The attack is stopped when the engine reaches the designated stop round. """ - if self.engine.round in range(self.round_start_attack, self.round_stop_attack): - logging.info("[DatasetAttack] Performing attack") + if self.engine.round not in range(self.round_start_attack, self.round_stop_attack + 1): + pass + elif self.engine.round == self.round_stop_attack: + logging.info(f"[{self.__class__.__name__}] Stopping attack") + elif self.engine.round >= self.round_start_attack and ((self.engine.round - self.round_start_attack) % self.attack_interval == 0): + logging.info(f"[{self.__class__.__name__}] Performing attack") self.engine.trainer.datamodule.train_set = self.get_malicious_dataset() - elif self.engine.round == self.round_stop_attack + 1: - logging.info("[DatasetAttack] Stopping attack") async def _inject_malicious_behaviour(self, target_function, *args, **kwargs): """ diff --git a/nebula/addons/attacks/dataset/labelflipping.py b/nebula/addons/attacks/dataset/labelflipping.py index dfee7517..1f6bf0b8 100755 --- a/nebula/addons/attacks/dataset/labelflipping.py +++ b/nebula/addons/attacks/dataset/labelflipping.py @@ -32,14 +32,21 @@ def __init__(self, engine, attack_params): attack_params (dict): Parameters for the attack, including the percentage of poisoned data, targeting options, and label specifications. """ - super().__init__(engine) + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + super().__init__(engine, round_start, round_stop, attack_interval) self.datamodule = engine._trainer.datamodule self.poisoned_percent = float(attack_params["poisoned_percent"]) self.targeted = attack_params["targeted"] self.target_label = int(attack_params["target_label"]) self.target_changed_label = int(attack_params["target_changed_label"]) - self.round_start_attack = int(attack_params["round_start_attack"]) - self.round_stop_attack = int(attack_params["round_stop_attack"]) def labelFlipping( self, diff --git a/nebula/addons/attacks/model/gllneuroninversion.py b/nebula/addons/attacks/model/gllneuroninversion.py index df6d3f0f..45686ad8 100644 --- a/nebula/addons/attacks/model/gllneuroninversion.py +++ b/nebula/addons/attacks/model/gllneuroninversion.py @@ -26,9 +26,16 @@ def __init__(self, engine, attack_params): engine (object): The training engine object. _ (any): A placeholder argument (not used in this class). """ - super().__init__(engine) - self.round_start_attack = int(attack_params["round_start_attack"]) - self.round_stop_attack = int(attack_params["round_stop_attack"]) + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + super().__init__(engine, round_start, round_stop, attack_interval) def model_attack(self, received_weights): """ diff --git a/nebula/addons/attacks/model/modelattack.py b/nebula/addons/attacks/model/modelattack.py index 41e31d06..643f3d72 100644 --- a/nebula/addons/attacks/model/modelattack.py +++ b/nebula/addons/attacks/model/modelattack.py @@ -20,7 +20,7 @@ class ModelAttack(Attack): model aggregation. """ - def __init__(self, engine): + def __init__(self, engine, round_start_attack, round_stop_attack, attack_interval): """ Initializes the ModelAttack with the specified engine. @@ -31,8 +31,9 @@ def __init__(self, engine): self.engine = engine self.aggregator = engine._aggregator self.original_aggregation = engine.aggregator.run_aggregation - self.round_start_attack = 0 - self.round_stop_attack = 10 + self.round_start_attack = round_start_attack + self.round_stop_attack = round_stop_attack + self.attack_interval = attack_interval def aggregator_decorator(self): """ @@ -104,11 +105,13 @@ async def attack(self): This method logs the attack and calls the method to modify the aggregator. """ - if self.engine.round == self.round_start_attack: - logging.info("[ModelAttack] Injecting malicious behaviour") + if self.engine.round not in range(self.round_start_attack, self.round_stop_attack + 1): + pass + elif self.engine.round == self.round_stop_attack: + logging.info(f"[{self.__class__.__name__}] Stopping attack") + await self._restore_original_behaviour() + elif (self.engine.round == self.round_start_attack) or ((self.engine.round - self.round_start_attack) % self.attack_interval == 0): + logging.info(f"[{self.__class__.__name__}] Performing attack") await self._inject_malicious_behaviour() - elif self.engine.round == self.round_stop_attack + 1: - logging.info("[ModelAttack] Stopping attack") + else: await self._restore_original_behaviour() - elif self.engine.round in range(self.round_start_attack, self.round_stop_attack): - logging.info("[ModelAttack] Performing attack") diff --git a/nebula/addons/attacks/model/modelpoison.py b/nebula/addons/attacks/model/modelpoison.py index a2923079..23148df0 100755 --- a/nebula/addons/attacks/model/modelpoison.py +++ b/nebula/addons/attacks/model/modelpoison.py @@ -41,11 +41,19 @@ def __init__(self, engine, attack_params): engine (object): The training engine object. attack_params (dict): Dictionary of attack parameters. """ - super().__init__(engine) + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + super().__init__(engine, round_start, round_stop, attack_interval) + self.poisoned_ratio = float(attack_params["poisoned_ratio"]) self.noise_type = attack_params["noise_type"].lower() - self.round_start_attack = int(attack_params["round_start_attack"]) - self.round_stop_attack = int(attack_params["round_stop_attack"]) def modelPoison(self, model: OrderedDict, poisoned_ratio, noise_type="gaussian"): """ diff --git a/nebula/addons/attacks/model/noiseinjection.py b/nebula/addons/attacks/model/noiseinjection.py index 56c1df36..2b499b5e 100644 --- a/nebula/addons/attacks/model/noiseinjection.py +++ b/nebula/addons/attacks/model/noiseinjection.py @@ -26,10 +26,18 @@ def __init__(self, engine, attack_params): engine (object): The training engine object. attack_params (dict): Dictionary of attack parameters, including strength. """ - super().__init__(engine) + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + super().__init__(engine, round_start, round_stop, attack_interval) + self.strength = int(attack_params["strength"]) - self.round_start_attack = int(attack_params["round_start_attack"]) - self.round_stop_attack = int(attack_params["round_stop_attack"]) def model_attack(self, received_weights): """ diff --git a/nebula/addons/attacks/model/swappingweights.py b/nebula/addons/attacks/model/swappingweights.py index 63fa7a7d..a194ba8a 100644 --- a/nebula/addons/attacks/model/swappingweights.py +++ b/nebula/addons/attacks/model/swappingweights.py @@ -32,10 +32,18 @@ def __init__(self, engine, attack_params): engine (object): The training engine object. attack_params (dict): Dictionary of attack parameters, including the layer index. """ - super().__init__(engine) + try: + round_start = int(attack_params["round_start_attack"]) + round_stop = int(attack_params["round_stop_attack"]) + attack_interval = int(attack_params["attack_interval"]) + except KeyError as e: + raise ValueError(f"Missing required attack parameter: {e}") + except ValueError: + raise ValueError("Invalid value in attack_params. Ensure all values are integers.") + + super().__init__(engine, round_start, round_stop, attack_interval) + self.layer_idx = int(attack_params["layer_idx"]) - self.round_start_attack = int(attack_params["round_start_attack"]) - self.round_stop_attack = int(attack_params["round_stop_attack"]) def model_attack(self, received_weights): """ diff --git a/nebula/core/engine.py b/nebula/core/engine.py index 5f09593e..7475db72 100755 --- a/nebula/core/engine.py +++ b/nebula/core/engine.py @@ -366,7 +366,7 @@ async def _start_learning(self): self.total_rounds = self.config.participant["scenario_args"]["rounds"] epochs = self.config.participant["training_args"]["epochs"] await self.get_round_lock().acquire_async() - self.round = 0 + self.round = 1 await self.get_round_lock().release_async() await self.learning_cycle_lock.release_async() print_msg_box( @@ -458,7 +458,7 @@ def learning_cycle_finished(self): return not (self.round < self.total_rounds) async def _learning_cycle(self): - while self.round is not None and self.round < self.total_rounds: + while self.round is not None and self.round <= self.total_rounds: print_msg_box( msg=f"Round {self.round} of {self.total_rounds} started.", indent=2, diff --git a/nebula/frontend/templates/deployment.html b/nebula/frontend/templates/deployment.html index bdd381ae..a36dfefe 100755 --- a/nebula/frontend/templates/deployment.html +++ b/nebula/frontend/templates/deployment.html @@ -504,6 +504,7 @@
Attack Type
+ + + + + + + + + @@ -1119,6 +1144,10 @@
Schema of deployment
data["attack_params"].delay = document.getElementById("delay").value; data["attack_params"].round_start_attack = document.getElementById("start-attack").value data["attack_params"].round_stop_attack = document.getElementById("stop-attack").value + data["attack_params"].attack_interval = document.getElementById("attack-interval").value + data["attack_params"].target_percentage = document.getElementById("target-percentage").value + data["attack_params"].selection_interval = document.getElementById("selection-interval").value + data["attack_params"].flooding_factor = document.getElementById("flooding-factor").value // Step 13 data["with_reputation"] = document.getElementById("with-reputation-btn").checked ? true : false data["is_dynamic_topology"] = document.getElementById("dynamic-topology-btn").checked ? true : false @@ -1219,9 +1248,9 @@
Schema of deployment
selectElement.value = data["attacks"]; selectElement.dispatchEvent(new Event('change')); - document.getElementById("poisoned-node-percent").value = data["poisoned_node_percent"] - document.getElementById("poisoned-sample-percent").value = data["poisoned_sample_percent"] - document.getElementById("poisoned-noise-percent").value = data["poisoned_noise_percent"] + document.getElementById("poisoned-node-percent").value = data.attack_params.poisoned_node_percent; + document.getElementById("poisoned-sample-percent").value = data.attack_params.poisoned_sample_percent; + document.getElementById("poisoned-noise-percent").value = data.attack_params.poisoned_noise_percent; document.getElementById("poisoned-sample-percent").value = data.attack_params.poisoned_percent; document.getElementById("poisoned-noise-percent").value = data.attack_params.poisoned_ratio; document.getElementById("noise_type").value = data.attack_params.noise_type; @@ -1231,8 +1260,12 @@
Schema of deployment
document.getElementById("strength").value = data.attack_params.strength; document.getElementById("layer_idx").value = data.attack_params.layer_idx; document.getElementById("delay").value = data.attack_params.delay; - document.getElementById("start-attack").value = data.attack_params.round_start_attack - document.getElementById("stop-attack").value = data.attack_params.round_stop_attack + document.getElementById("start-attack").value = data.attack_params.round_start_attack; + document.getElementById("stop-attack").value = data.attack_params.round_stop_attack; + document.getElementById("attack-interval").value = data.attack_params.attack_interval; + document.getElementById("target-percentage").value = data.attack_params.target_percentage; + document.getElementById("selection-interval").value = data.attack_params.selection_interval; + document.getElementById("flooding-factor").value = data.attack_params.flooding_factor; if (data["poisoned_node_percent"] == 0) { @@ -2686,6 +2719,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "none"; document.getElementById("stop-attack-title").style.display = "none"; document.getElementById("stop-attack-container").style.display = "none"; + document.getElementById("attack-interval-title").style.display = "none"; + document.getElementById("attack-interval-container").style.display = "none"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "Label Flipping"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2711,6 +2752,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "Sample Poisoning"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2736,6 +2785,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "Model Poisoning"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2761,6 +2818,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "GLL Neuron Inversion"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2787,6 +2852,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "Noise Injection"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2813,6 +2886,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "Swapping Weights"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2839,6 +2920,14 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "none"; + document.getElementById("target-percentage-container").style.display = "none"; + document.getElementById("selection-interval-title").style.display = "none"; + document.getElementById("selection-interval-container").style.display = "none"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; } else if(this.value == "Delayer"){ document.getElementById("poisoned-node-title").style.display = "block"; @@ -2865,6 +2954,48 @@
Schema of deployment
document.getElementById("start-attack-container").style.display = "block"; document.getElementById("stop-attack-title").style.display = "block"; document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "block"; + document.getElementById("target-percentage-container").style.display = "block"; + document.getElementById("selection-interval-title").style.display = "block"; + document.getElementById("selection-interval-container").style.display = "block"; + document.getElementById("flooding-factor-title").style.display = "none"; + document.getElementById("flooding-factor-container").style.display = "none"; + } + else if(this.value == "Flooding"){ + document.getElementById("poisoned-node-title").style.display = "block"; + document.getElementById("poisoned-node-percent-container").style.display = "block"; + document.getElementById("poisoned-sample-title").style.display = "none"; + document.getElementById("poisoned-sample-percent-container").style.display = "none"; + document.getElementById("poisoned-noise-title").style.display = "none"; + document.getElementById("poisoned-noise-percent-container").style.display = "none"; + document.getElementById("noise-type-title").style.display = "none"; + document.getElementById("noise-type-container").style.display = "none"; + document.getElementById("targeted-title").style.display = "none"; + document.getElementById("targeted-container").style.display = "none"; + document.getElementById("target_label-title").style.display = "none"; + document.getElementById("target_label-container").style.display = "none"; + document.getElementById("target_changed_label-title").style.display = "none"; + document.getElementById("target_changed_label-container").style.display = "none"; + document.getElementById("strength-title").style.display = "none"; + document.getElementById("strength-container").style.display = "none"; + document.getElementById("layer_idx-title").style.display = "none"; + document.getElementById("layer_idx-container").style.display = "none"; + document.getElementById("delay-title").style.display = "none"; + document.getElementById("delay-container").style.display = "none"; + document.getElementById("start-attack-title").style.display = "block"; + document.getElementById("start-attack-container").style.display = "block"; + document.getElementById("stop-attack-title").style.display = "block"; + document.getElementById("stop-attack-container").style.display = "block"; + document.getElementById("attack-interval-title").style.display = "block"; + document.getElementById("attack-interval-container").style.display = "block"; + document.getElementById("target-percentage-title").style.display = "block"; + document.getElementById("target-percentage-container").style.display = "block"; + document.getElementById("selection-interval-title").style.display = "block"; + document.getElementById("selection-interval-container").style.display = "block"; + document.getElementById("flooding-factor-title").style.display = "block"; + document.getElementById("flooding-factor-container").style.display = "block"; } }); From ba242d73fea31b16c34ae0571d6278b48e4b8e5c Mon Sep 17 00:00:00 2001 From: FerTV Date: Wed, 5 Mar 2025 11:26:41 +0100 Subject: [PATCH 2/2] message type log deleted --- nebula/core/network/messages.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nebula/core/network/messages.py b/nebula/core/network/messages.py index 0ceca6ad..28f8936c 100644 --- a/nebula/core/network/messages.py +++ b/nebula/core/network/messages.py @@ -77,7 +77,6 @@ async def process_message(self, data, addr_from): if not message_type: logging.warning("Received message with no active field in the 'oneof'") return - logging.info(f"Message type received: {message_type}") message_data = getattr(message_wrapper, message_type)