#define _XOPEN_SOURCE 600 #include "attack_repertoire.h" #include #include #include void attack_step_init(struct attack_step *a_s, char *name, char *MATTACK, cap_execute run, cap_guard guard) { strncpy(a_s->name, name, sizeof(a_s->name)); strncpy(a_s->MATTACK, MATTACK, sizeof(a_s->MATTACK)); a_s->run = run; a_s->guard = guard; } void attack_step_print(struct attack_step *a_s) { printf("%s:\n", a_s->name); printf(" - MITRE ATTCK: %s\n", a_s->MATTACK); } void attack_pattern_init(struct attack_pattern *a_p, char *name, enum ATTACK_VECTOR a_v, enum ATTACK_COMPLEXITY a_c, enum PRIVILEGES_REQUIRED p_r, enum USER_INTERACTION u_i, enum RUNNING_TIME r_t) { strncpy(a_p->name, name, sizeof(a_p->name)); a_p->a_v = a_v; a_p-> a_c = a_c; a_p->p_r = p_r; a_p->u_i = u_i; a_p->r_t = r_t; a_p->num_steps = 0; a_p->max_steps = ATTACK_PATTERN_INIT_NUM_STEPS; a_p->a_steps = malloc(a_p->max_steps * sizeof(char*)); } void attack_pattern_add_step(struct attack_pattern *a_p, char *a_s) { if(a_p->num_steps >= a_p->max_steps) { a_p->max_steps *= 2; a_p->a_steps = realloc(a_p->a_steps,a_p->max_steps * sizeof(char*)); } a_p->a_steps[a_p->num_steps] = strdup(a_s); a_p->num_steps++; } void attack_pattern_destroy(struct attack_pattern *a_p) { for(size_t i = 0 ; i < a_p->num_steps;i++) { free(a_p->a_steps[i]); } free(a_p->a_steps); } void attack_pattern_print(struct attack_pattern *a_p) { printf("%s:\n",a_p->name); printf(" - AV: %g\n",attack_vector_score(a_p->a_v)); printf(" - AC: %g\n",attack_complexity_score(a_p->a_c)); printf(" - PR: %g\n",privileges_required_score(a_p->p_r)); printf(" - UI: %g\n",user_interaction_score(a_p->u_i)); printf(" - RT: %g\n",running_time_score(a_p->r_t)); //prettify this if needed, for now let it be printf(" -steps:\n"); for(size_t i=0;inum_steps;i++) { printf(" %zu: %s\n",i,a_p->a_steps[i]); } } void attack_repertoire_init(struct attack_repertoire *a_r) { a_r->num_attack_steps = 0; a_r->max_attack_steps = ATTACK_REPERTOIRE_INIT_NUM_STEPS; a_r->a_steps = malloc(a_r->max_attack_steps * sizeof(struct attack_step)); a_r->num_attack_patterns = 0; a_r->max_attack_patterns = ATTACK_REPERTOIRE_INIT_NUM_PATTERNS; a_r->a_patterns = malloc(a_r->max_attack_patterns * sizeof(struct attack_pattern)); } void attack_repertoire_add_pattern(struct attack_repertoire *a_r, struct attack_pattern *a_p) { if(a_r->num_attack_patterns >= a_r->max_attack_patterns) { a_r->max_attack_patterns *= 2; a_r->a_patterns = realloc(a_r->a_patterns, a_r->max_attack_patterns * sizeof(struct attack_pattern)); } a_r->a_patterns[a_r->num_attack_patterns] = *a_p; a_r->num_attack_patterns++; } void attack_repertoire_add_step(struct attack_repertoire *a_r, struct attack_step *a_s) { if(a_r->num_attack_steps >= a_r->max_attack_steps) { a_r->max_attack_steps *= 2; a_r->a_steps = realloc(a_r->a_steps, a_r->max_attack_steps * sizeof(struct attack_step)); } a_r->a_steps[a_r->num_attack_steps] = *a_s; a_r->num_attack_steps++; } void attack_repertoire_destroy(struct attack_repertoire *a_r) { //cleanup patterns for(size_t i=0;inum_attack_patterns;i++) { struct attack_pattern *a_p = &a_r->a_patterns[i]; attack_pattern_destroy(a_p); } free(a_r->a_patterns); //cleanup steps free(a_r->a_steps); } void attack_repertoire_print(struct attack_repertoire *a_r) { printf("[Steps]\n"); for(size_t i=0;inum_attack_steps;i++) { attack_step_print(&a_r->a_steps[i]); } printf("[Patterns]\n"); for(size_t i=0;inum_attack_patterns;i++) { attack_pattern_print(&a_r->a_patterns[i]); } } struct attack_pattern *attack_repertoire_get_pattern(struct attack_repertoire *a_r, char *attack) { for(size_t i=0;i < a_r->num_attack_patterns;i++) { if(strcmp(a_r->a_patterns[i].name, attack) == 0) { return &a_r->a_patterns[i]; } } return NULL; } struct attack_step *attack_repertoire_get_attack_step(struct attack_repertoire *a_r, char *step) { for(size_t i=0;i < a_r->num_attack_steps;i++) { if(strcmp(a_r->a_steps[i].name, step) == 0) { return &a_r->a_steps[i]; } } return NULL; }