2010-12-02 4 views
21

Esta pregunta es similar a Exploitable PHP Functions.Funciones Java aprovechables

Los datos corruptos provienen del usuario, o más específicamente de un atacante. Cuando una variable contaminada alcanza una función de sumidero, entonces usted tiene una vulnerabilidad. Por ejemplo, una función que ejecuta una consulta SQL es un receptor, y las variables GET/POST son fuentes de contaminación.

¿Cuáles son todas las funciones de receptor en la biblioteca de clases Java (para cualquier sabor de Java)? Estoy buscando funciones que introduzcan una vulnerabilidad o software weakness. Estoy particularmente interesado en las vulnerabilidades de ejecución remota de código. ¿Hay clases/bibliotecas enteras que contengan funcionalidades desagradables que un hacker quiera influenciar? ¿Cómo la gente accidentalmente crea código Java peligroso?

+3

* todas * funciones de fregadero?Esta lista es infinita, ya que uno puede definir arbitrariamente muchas de esas funciones. – meriton

+0

@meriton ¿viste la lista que construí para PHP? – rook

+2

Creo que se está refiriendo al código de la biblioteca java no a las bibliotecas del sótano – Woot4Moo

Respuesta

8

Código vulnerabilidades de ejecución:

  1. reflexión privada, pero es raro que los datos corrompidos para llegar allí de una manera peligrosa
  2. código de interoperabilidad nativa que no valida sus parámetros suficientes
  3. Deserializadores. Probablemente el más peligroso ya que es posible que desee deserializar datos no confiables. Algunos serializadores son relativamente seguros y solo usan constructores públicos/setter, pero otros tienen acceso a campos privados. Y si no hay una lista blanca de tipo, podría instanciar tipos arbitrarios y establecedores de llamadas sobre ellos.
  4. Cualquier forma de IO, archivos en particular
  5. Carga dinámica de las bibliotecas. En particular, utilizando la ruta relativa. En particular, en relación con el directorio de trabajo en lugar del directorio ejecutable

(Esto se trata de .NET, pero espero que Java sea muy similar)

inyección de datos

Luego está la familia de funciones de inyección que, por lo general, se puede evitar al no operar en cadenas pero utilizando funciones de biblioteca especializadas. Esos típicamente no conducen a la inyección de código arbitrario.

  1. html injectiong/XSS (impedido en gran medida por una visión a motor que automáticamente escapa de salida y cuerdas no escapado limpiamente separar escapado y (tal vez usando diferentes tipos))
  2. inyección SQL (impedido por declaraciones preparadas)
  3. inyección file-path
+0

+1 para deserialzation y archivo de E/S –

7

estoy seguro de que esta lista crecerá a medida que cavar en la búsqueda de hazañas reales:

  1. Spring classloader

  2. excepciones ingestión - Como se ha señalado excepciones deglución no puede causar directamente una explotación, pero puede conducir a la no descubrimiento de explotación.

  3. String[] commands = {args[0]};
    Runtime.getRuntime().exec(commands);

    me doy cuenta de que es un tema bastante trivial, pero la ejecución de código similar a la anterior puede permitir que usted pueda pasar algo como esto: && del / si en Windows o ;rm -rf / en * nix

El mayor La forma en que las personas crean un código Java peligroso es siendo perezoso. Como mencionaste, no limpias la entrada del usuario antes de ejecutarlo.

+0

+1 También busco encontrar exploits de verdad :) – rook

+2

@Rook Tengo uno sobre Apache Tomcat, pero no lo publicaré aquí hasta que el vendedor lo resuelva. – Woot4Moo

27

Aquí hay una lista basada en mi investigación personal en la seguridad de Java del lado del cliente en general, y utilizando el IDE de Eclipse para ver qué métodos verifica SecurityManager.

cargadores de clases definen clases (= ejecución de código arbitrario java):

java.lang.ClassLoader.defineClass 
java.net.URLClassLoader 

= código de ejecución

Java Beans introspección pueden desviar cargadores de clases en clases de carga de una fuente no confiable (example vuln - cve-2010-1622)

java.beans.Instrospector.getBeanInfo 

= la ejecución de código

acceso a archivos

java.io.File (constructor) 
java.io.File.delete 
java.io.File.renameTo 
java.io.File.listFiles 
java.io.File.list 

= borrar/renombrar archivos, directorios lista de clases

secuencia de archivo/lector

java.io.FileInputStream 
java.io.FileOutputStream 
java.io.FileReader 
java.io.FileWriter 
java.io.RandomAccessFile 

= Archivo acceso de lectura/escritura

Propiedades

Java System

System.setProperty 
System.getProperties 
System.getProperty 

= Algunas propiedades del sistema podrían contener alguna información que es casi sensible, y algunas propiedades del sistema podrían alterar la ejecución de material crítico, no tengo ejemplos, aunque

Carga de bibliotecas nativas

System.load 
System.loadLibrary 

= ejecución de código arbitrario

Ejecutora ejecutables del sistema operativo

Runtime.exec 
ProcessBuilder (constructor) 

Generación de eventos de entrada del sistema nativo

java.awt.Robot.keyPress/keyRelease 
java.awt.Robot.mouseMove/mousePress/mouseRelease 

(Tal vez descabellada ya que un servidor no podría incluso tener un entorno gráfico)

Reflejo de Java: acceso arbitrario (incluso) campos y métodos

java.lang.Class.getDeclaredMethod 
java.lang.Class.getDeclaredField 
java.lang.reflection.Method.invoke 
java.lang.reflection.Field.set 
java.lang.reflection.Field.get 

privadas = A partir de la divulgación de información sensible a la ejecución de código final, dependiendo de las circunstancias

motor de scripts de Java

javax.script.ScriptEngine.eval 

= ejecución de código arbitrario

+0

+ 1x4 impresionante post – rook

+0

@Rook: ¡Gracias! Creo que la pregunta es excelente. Nunca he visto la seguridad de Java desde este ángulo exacto. –

+0

+1 - gran trabajo y un conjunto realmente exhaustivo de los métodos explotables :) – vstoyanov

Cuestiones relacionadas