Attack Runner¶
The attack runner is a script to execute multiple attacks at once. It can create one attack report containing the results of all executed attacks.
See also
An attack runner tutorial notebook is available here.
Module Documentation¶
Attack runner for convenient pentesting with multiple configurations.
- 
pepr.attack_runner.create_report(attack_object_paths, save_path, pdf=False)¶ Create an attack report for all attacks.
Parameters: - attack_object_paths (dict) – Dictionary with attack alias and the corresponding path to the serialized attack object.
 - save_path (str) – Path where to save the report files.
 - pdf (bool) – If true, the attack runner will build the LaTex report and save an PDF to the save path.
 
- 
pepr.attack_runner.run_attacks(yaml_path, attack_obj_save_path, functions)¶ Run multiple attacks configured in a YAML file.
Parameters: - yaml_path (str) – Path to attack configuration file in YAML format.
 - attack_obj_save_path (str) – Path where to save the serialized attack objects.
 - functions (dict) – Dictionary containing the functions which return TensorFlow models. The keys should correspond to the strings in the configuration file.
 
Returns: Dictionary with attack alias and the corresponding path to the serialized attack object in the same order as specified in the YAML configuration.
Return type: dict
Saved Attack Objects¶
The attack runner saves all created attack objects into the specified directory
(attack_obj_save_path) using
Python Pickle. When unpickling
these objects, make sure, that the corresponding folders with the “tm” suffix are
available in the same directory, because they include the target models.
Note
Currently, the only purpose for saving the attack objects is for the
create_report function. In the future these objects may be used to avoid
re-execution of unchanged attacks.
Attack Runner Configuration¶
The attack runner configuration file is an YAML file that specifies everything that is needed to run an attack. There are two required main keys for every attack:
attack_parsdata_conf
Attack Parameters (attack_pars)¶
Attack Independent Keys¶
attack_pars is a list of attack parameters for every attack to run. Every list
entry must have the following not attack dependent keys:
attack_typeattack_aliaspath_to_dataset_datapath_to_dataset_labelstarget_models
attack_type specifies the type of the attack (e.g. "mia" or "gmia").
attack_alias defines a unique name for the attack configuration. It is saved in the
attack object and is the heading of the subsection in the report.
path_to_dataset_data and path_to_dataset_labels each defining a path to a
serialized numpy array. target_models defines an array of paths where the serialized
target models are saved.
Example:
1 2 3 4 5 6 7 8 9  | attack_pars:
- attack_type: "mia"
  attack_alias: "MIA Default"
  path_to_dataset_data: "datasets/cifar100_data.npy"
  path_to_dataset_labels: "datasets/cifar100_labels.npy"
  target_model_paths:
  - "data/target_model_mia0"
  - "data/target_model_mia1"
  # ... attack dependent keys
 | 
Special key run_args¶
For passing additional parameters to the run-function of the attack, add them to
run_args like in the following example:
1 2 3 4  | run_args:
- param1: 1
  param2: "example"
  param3: "You got it!"
 | 
This is equivalent to:
1 2  | attack = PeprAttackPlaceholder(...)
attack.run(param1=1, param2="example", param3="You got it!")
 | 
run_args is optional and available for every attack. The arguments that can be
passed depend on the chosen attack, please read its documentation.
In the Adversarial Robustness Toolbox (ART) for example, the maximum number of
iterations of the PixelAttack is passed as an argument to the generate()
function. Below is an example configuration of the PixelAttack using
run_args.
Example 2:
1 2 3 4 5 6 7 8 9 10  | attack_pars:
- attack_type: "ART_PixelAttack"
  attack_alias: "PixelAttack"
  path_to_dataset_data: "datasets/mnist_data.npy"
  path_to_dataset_labels: "datasets/mnist_labels.npy"
  target_model_paths:
  - "data/target_model"
  run_args:
  - max_iter: 20
  # ... attack dependent keys
 | 
