es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo solucionar el problema de inyección de comandos en Checkmarx para parse_args.

Tengo un código en Python que analiza los parámetros de entrada:

parser=OptionParser()
parser.add_option("-o", dest="out", default=os.getenv('Path', None), help="ruta del archivo")
parser.add_option("-c", dest="content", default=os.path.abspath(sys.path[0]), help="ruta del contenido")
parser.add_option("-t", dest="tool", default=os.getenv('Tool', None), help="ruta de la herramienta")
parser.add_option("-m", dest="man", default=os.getenv('Path', os.getcwd())+os.sep+"man.ini", help="ubicación de man.ini")
(opt, args)=parser.parse_args()

Checkmarx dice lo siguiente:
El método principal de la aplicación llama a un comando del sistema operativo (shell) con cmd, utilizando una cadena no confiable con el comando a ejecutar. Esto podría permitir a un atacante inyectar un comando arbitrario y habilitar un ataque de Inyección de Comandos. El atacante podría ser capaz de inyectar el comando ejecutado a través de la entrada del usuario, parse_args…

Creo que necesito eliminar los caracteres innecesarios como |, & y ; pero no estoy seguro de cómo/dónde hacerlo. ¿Puedo hacerlo antes de esta línea “(opt, args)=parser.parse_args()”? Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes sanitizar la entrada antes de analizar los argumentos utilizando una función que verifica y elimina cualquier carácter no deseado de la entrada. Esta función puede ser llamada antes del método parse_args().

    Aquí tienes un ejemplo de una función de sanitización:

    import re
    
    def sanitize_input(input_string):
        """
        Elimina cualquier carácter no deseado de la cadena de entrada.
    
        :param input_string: La cadena a sanitizar.
        :return: La cadena sanitizada.
        """
        # Define un patrón para coincidir con los caracteres no deseado
        pattern = re.compile(r'[;&|]')  # Coincide con ;, &, o |
    
        # Reemplaza cualquier coincidencia con una cadena vacía '' (es decir, los elimina)
        sanitized_string = pattern.sub('', input_string)
    
        return sanitized_string
    

    Luego puedes llamar a esta función en cada parámetro de entrada antes de analizar los argumentos:

    (opt, args) = parser.parse_args()
    
    # Sanitiza cada parámetro de entrada
    opt.out = sanitize_input(opt.out)
    opt.content = sanitize_input(opt.content)
    opt.tool = sanitize_input(opt.tool)
    opt.man = sanitize_input(opt.man)
    

    Esto asegurará que se eliminen cualquier carácter no deseado antes de ejecutar el comando, previniendo ataques de inyección de comandos.

Comments are closed.