diff --git a/ISO27001effectiveness/R/Hackmageddon_Parser.R b/ISO27001effectiveness/R/Hackmageddon_Parser.R index 9d65595..0a512dc 100644 --- a/ISO27001effectiveness/R/Hackmageddon_Parser.R +++ b/ISO27001effectiveness/R/Hackmageddon_Parser.R @@ -90,6 +90,8 @@ ProcessHMRaw <- function(dataset.raw, dateOffset){ dataset <- merge(x = dataset, y = Attack.config, by = "Attack", all.x = TRUE) dataset <- subset(dataset, select = -c(Attack)) + dataset <- FilterMultiAttack(dataset) + dataset } @@ -132,6 +134,46 @@ FilterMultiCountry <- function(dataset.pre) { } } +#' Look for rows with more than one attack and split into multiple +#' +#' @param dataset.pre data.frame to process +#' +#' @return data.frame +FilterMultiAttack <- function(dataset.pre) { + + #data.frame with multiple taget country rows + multi <- dataset.pre[grepl("/",dataset.pre$Attack.standar),] + + if (nrow(multi) == 0) { #Ignore if there are not multiple target rows + + dataset.pre + } else { + + #data.frame with every rows except multi ones + dataset <- dataset.pre[!grepl("/",dataset.pre$Attack.standar),] + + #Iterate over multi + for (i in 1:nrow(multi)) { + crow <- multi[i,] #current row + + country_s <- strsplit(toString(crow$Attack.standar), "/")[[1]] #each country target + + #Iterate over each country target + for (j in 1:length(country_s)) { + #Date <- crow[1] + #Attack.standar <- country_s[j] + #Target <- crow[3] + #Country <- crow[4] + new.row <- data.frame(crow) + new.row$Attack.standar <- country_s[j] + dataset <- rbind(dataset, new.row) #Append new row to output data.frame + } + } + + dataset + } +} + #' Parse every excel file into a folder #' #' @param folder path to the folder to iterate diff --git a/ISO27001effectiveness/R/ReportGraphs.R b/ISO27001effectiveness/R/ReportGraphs.R index 6a0f784..10c09e5 100644 --- a/ISO27001effectiveness/R/ReportGraphs.R +++ b/ISO27001effectiveness/R/ReportGraphs.R @@ -78,6 +78,181 @@ GetAttacksMonthEvolution <- function(Attacks){ } +GetAttackTypePie <- function (Attacks){ + + attack.pie <- group_by(Attacks, Attack.standar) + attack.pie <- as.data.frame(table(attack.pie$Attack.standar)) + attack.pie <- setNames(attack.pie, c("Attack", "Count")) + + attack.pie <- attack.pie[attack.pie$Attack != "",] + attack.pie <- attack.pie[attack.pie$Count > (sum(attack.pie$Count) * 0.01),] + + graph1 <- ggplot(data=attack.pie, + aes(x=factor(1), + y=Count, + fill=Attack)) + + geom_col(width = 1, color='black') + +# geom_label(aes(label=paste( round(x = 100 - (sum(attack.pie$Count) / attack.pie$Count), digits = 2), "%")), +# vjust=c(0), +# hjust=c(0)) + + coord_polar(theta="y") + + scale_x_discrete(labels = c("")) + + scale_y_discrete(labels = c("")) + + theme(plot.title = element_text(hjust = 0.5), + axis.title.x=element_blank(), + axis.title.y=element_blank()) + + ggtitle("Attack type pie") + + graph1 +} + +GetAttackTypeEvolution <- function(Attacks){ + Attacks.pre <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Attack.standar) + Attacks.pre <- as.data.frame(table(Attacks.pre$Year, Attacks.pre$Attack.standar)) + Attacks.pre <- setNames(Attacks.pre, c("Year", "Attack", "Count")) + Attacks.pre <- Attacks.pre[Attacks.pre$Attack != "",] + Attacks.pre <- plyr::arrange(Attacks.pre, Year, Attack) + + + b <- as.character(sort(unique(Attacks.pre$Attack))) + + Attacks.desg <- data.frame(Year = sort(unique(Attacks.pre$Year))) + + for (i in 1:length(b)) { + Attacks.desg <- cbind(Attacks.desg, Attacks.pre[Attacks.pre$Attack == b[i],3]) + } + + Attacks.desg <- setNames(Attacks.desg, c("Year", gsub(" ", ".", b))) + + Attacks.desg <- select(Attacks.desg, Year, `Account.Hijacking`, `DDoS`, `Defacement`, `DNS`, `Injection`, `Malware`) + + graph1 <- ggplot(data = Attacks.desg, + aes_string(x = colnames(Attacks.desg)[1])) + + graph1 <- graph1 + + + #geom_line(aes(y = Zero.day, group = 1, colour = "Zero.day")) + + #geom_point(aes(y = Zero.day, group = 1, colour = "Zero.day")) + + + geom_line(aes(y = `Account.Hijacking`, group = 1, colour = "Account.Hijacking")) + + geom_point(aes(y = `Account.Hijacking`, group = 1, colour = "Account.Hijacking")) + + + geom_line(aes(y = `DDoS`, group = 1, colour = "DDoS")) + + geom_point(aes(y = `DDoS`, group = 1, colour = "DDoS")) + + + geom_line(aes(y = `Defacement`, group = 1, colour = "Defacement")) + + geom_point(aes(y = `Defacement`, group = 1, colour = "Defacement")) + + + geom_line(aes(y = `DNS`, group = 1, colour = "DNS")) + + geom_point(aes(y = `DNS`, group = 1, colour = "DNS")) + + + geom_line(aes(y = `Injection`, group = 1, colour = "Injection")) + + geom_point(aes(y = `Injection`, group = 1, colour = "Injection")) + + + geom_line(aes(y = `Malware`, group = 1, colour = "Malware")) + + geom_point(aes(y = `Malware`, group = 1, colour = "Malware")) + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("Attack type evolution") + + labs(colour = "Attack type") + xlab("Years") + ylab("Attacks") + + graph1 + + } + + +GetAttackTypeTopEvolution <- function(Attacks){ + Attacks.pre <- mutate(Attacks, Year = format(Attacks$Date, "%Y")) %>% group_by(Year, Attack.standar) + Attacks.pre <- as.data.frame(table(Attacks.pre$Year, Attacks.pre$Attack.standar)) + Attacks.pre <- setNames(Attacks.pre, c("Year", "Attack", "Count")) + Attacks.pre <- Attacks.pre[Attacks.pre$Attack != "",] + Attacks.pre <- plyr::arrange(Attacks.pre, Year, Attack) + + b <- as.character(sort(unique(Attacks.pre$Attack))) + + Attacks.desg <- data.frame(Year = sort(unique(Attacks.pre$Year))) + + for (i in 1:length(b)) { + Attacks.desg <- cbind(Attacks.desg, Attacks.pre[Attacks.pre$Attack == b[i],3]) + } + + Attacks.desg <- setNames(Attacks.desg, c("Year", b)) + + Attacks.desg <- select(Attacks.desg, Year, `Account Hijacking`, `DDoS`, `Defacement`, `DNS`, `Injection`, `Malware`) + + graph1 <- ggplot(data = Attacks.desg, + aes(x = Year, y = `DDoS`, group = 1)) + + + geom_line() + + geom_point() + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("DDoS") + + xlab("Years") + ylab("Attacks")+ + stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + + graph2 <- ggplot(data = Attacks.desg, + aes(x = Year, y = `Defacement`, group = 1)) + + + geom_line() + + geom_point() + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("Defacement") + + xlab("Years") + ylab("Attacks")+ + stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + + graph3 <- ggplot(data = Attacks.desg, + aes(x = Year, y = `Injection`, group = 1)) + + + geom_line() + + geom_point() + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("Injection") + + xlab("Years") + ylab("Attacks")+ + stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + + graph4 <- ggplot(data = Attacks.desg, + aes(x = Year, y = `Account Hijacking`, group = 1)) + + + geom_line() + + geom_point() + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("Account Hijacking") + + xlab("Years") + ylab("Attacks")+ + stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + + graph5 <- ggplot(data = Attacks.desg, + aes(x = Year, y = `Malware`, group = 1)) + + + geom_line() + + geom_point() + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("Malware") + + xlab("Years") + ylab("Attacks")+ + stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + + graph6 <- ggplot(data = Attacks.desg, + aes(x = Year, y = `DNS`, group = 1)) + + + geom_line() + + geom_point() + + + theme(plot.title = element_text(hjust = 0.5)) + + ggtitle("DNS") + + xlab("Years") + ylab("Attacks")+ + stat_smooth(method = "lm", se = FALSE, aes(outfit=fit<<-..y..)) + + + list(graph1, graph2, graph3, graph4, graph5, graph6) + +} + + + GetBaseCertsGraph <- function(Cert_PerCountry, year){ diff --git a/ISO27001effectiveness/Report.Rmd b/ISO27001effectiveness/Report.Rmd index 8bb86ec..ebf19a2 100644 --- a/ISO27001effectiveness/Report.Rmd +++ b/ISO27001effectiveness/Report.Rmd @@ -10,11 +10,13 @@ output: library(knitr) knitr::opts_chunk$set(echo = FALSE) +knitr::opts_chunk$set(warning = FALSE) +knitr::opts_chunk$set(message = FALSE) devtools::load_all(".") ``` -```{r include=TRUE, warning=FALSE, results='hide', message=FALSE, cache=TRUE} +```{r include=TRUE, results='hide', cache=TRUE} source("./Main.R") ``` @@ -80,16 +82,16 @@ Para llegar hasta el fueron necesarios procesos algo más complejos, pero se res En primer lugar, para saber si este estudio tiene sentido, se observará la evolución temporal tanto de los ciberataques reportados como de las certificaciones realizadas en busca de patrones que puedan indicar una relación entre ambas evoluciones. -```{r fig.width=4.5, fig.height=4,echo=FALSE,out.extra='style="float:left"'} +```{r fig.width=4.5, fig.height=4,out.extra='style="float:left"'} ISO27001effectiveness::GetCertsEvolution(Cert_PerCountry) ``` -```{r fig.width=4.5, fig.height=4,echo=FALSE} +```{r fig.width=4.5, fig.height=4} ISO27001effectiveness::GetAttacksEvolution(Attacks) ``` Como se puede observar en las gráficas, el número de empresas que obtienen la certificación crece anualmente, mientras que el numero de ataques es un poco más inestable. Del año 2013 al 2014 el número de ataques se reduce drásticamente, esto puede deberse a un problema en la fuente de datos, ya que al depender directamente de un ser humano pueden existir intervalos en los que se hayan registrado menos datos (por problemas del administrador, como falta de tiempo o interes). Otra explicación plausible es que justo en el año 2013 se produjo una revisión de la certificación, produciendose la ISO 27001:2013 que sustituyó a su predecesora 27001:2005, los cambios realizados pueden consultarse en la [web oficial](http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=54534). Para indagar un poco sobre este tema a continuación se representa la evolución de los ataques mes a mes, al aumentar la precisión en el eje X se puede observar mejor la tendencia y abstraernos un poco de esos errores humanos. -```{r fig.width=9, fig.height=4,echo=FALSE} +```{r fig.width=9, fig.height=4} ISO27001effectiveness::GetAttacksMonthEvolution(Attacks) ``` @@ -98,9 +100,68 @@ También se podría relacionar la evolución de los ataques con la evolución de ### Evolución por tipo de ataque +Podría darse el caso de que la certificación tenga uan efectividad mayor contra ciertas técnicas de ataque y que dicha efectividad se camufle entre el resto de técnicas, por ello contemplamos el estudio individual de los diferentes tipos de ataques definidos en nuestra fuente de datos. Existen multitud de ellos por lo que el estudio se tendrá que centrar en una pequeña parte de ellos, los más empleados. Para llevar a cabo esta elección se representan a continuación aquellos que representan al menos un 1% del total de ataques producidos. +```{r fig.width=9, fig.height=5} +ISO27001effectiveness::GetAttackTypePie(Attacks) +``` + +Como se puede observar en el gráfico anterior, la mayor parte de los ataques registrados en nuestra fuente de datos emplean las siguientes técnicas, que serán las estudiadas a continuación: + +* Injection: Cualquier tipo de inyeccion ya sea de código, SQL, etc + +* Defacement: Consiste básicamente en modificar la apariencia de una página web. + +* DDoS: Trata de saturar un servicio mediante miles de conexiones para evitar que los usuarios legítimos puedan acceder con normalidad. + +* Account Hijacking: Con lo que obtienen datos o credenciales de cuentas ajenas. + +* Malware: Programas que se ejecutan en el sistema victima para llevar a cabo actividades maliciosas. + +* DNS: Ataques basados en los servidores DNS de la victima, como el poisoning, que consigue retornar las IPs que no debería a cada petición. + +```{r fig.width=9, fig.height=4} +ISO27001effectiveness::GetAttackTypeEvolution(Attacks) +``` + +Como podemos observar en la evolución temporal reflejada en el gráfico, existen ciertas técnicas que mas o menos son constantes en el tiempo, y existen otras que tienen o podrian tener una pendiente negativa clara. Nos centraremos en aquellos tipos de ataques que muestran dicha tendencia al descenso y que podremos observar a continuación. + +```{r fig.width=3, fig.height=3,out.extra='style="float:left"'} +top <- ISO27001effectiveness::GetAttackTypeTopEvolution(Attacks) +top[[3]] +slope3 <- (fit[5] - fit[1]) / 4 +``` +```{r fig.width=3, fig.height=3,out.extra='style="float:left"'} +top[[1]] +slope1 <- (fit[5] - fit[1]) / 4 +``` +```{r fig.width=3, fig.height=3} +top[[2]] +slope2 <- (fit[5] - fit[1]) / 4 +``` +```{r fig.width=3, fig.height=3,out.extra='style="float:left"'} +top[[6]] +slope6 <- (fit[5] - fit[1]) / 4 +``` +```{r fig.width=3, fig.height=3,out.extra='style="float:left"'} +top[[4]] +slope4 <- (fit[5] - fit[1]) / 4 +``` +```{r fig.width=3, fig.height=3} +top[[5]] +slope5 <- (fit[5] - fit[1]) / 4 +``` + +Los tipos de ataque están ordenados por la pendiente de su tendencia, de menor a mayor, para reflejar cuáles están descendiendo más rápido y por lo tanto cuáles podrían reflejar mejor el aumento de certificaciones ISO27001 expedidas. + +Tanto _Malware_ como _Account Hijacking_ tienen una tendencia con pendiente positiva, `r slope4` y `r slope5` respectivamente, por lo que quedan descartadas para este estudio. + +La tendencia con una mayor pendiente negativa es _Injection_ (`r slope3`) y junto con _DDoS_ (`r slope1`), que también tiene una tendencia llamativa, pueden ser los que estén mas relacionados con la efectividad de la certificación ISO 27001. + +Por otro lado tenemos _DNS_ cuya tendencia también tiene una pendiente negativa (`r slope6`), pero es muy moderada y además podemos observar que los casos reportados en nuestra fuente de datos son mas bien escasos. +### Evolución por tipo de ataque De los datos mostrados se pueden hacer diferentes observaciones: diff --git a/ISO27001effectiveness/Report.html b/ISO27001effectiveness/Report.html index 616b26b..8641296 100644 --- a/ISO27001effectiveness/Report.html +++ b/ISO27001effectiveness/Report.html @@ -347,6 +347,24 @@ $(document).ready(function () {
Podría darse el caso de que la certificación tenga uan efectividad mayor contra ciertas técnicas de ataque y que dicha efectividad se camufle entre el resto de técnicas, por ello contemplamos el estudio individual de los diferentes tipos de ataques definidos en nuestra fuente de datos. Existen multitud de ellos por lo que el estudio se tendrá que centrar en una pequeña parte de ellos, los más empleados. Para llevar a cabo esta elección se representan a continuación aquellos que representan al menos un 1% del total de ataques producidos.
+ +Como se puede observar en el gráfico anterior, la mayor parte de los ataques registrados en nuestra fuente de datos emplean las siguientes técnicas, que serán las estudiadas a continuación:
+Injection: Cualquier tipo de inyeccion ya sea de código, SQL, etc
Defacement: Consiste básicamente en modificar la apariencia de una página web.
DDoS: Trata de saturar un servicio mediante miles de conexiones para evitar que los usuarios legítimos puedan acceder con normalidad.
Account Hijacking: Con lo que obtienen datos o credenciales de cuentas ajenas.
Malware: Programas que se ejecutan en el sistema victima para llevar a cabo actividades maliciosas.
DNS: Ataques basados en los servidores DNS de la victima, como el poisoning, que consigue retornar las IPs que no debería a cada petición.
Como podemos observar en la evolución temporal reflejada en el gráfico, existen ciertas técnicas que mas o menos son constantes en el tiempo, y existen otras que tienen o podrian tener una pendiente negativa clara. Nos centraremos en aquellos tipos de ataques que muestran dicha tendencia al descenso y que podremos observar a continuación.
++
Los tipos de ataque están ordenados por la pendiente de su tendencia, de menor a mayor, para reflejar cuáles están descendiendo más rápido y por lo tanto cuáles podrían reflejar mejor el aumento de certificaciones ISO27001 expedidas.
+Tanto Malware como Account Hijacking tienen una tendencia con pendiente positiva, 10.1 y 20.2 respectivamente, por lo que quedan descartadas para este estudio.
+La tendencia con una mayor pendiente negativa es Injection (-173.5) y junto con DDoS (-49.3), que también tiene una tendencia llamativa, pueden ser los que estén mas relacionados con la efectividad de la certificación ISO 27001.
+Por otro lado tenemos DNS cuya tendencia también tiene una pendiente negativa (-3.8), pero es muy moderada y además podemos observar que los casos reportados en nuestra fuente de datos son mas bien escasos.
De los datos mostrados se pueden hacer diferentes observaciones: