Hibernate SQL Injection - Fortify 360

5

Estoy usando Fortify 360 para analizar la seguridad de mi código. Fortify ha identificado un método de eliminación basado en Hibernate para realizar una eliminación basada en un objeto que se ha pasado. Mi entendimiento de hibernar es que hibernar eliminará una fila en la tabla a la que está asociado el objeto basado en la identificación de los objetos (la identificación es un número). Fortify ha marcado esto como Inyección de SQL: Hibernación (Validación y representación de entrada, flujo de datos). A Fortify no parece gustarle que Hibernate esté ejecutando una instrucción SQL dinámica utilizando una entrada no validada. ¿Se requeriría una cierta solución o solo se advertiría como un riesgo mitigado?

public List findByItemProp(String propName, Object value){
   try{
     String qs = "from ItemTypes as model where model."+ propName +"= ?"; /* <-- flagged by Fortify */
     Query qo = getSession().createQuery(qs);
     qo.setParameter(0, value);
     return qo.list();
   } catch (){}
 }
    
pregunta Seneca James 19.04.2012 - 17:08
fuente

3 respuestas

7

Me temo que este informe probablemente carezca de detalles para proporcionar un diagnóstico. No puedo diagnosticar este problema por ti sin ver el código.

Definitivamente, no debe ignorar una advertencia de análisis estático como "riesgo mitigado" cuando no ha hecho nada para mitigarla y no comprende si la advertencia representa una vulnerabilidad explotable o no.

Le sugiero que comience por informándose sobre la inyección de SQL , sobre la seguridad de Hibernate y sobre esta advertencia en particular. Lo más probable es que Fortify tenga ayuda en línea que proporcione una explicación detallada sobre esta advertencia; Deberías empezar por leer eso. Lea el siguiente análisis de fondo de Fortify en inyección de SQL en Hibernate . También recomiendo los siguientes artículos: Cómo se detiene normalmente la inyección de SQL en una configuración de Spring / Hibernate , inyección de ORM , y Cómo evitar la inyección de SQL en Hibernate (A Hibernate Urban Legend) .

Actualización (4/20): veo que ha actualizado la pregunta para incluir el código. Gracias. El código que proporcionó es ciertamente dudoso, y creo que es razonable que Fortify se queje de ese código. Mirando este código, no es posible verificar que la consulta pasada a createQuery() es una constante de compilación, por lo que Fortify emite un mensaje de advertencia.

Básicamente, el código que muestra parece estar construyendo una consulta SQL utilizando concatenación de cadenas. Eso es peligroso. Si el atacante puede influir en propName , entonces tiene una posible vulnerabilidad de inyección SQL. Es mejor evitar la construcción de la consulta SQL de esta manera.

En particular, hay un mito por ahí que el uso de declaraciones preparadas (o consultas parametrizadas) es inherentemente inmune a la inyección de SQL. Esto es cierto, pero solo si la consulta en sí es una constante de compilación que no puede ser influenciada por el atacante. Si inserta datos que no son de confianza en la consulta, el uso de los mismos en una declaración preparada no lo hace mágicamente seguro.

Por lo tanto, la mejor práctica es que, cuando use una declaración preparada, asegúrese de que se pueda verificar fácilmente que la consulta sea una constante de compilación (y no puede ser influenciada por el atacante).

Para resumir las reglas generales: (1) No utilice la concatenación de cadenas para crear una consulta SQL. (2) Cuando desee cierta dependencia de los valores de tiempo de ejecución, use las declaraciones preparadas para vincular los valores de tiempo de ejecución. (3) Asegúrese de que la consulta que utiliza para crear la declaración preparada pueda verificarse fácilmente como una constante de tiempo de compilación. Seguir estas prácticas debería ayudar a prevenir ataques de inyección de SQL.

    
respondido por el D.W. 19.04.2012 - 21:16
fuente
2

Recibí la respuesta del artículo " Cómo evitar Inyección SQL en Hibernate "que DW citado .

Fortify identificó la cadena de consulta qs como vulnerable a la inyección de SQL. No entendí cómo podría producirse la inyección de SQL ya que estoy usando setParameter() como recomendó el artículo de Hibernate. Finalmente, me di cuenta de que parecía que Fortify pensaba que propName eran datos proporcionados por el usuario. Cuando hice el siguiente cambio

  String qs = "from ItemTypes as model where model.stapler = ?";

Fortify dejó de identificar este código como una vulnerabilidad de inyección de SQL.

    
respondido por el Seneca James 20.04.2012 - 19:46
fuente
1
"from ItemTypes as model where model."+ propName

findByItemProp ("stapler = ''; drop table ItemTypes; -", "");

Vaya, ahí va tu base de datos, sí, está detectando la concatenación de cadenas, no hagas eso. Es probable que no sea lo suficientemente inteligente como para darse cuenta de que es un parámetro en una llamada de método, pero aún así es un tipo descuidado como programador que no esperaría saber que tiene que desinfectarlo sin la documentación adecuada, y es mejor asegurarse de que esté limpio el método en sí mismo es como te ahorrarás infinitos dolores de cabeza cuando otro desarrollador lo haga mal.

    
respondido por el StrangeWill 20.04.2012 - 23:21
fuente

Lea otras preguntas en las etiquetas