Attack Dependent Keys¶
One list entry consists of a dictionary with all attack parameters for the desired
attack. All keys of the attack_pars dictionary that are passed to the corresponding
attack constructor, must be also defined in the list entry.
This means, to set a specific parameter in the attack_pars dictionary of an attack,
the YAML key must have the same name as the key in attack_pars to set. But there are
exceptions for arrays and functions:
Arrays: <np> - If there is an attack dependent key to set with a list or numpy array, the
<np> prefix is used for the key. If the attack runner sees this prefix, it expects
the value to be a path to a serialized numpy array which will be loaded with
numpy.load.
Functions: <fn> - If there is an attack dependent key to set with a function pointer from
the function dictionary (functions parameter of run_attacks), the <fn>
prefix is used for the key. The value is expected to be a key string in the function
dictionary.
Warning
Prefixes can not be used with attack independent keys! Using it with attack
independent keys like path_to_dataset_data will cause the attack to fail!
Listing all attack dependent keys per attack:
- MIA
 number_shadow_modelsshadow_training_set_sizenumber_classes<fn>create_compile_shadow_modelshadow_epochsshadow_batch_size<fn>create_compile_attack_modelattack_epochsattack_batch_size
- GMIA
 number_reference_modelsreference_training_set_sizenumber_classes<fn>create_compile_modelreference_epochsreference_batch_sizehlf_metrichlf_layer_numbernumber_target_records
Data Configuration (data_conf)¶
data_conf is a list of data configurations for every attack. The order must be the
same as the order of attack_pars. The required keys are equal to the data_conf
dictionary that is passed to the attack constructor but with the prefix <np> added
to them as they are paths to serialized numpy arrays.
The data prefixes explained above can also be used for the data configuration keys.
Arrays: <np> - If there is a key to set with a list or numpy array, the
<np> prefix is used for the key. If the attack runner sees this prefix, it expects
the value to be a path to a serialized numpy array which will be loaded with
numpy.load.
Functions: <fn> - If there is a key to set with a function pointer from
the function dictionary (functions parameter of run_attacks), the <fn>
prefix is used for the key. The value is expected to be a key string in the function
dictionary.
Listing all keys per attack:
- MIA
 <np>shadow_indices<np>target_indices<np>evaluation_indices<np>record_indices_per_target
- GMIA
 <np>reference_indices<np>target_indices<np>evaluation_indices<np>record_indices_per_target
Example Configuration¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43  | # Attack Parameters
attack_pars:
  - attack_type: "mia"                                              # --
    attack_alias: "MIA Tutorial"                                    #  |
    path_to_dataset_data: "datasets/cifar100_data.npy"              #  | Attack independent
    path_to_dataset_labels: "datasets/cifar100_labels.npy"          #  | parameters
    target_model_paths:                                             #  |
    - "data/target_model_mia"                                       # --
    number_shadow_models: 100                                       # --
    shadow_training_set_size: 2500                                  #  |
    number_classes: 100                                             #  |
    <fn>create_compile_shadow_model: "create_compile_shadow_model"  #  |
    shadow_epochs: 100                                              #  | MIA
    shadow_batch_size: 50                                           #  | parameters
    <fn>create_compile_attack_model: "create_compile_attack_model"  #  |
    attack_epochs: 50                                               #  |
    attack_batch_size: 50                                           # --
  - attack_type: "gmia"                                             # --
    attack_alias: "GMIA Tutorial"                                   #  |
    path_to_dataset_data: "datasets/fmnist_data.npy"                #  | Attack independent
    path_to_dataset_labels: "datasets/fmnist_labels.npy"            #  | parameters
    target_model_paths:                                             #  |
    - "data/target_model_gmia"                                      # --
    number_reference_models: 100                                    # --
    reference_training_set_size: 10000                              #  |
    number_classes: 10                                              #  |
    create_compile_model: "create_compile_reference_model"          #  |
    reference_epochs: 50                                            #  | GMIA
    reference_batch_size: 50                                        #  | parameters
    hlf_metric: "cosine"                                            #  |
    hlf_layer_number: 10                                            #  |
    number_target_records: 25                                       # --
# Data Configuration
data_conf:
  - <np>shadow_indices: "datasets/shadow_indices.npy"
    <np>target_indices: "datasets/target_indices.npy"
    <np>evaluation_indices: "datasets/evaluation_indices.npy"
    <np>record_indices_per_target: "datasets/record_indices_per_target.npy"
  - <np>reference_indices: "datasets/reference_indices.npy"
    <np>target_indices: "datasets/target_indices.npy"
    <np>evaluation_indices: "datasets/evaluation_indices.npy"
    <np>record_indices_per_target: "datasets/record_indices_per_target.npy"
 |