ADAPT / src / attack_utility.c
attack_utility.c
Raw
#include "target_utility.h"

#include "mape_k.h"
#include "knowledge_base.h"
#include "analysis.h"
#include "task_engine.h"

#include <pthread.h>
#include <stdlib.h>
#include "arc_model.h"

#include <stdio.h>
#include <string.h>

#include "attack_repertoire.h"
#include "timestamp.h"


static void enum_to_arc_value(int enum_value, struct arc_value *value)
{
	value->type = V_INT;
	value->v_int = enum_value;
}

void attack_utility_init(struct knowledge_base *k_b)
{
	struct utility_decision *attack_utility = malloc(sizeof(struct utility_decision));
	utility_decision_init(attack_utility,5);
	utility_decision_add_concern(attack_utility, "AttackVector", 0.3, attack_vector_utility);
	utility_decision_add_concern(attack_utility, "AttackComplexity",0.2, attack_complexity_utility);
	utility_decision_add_concern(attack_utility, "PrivilegesRequired", 0.2, privileges_required_utility);
	utility_decision_add_concern(attack_utility, "UserInteraction", 0.1, user_interaction_utility);
	utility_decision_add_concern(attack_utility, "RunningTime", 0.2, running_time_utility);

	struct named_res *t_u_res = malloc(sizeof(struct named_res));
    named_res_init(t_u_res, "AttackUtility", 1, attack_utility);
    knowledge_base_add_res(k_b, t_u_res);
	
}

void attack_utility(struct analysis *a)
{
	timestamp("[","] ");
    printf("[Utility] Attacks [Start]\n");
    
    struct knowledge_base *k_b = &a->az->mape_k->k_b;
    struct attack_repertoire *a_r= knowledge_base_get_res(k_b, "AttackRepertoire");

    struct utility_decision *attack_utility = knowledge_base_get_res(k_b,"AttackUtility");;


	//Attack utility does not change over time, so we only need to do this once really.
	if(attack_utility->num_alternatives == 0)
	{
		
	
		
		for(size_t i=0; i < a_r->num_attack_patterns; i++)
		{
			struct attack_pattern *a_p = &a_r->a_patterns[i];

			struct arc_value attack_values[attack_utility->num_concerns];

			enum_to_arc_value(a_p->a_v, &attack_values[0]);
			enum_to_arc_value(a_p->a_c, &attack_values[1]);
			enum_to_arc_value(a_p->p_r, &attack_values[2]);
			enum_to_arc_value(a_p->u_i, &attack_values[3]);
			enum_to_arc_value(a_p->r_t, &attack_values[4]);

			/*
			double a_v = attack_vector_score(a_p->a_v);
			double a_c = attack_complexity_score(a_p->a_c);
			double p_r = privileges_required_score(a_p->p_r);
			double u_i = user_interaction_score(a_p->u_i);
			double r_t = running_time_score(a_p->r_t);
			*/
			utility_decision_add_option(attack_utility,a_p->name,attack_values,attack_utility->num_concerns);
			//double u = 0.3*a_v+0.2*a_c+0.2*p_r+0.1*u_i+0.2*r_t;
			//utility_score_init(&attack_utility[i],a_p->name,u);
	
		}
		utility_decision_rank(attack_utility);
	}


    for(int i=0;i<attack_utility->num_alternatives;i++)
	{
		printf("%s:%lg\n",attack_utility->options[i].name, attack_utility->options[i].utility);
	}


	timestamp("[","] ");
    printf("[Utility] Attacks [Complete]\n");
	
    analysis_set_status(a, ANALYSIS_DONE);
    a->done(a);
}


void attack_utility_z(struct analysis *a)
{
	timestamp("[","] ");
    printf("[Utility] Attacks [Start]\n");
    
    struct knowledge_base *k_b = &a->az->mape_k->k_b;
    struct attack_repertoire *a_r= knowledge_base_get_res(k_b, "AttackRepertoire");

    struct utility_score *attack_utility;
    attack_utility = malloc(a_r->num_attack_patterns *sizeof(struct utility_score));
    
    for(size_t i=0; i < a_r->num_attack_patterns; i++)
    {
		struct attack_pattern *a_p = &a_r->a_patterns[i];

		double a_v = attack_vector_score(a_p->a_v);
		double a_c = attack_complexity_score(a_p->a_c);
		double p_r = privileges_required_score(a_p->p_r);
		double u_i = user_interaction_score(a_p->u_i);
		double r_t = running_time_score(a_p->r_t);

		double u = 0.3*a_v+0.2*a_c+0.2*p_r+0.1*u_i+0.2*r_t;
		utility_score_init(&attack_utility[i],a_p->name,u);

		printf("[Utility] %s:%g\n",a_p->name,u);
	
    }

    qsort(attack_utility,a_r->num_attack_patterns,sizeof(struct utility_score),compare_utility_scores);


    
    //Cleanup previous loop's stuff
    struct utility_score  *old_utility = knowledge_base_get_res(k_b,"AttackUtilityRanking");
    size_t num_utility_entries = knowledge_base_num_res(k_b,"AttackUtilityRanking");
    if(old_utility)
    {
		for(size_t i = 0; i < num_utility_entries;i++)
		{
			free(old_utility[i].option);
		}
		free(old_utility);
		knowledge_base_rem_res(k_b,"AttackUtilityRanking");
	
    }
    

    struct named_res *a_u_res = malloc(sizeof(struct named_res));
    named_res_init(a_u_res, "AttackUtilityRanking", a_r->num_attack_patterns, attack_utility);
    knowledge_base_add_res(k_b, a_u_res);

	timestamp("[","] ");
    printf("[Utility] Attacks [Complete]\n");
	
    analysis_set_status(a, ANALYSIS_DONE);
    a->done(a);
}