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:
https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html