Evite la inyección de comandos con la API system()

Evite la inyección de comandos con la API system()

Tenemos un código C heredado que se utiliza para permitir que los usuarios con menos privilegios ejecuten scripts personalizados con privilegios aumentados. Esto tiene el bit SUID establecido. Este código restringe el entorno PATH a una carpeta específica y luego usa system()la API para ejecutar el script con Shell restringido:

/bin/bash -r -c "script <arg>"

Como la ruta está restringida, sólo puede ejecutar scripts de esa carpeta específica.

Ahora que conocemos todos los peligros de la inyección de comandos con system()API, ¿qué medidas se pueden tomar para evitar la inyección de comandos? Esto se usa en muchos lugares en varios scripts, etc., por lo que no desea realizar una implementación completamente nueva para evitar cualquier regresión.

Respuesta1

Debido a que es difícil hacerlo bien, sugeriría eliminar el SUID de su código. Cambie su código C para usar sudo. Al utilizar sudo, se resuelven los aspectos más difíciles de conseguir una programación segura del sistema.

Luego, puede construir cuidadosamente una configuración de sudo, utilizando visudo, que haga lo mínimo necesario para realizar la tarea y limitarla a los usuarios/grupos requeridos. Después de configurar Sudo, pídale a alguien que no sea usted que lo pruebe e intente romper las restricciones previstas.

Respuesta2

La inyección de código requiere la capacidad del usuario de pasar cadenas arbitrarias como parámetros a la system()llamada. Esto es bastante similar a las inyecciones de SQL y debe evitarse de manera similar: no pase ninguna cadena definida por el usuario directamente a la llamada:

  • Los parámetros numéricos deben convertirse a números enteros y luego volver a convertirse en cadenas en el momento de la llamada.

  • Los parámetros que pertenecen a un diccionario fijo deben convertirse a valores "enum" o similares, y luego volver a cadenas en el momento de la llamada.

  • La entrada de texto libre debe limitarse a un conjunto de caracteres inofensivos siempre que sea posible (p. ej [a-zA-Z0-9]*.). Cuando se requieran caracteres problemáticos (incluido el espacio), se debe aplicar un escape adecuado (es decir, a bse debe reemplazar por a\ b, etc.)

información relacionada