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";     } [...]

Referencias:

Logging - OWASP Cheat Sheet Series