Saltar a contenido

Insecure hostname validation check

Comprobación insegura en la validación del nombre de host

Descripción

La aplicación realiza una validación insegura del nombre de host utilizando métodos fáciles de eludir como startsWith o endsWith. Un atacante puede evitar fácilmente esta comprobación registrando un dominio que coincida con el patrón de verificación.

Las comprobaciones compuestas tanto con startsWith como con endsWith son igualmente inseguras, ya que el ataque aún puede crear un dominio con una entrada intermedia aleatoria que coincida con el patrón verificado.

Recomendación

Para garantizar una validación segura del nombre de host, considere las siguientes implementaciones.

  1. Implementar validación mediante expresiones regulares (Regex): En lugar de utilizar métodos simples como startsWith o endsWith, opte por expresiones regulares para realizar una validación exhaustiva del nombre de host. Los patrones Regex permiten establecer criterios de coincidencia precisos.

  2. Considerar bibliotecas de validación estandarizadas: Utilice bibliotecas o frameworks establecidos que ofrezcan funcionalidades robustas de validación de nombres de host. Estas bibliotecas suelen estar bien mantenidas y se actualizan periódicamente para solucionar posibles fallos de seguridad.

  3. Implementar listas blancas (Whitelisting): Si tiene un número limitado de hosts permitidos, considere implementar un enfoque de lista blanca donde la aplicación solo acepte nombres de host conocidos y de confianza.

import java.util.regex.*;

public class SubdomainValidator {
    public static void main(String[] args) {
        String userInput = "sub.example.com"; // replace this with user input

        // Regular expression pattern to match subdomains of example.com
        String pattern = "^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\\.)+example\\.com$";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Create Matcher object
        Matcher m = r.matcher(userInput);

        // Check if input matches the pattern
        if (m.find()) {
            System.out.println("Valid subdomain of example.com");
        } else {
            System.out.println("Invalid subdomain of example.com");
        }
    }
}
import Foundation

func isValidSubdomain(_ userInput: String) -> Bool {
    let pattern = #"^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+example\.com$"# // Regular expression pattern
    let regex = try! NSRegularExpression(pattern: pattern)
    let range = NSRange(location: 0, length: userInput.utf16.count)
    return regex.firstMatch(in: userInput, options: [], range: range) != nil
}

let userInput = "sub.example.com" // replace this with user input
if isValidSubdomain(userInput) {
    print("Valid subdomain of example.com")
} else {
    print("Invalid subdomain of example.com")
}
import 'package:flutter/material.dart';

bool isValidSubdomain(String userInput) {
  RegExp regex = RegExp(r'^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+example\.com$');
  return regex.hasMatch(userInput);
}

void main() {
  String userInput = "sub.example.com"; // replace this with user input
  if (isValidSubdomain(userInput)) {
    print("Valid subdomain of example.com");
  } else {
    print("Invalid subdomain of example.com");
  }
}

Enlaces

Estándares

  • OWASP_MASVS_L1:
    • MSTG_PLATFORM_2
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • CWE_TOP_25:
    • CWE_20
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • OWASP_MASVS_v2_1:
    • MASVS_CODE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY252
    • SECURITY212
    • SECURITY213