¿Cómo se verifica el bytecode en la JVM?¿Cómo se verifica el bytecode en la JVM?
Respuesta
Oracle mismos tienen un pequeño fragmento de la página sobre cómo funciona here.
Básicamente, el JRE no confía en el JDK. Eso es porque no tiene conocimiento de qué compilador JDK creó el archivo de clase. Trata el archivo de clase como hostil hasta que se verifique.
Ampliando eso, la verificación de bytecode es un paso necesario para proteger de lo que Sun llama un "compilador hostil". El propio compilador Java de Sun garantiza que el código fuente de Java no infringe las reglas de seguridad, pero cuando una aplicación importa un fragmento de código, en realidad no conoce si el fragmento de código sigue las reglas del lenguaje Java por seguridad. En otras palabras, el código puede no haber sido producido por un compilador de Java confiable.
En ese caso, el sistema de tiempo de ejecución de Java en su máquina tiene que asumir que el fragmento es malo y lo somete a la verificación de código byte.
La máquina virtual Java ni siquiera ve el código de bytes hasta que haya pasado por este proceso de verificación. Hacer esto a medida que se carga el bytecode también tiene la ventaja de que no es necesario realizar una gran cantidad de comprobaciones de tiempo de ejecución cada vez que se ejecuta el código.Debido a que se ha verificado que es correcto, puede, una vez que se ejecuta, correr más rápido de lo que sería posible.
Una interpretación del diagrama es ligado a continuación:
<<<=== Unsafe/Safe ===>>>
\
+---------------+ +-------------------+
| Java source | +--> | Class loader | --+
+---------------+ | | Bytecode verifier | |
| | +-------------------+ |
V | / |
+---------------+ | \ V
| Java compiler | Network / +-------------------+
+---------------+ | \ | JVM/JIT |
| | / +-------------------+
V | \ |
+---------------+ | / V
| Java bytecode | --+ \ +-------------------+
+---------------+ / | Operating system |
\ +-------------------+
/ |
\ V
/ +-------------------+
\ | Hardware |
/ +-------------------+
\
<<<=== Unsafe/Safe ===>>>
La mejor fuente de información es probablemente la sección relevante en la especificación de JVM, 4.10 Verification of class Files.
vea el enlace para más detalles, pero en términos generales:
verificación de enlaces de tiempo mejora el rendimiento del intérprete. Se pueden eliminar las costosas comprobaciones que de otro modo tendrían que realizarse para verificar las restricciones en el tiempo de ejecución para cada instrucción interpretada. La Máquina Virtual Java puede suponer que estas comprobaciones ya se han realizado. Por ejemplo, Java Virtual Machine ya sabrá lo siguiente:
- No hay desbordamientos ni subflujos en la pila de operandos.
- Todos los usos y tiendas de variables locales son válidos.
- Los argumentos para todas las instrucciones de Java Virtual Machine son de tipos válidos.
El verificador también realiza la verificación que se puede hacer sin tener en cuenta la matriz de códigos del atributo Código (§4.7.3). Las comprobaciones realizadas incluyen lo siguiente:
- Garantizando que las clases finales no se subclasifiquen y que los métodos finales no se anulen (§5.4.5).
- Comprobando que cada clase (excepto
Object
) tiene una superclase directa.- Asegurándose de que el conjunto constante satisface las restricciones estáticas documentadas; por ejemplo, que cada estructura
CONSTANT_Class_info
en el conjunto constante contiene en su artículoname_index
un índice de grupo constante válido para una estructuraCONSTANT_Utf8_info
.- Comprobando que todas las referencias de campos y métodos en el conjunto constante tengan nombres válidos, clases válidas y un descriptor de tipo válido.
Hay unos pocos casos oscuro rincón donde la especificación es vaga o directamente violados por el Hotspot VM. Si está seguro de que su bytecode debe verificar y no puede descubrir por qué no lo hace, también puede echarle un vistazo al repositorio de código fuente de OpenJDK. – Antimony
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/10765467) –
@ AndréFratelli: Y, de hecho, no es una respuesta que añadiría ahora (tenga en cuenta que tienen casi 7 años ...). No es una pregunta que * respondería * ahora, sino que la cerré como demasiado amplia. He agregado * algunos * detalles aquí, pero si el enlace se vuelve a romper (se arregló dos veces hoy, de diferentes maneras) aún no sería terriblemente útil. Al mismo tiempo, aunque la pregunta en sí misma no ha sido resuelta, creo que es una respuesta útil para ... –
- 1. ¿Cómo se ejecuta scala bytecode en el jvm?
- 2. ¿Cómo compilo el código ensamblador JVM en bytecode?
- 3. Aprendiendo sobre el bytecode de Java y la JVM
- 4. ¿Cómo puedo examinar el bytecode JVM para una función clojure?
- 5. ¿Para qué se utiliza el NOP en el bytecode de JVM?
- 6. ¿Es posible transformar el bytecode LLVM en bytecode de Java?
- 7. ¿Es el Hotspot JVM Bytecode Interpreter un JIT de rastreo?
- 8. Ejecutando bytecode Java en Android - Sun JVM encima de DalvikVM
- 9. cómo se representa la anotación java en java bytecode
- 10. ¿Cómo generan los lenguajes/tiempos de ejecución basados en JVM un bytecode de Java?
- 11. ¿Cómo se genera bytecode y se guarda en el archivo .class?
- 12. ¿Cómo se verifica el tipo de una variable local?
- 13. ¿Cómo se implementa la coincidencia de patrones en Scala en el nivel de bytecode?
- 14. ¿Cómo se diferencian las "JVM modernas" de las JVM antiguas?
- 15. Especificación de bytecode de Java
- 16. Tipos en Bytecode
- 17. ¿El atributo obsoleto solo se verifica en tiempo de compilación?
- 18. ¿Cómo se implementa la función de JVM persistentes en cake?
- 19. ¿Cómo se verifica una firma RSA SHA1 en Python?
- 20. ¿Qué tareas de bajo nivel se pueden realizar en la JVM, pero no expresadas en Java?
- 21. ¿Interpretar algo y ejecutar el bytecode generado en Java?
- 22. ¿Cómo verifica Azure el estado de WorkerRole?
- 23. Compilador Lua a JVM?
- 24. ¿JAXB utiliza instrumentación de bytecode?
- 25. QRadioButton verifica/desmarque el problema en Qt
- 26. ¿Cómo se verifica el éxito de abrir (archivo) en Perl? El
- 27. ¿Cómo verifica qué hilo está ejecutando el código en Java?
- 28. ¿Cómo verifica si la página actual usa SSL en ASP.Net?
- 29. Verifica programáticamente si se está ejecutando syncdb
- 30. ¿Cómo se verifica si un repositorio mercurial está limpio?
+1 para paranoia :) – dfa
El problema no es solo compiladores maliciosos. Si alguien realmente intenta escribir un exploit, es probable que escriba el bytecode a mano, o al menos la parte importante. – Antimony
Pero el verificador no está habilitado (o no se ejecutó) para las clases cargadas desde el CLASSPATH local ¿verdad? –