Insufficient Logging & Monitoring
Para conocer todas las acciones que se llevan a cabo, por qué entidad y a qué dato se ha accedido, se debe guardar trazas suficientes para mantener la propiedad de auditabilidad de la aplicación.
Riesgo de la vulnerabilidad
Aumento de los tiempos y costes de mantenimiento y resolución de incidencias.
Numerosos incidentes de seguridad pueden ser prevenidos o mitigados con una buena monitorización. Por ejemplo:
Ransomware (por ejemplo NotPetya, BadRabbit): Software malicioso que encripta ficheros del sistema y pide un rescate económico a cambio de poder recuperar la información.
Ataques DNS (por ejemplo, DNS hijacking): Ataques que permiten interceptar del tráfico de información legítimo, accediendo a los datos transmitidos, o bien suplantar orígenes o destinos de datos.
Ataques de botnets: Los botnets pueden realizar distintos tipos de ataques que requieren una cadena de acciones, que pueden ser detectadas con una correcta monitorización.
Troyanos (por ejemplo, WinNTI): Malwares que, aparentando ser un software inofensivo para ganar la confianza del usuario, realizan acciones perjudiciales en el sistema.
Código vulnerable 1:
[...]
@RequestMapping(value = "/registration", method = RequestMethod.POST)
public String registration(@ModelAttribute("userForm") UserRequestVO userForm,
@RequestParam(name = "g-recaptcha-response") String
gRecaptchaResponse,
BindingResult bindingResult,
Model model) throws IOException {
boolean verify = VerifyRecaptcha.verify(gRecaptchaResponse);
if (!verify) {
model.addAttribute("message", "You missed the Captcha");
}
userValidator.validate(userForm, bindingResult);
if (bindingResult.hasErrors() || !verify) {
return "registration";
}
userService.save(userForm);
securityService.autoLogin(userForm.getMailId(), userForm
.getPasswordConfirm());
return "redirect:/home";
}
@RequestMapping(value = {"/", "/home"})
public String welcome(Model model) {
return "home";
}
@GetMapping("/403")
public String error403() {
LOG.warn("Request for restricted page.");
return "access-denied";
}
[...] |
Solución:
Se deben localizar los puntos donde se requiere guardar información vital para poder reconstruir el flujo de uso de la aplicación por una entidad.
[...]
@RequestMapping(value = "/registration", method = RequestMethod.POST)
public String registration(@ModelAttribute("userForm") UserRequestVO userForm,
@RequestParam(name = "g-recaptcha-response") String
gRecaptchaResponse,
BindingResult bindingResult,
Model model) throws IOException {
LOG.info("User registration request");
boolean verify = VerifyRecaptcha.verify(gRecaptchaResponse);
if (!verify) {
LOG.error("Captcha verification failed.");
model.addAttribute("message", "You missed the Captcha");
}
userValidator.validate(userForm, bindingResult);
if (bindingResult.hasErrors() || !verify) {
LOG.error("registration failed");
return "registration";
}
userService.save(userForm);
LOG.info("User registered successfully.");
securityService.autoLogin(userForm.getMailId(), userForm
.getPasswordConfirm());
return "redirect:/home";
}
@RequestMapping(value = {"/", "/home"})
public String welcome(Model model) {
return "home";
}
@GetMapping("/403")
public String error403() {
LOG.warn("Request for restricted page.");
return "access-denied";
}
[...] |