Si Java es inherentemente vulnerable a los ataques de inyección System.getProperty, ¿vale la pena validarlo?

3

En Java es común ver códigos como System.getProperty('line.separator') que se usa para crear cadenas utilizadas para la salida, etc. Los analizadores de vulnerabilidades han recomendado que es recomendable validar esta entrada, por ejemplo. asegurándose de que coincida con \n o \r\n etc.

Pero me pregunto, ya que Java es vulnerable a estos dentro de su propio PrintWriter.printLn y posiblemente BufferedWriter.newLine() etc., ¿es ahora una buena práctica validar System.getProperty('line.separator') dentro de cada programa que emite estados de cuenta de nueva línea? Parece una exageración.

¿Existe alguna mejor práctica alternativa que elimine la necesidad de validar todas las propiedades del sistema? P.ej. ¿Es suficiente como práctica recomendada revisar los privilegios y comandos a nivel de administrador de sistemas en lugar de a nivel de desarrollador? Si no es así, ¿por qué los escáneres de vulnerabilidad están tomando estas precauciones ahora?

Mi impresión es que este tipo de validación a nivel de código es una exageración en un entorno de producción corporativo estándar donde existen múltiples niveles de separación de funciones y cierres de privilegios entre dev / test / prod, etc. Sin embargo, esta es solo mi opinión. y me gustaría escuchar a los demás.

    
pregunta blindcodifier9734 17.10.2017 - 22:38
fuente

1 respuesta

3

Asegurarse de que coincida con un patrón predefinido niega el punto de tenerlo.

De la documentación de oracle -

  

Consideración de seguridad: el administrador de seguridad puede restringir el acceso a las propiedades del sistema.

Y también

  

El método setProperties cambia el conjunto de propiedades del sistema para la aplicación actual en ejecución. Estos cambios no son persistentes. Es decir, cambiar las propiedades del sistema dentro de una aplicación no afectará las invocaciones futuras del intérprete de Java para esta o cualquier otra aplicación. El sistema de ejecución reinicializa las propiedades del sistema cada vez que se inicia. El método setProperties cambia el conjunto de propiedades del sistema para la aplicación actual en ejecución. Estos cambios no son persistentes. Es decir, cambiar las propiedades del sistema dentro de una aplicación no afectará las invocaciones futuras del intérprete de Java para esta o cualquier otra aplicación. El sistema de ejecución reinicializa las propiedades del sistema cada vez que se inicia.

Entonces, para ser un riesgo, debe esperar que una parte maliciosa inyecte de alguna manera una llamada setProperties en su aplicación en ejecución. A menos que pase la entrada del usuario a una llamada "setProperties" (que es una idea terrible en general), esto no debería ser un problema. Si pueden inyectar código, entonces tienes problemas mucho más grandes. Si todavía estás preocupado, utiliza el Administrador de seguridad.

    
respondido por el Hector 18.10.2017 - 10:19
fuente

Lea otras preguntas en las etiquetas