¿Cuáles son las razones para sellar un .jar y cómo lo verificaría?

7

He creado un frasco sellado, pero no veo la diferencia en comparación con el uso de uno no sellado.

  • ¿Qué pruebas puedo realizar para verificar que el frasco esté sellado?
  • ¿Por qué razón podríamos tener que preferir usar un sellado en lugar de uno?
  • ¿Un sellado creará algún problema para los usuarios de mis proyectos?
pregunta Aquarius Power 14.02.2015 - 04:36

2 respuestas

9

Puedes probar que un jar está sellado definiendo una clase para que exista en un paquete usado en el archivo jar. Si el frasco está sellado, todos los paquetes normalmente están sellados, de lo contrario, puede sellarlos por paquete. La clase que cree debe intentar acceder a los miembros protegidos o predeterminados de una clase en ese paquete.

Por ejemplo, si el jar tiene una clase com.example.Widget donde el paquete com.example está sellado y Widget tiene miembros protegidos / predeterminados, cree una clase com.example.Test que intente acceder a esos miembros. Esto debería fallar.

La razón para el sellado se desprende de una descripción de cómo probarlo: desea que su código sea autónomo y que los usuarios del tarro solo usen miembros públicos. No se requiere que los paquetes sean únicos en todos los archivos jar (y carpetas bin en su IDE) utilizados por un programa. Puede definir una clase en el mismo paquete que en un contenedor y acceder a miembros protegidos / predeterminados que pueden causar problemas. A menudo, la visibilidad predeterminada se usa como un análogo a la palabra clave friend de C ++ al permitir que otras clases en el mismo paquete puedan realizar acciones que solo son seguras porque los mismos programadores trabajan en ambas clases y entienden sus aspectos internos. Tal vez un método de visibilidad predeterminado se abstenga de verificar algunos límites en nombre del rendimiento, con el entendimiento de que el código del cliente nunca accederá a él. Por ejemplo, la clase String en Java tiene algunos de estos tipos de métodos, ya que el manejo de cadenas tiene que ser muy rápido porque una gran cantidad de código se basa en ello. BigDecimal se construye sobre BigInteger y usa el acceso predeterminado para optimizar algunas operaciones que otros usuarios de la clase no deberían usar.

TL; DR : las clases en el mismo paquete pueden acceder a miembros no públicos de cada Otros por rendimiento o simplicidad. Es posible que este acceso no compruebe invariantes y condiciones previas. Uno puede poner las clases en el mismo paquete en varias ubicaciones en el classpath. Sellar un paquete o jarra restringe el acceso del código de cliente a estos métodos, ya que de lo contrario se romperían las cosas.

Esto no causará ningún problema para los usuarios del jar. El mecanismo de carga de clases que accede a los recursos (por ejemplo, los archivos de clase) en tarros es totalmente compatible con tarros y paquetes sellados.

Lecturas relacionadas: Sellando paquetes dentro de un archivo JAR

    
respondido por el user22815 16.02.2015 - 05:43
2

Para responder a su segunda pregunta, sellamos nuestros frascos como medida de seguridad, ya que esto evita una forma de inyección de código donde se agregan clases adicionales a nuestra base de código en tiempo de ejecución.

Tenemos una cierta cantidad de reflexión en nuestro código donde los objetos se crean en función de la entrada del usuario. El código que crea estos objetos solo permitirá instanciar clases de nombres de paquetes fijos.

Al sellar los frascos que contienen las clases que queremos que los usuarios puedan crear, no hay forma de que el usuario pueda crear nuevas clases potencialmente peligrosas y nuestro software las instale en tiempo de ejecución. A menos que la clase esté en el paquete correcto, nuestro código no lo cargará, y sellar los Tarros significa que solo las clases a las que deseamos que accedan los usuarios son accesibles.

Si nuestros frascos no estaban sellados, el usuario podría agregar nuevas clases que podrían ser instanciadas. Esto sería un riesgo de seguridad.

TL; DR: Al sellar sus tarros, puede prevenir un tipo de inyección de código malicioso.

    
respondido por el Mark Douglas 22.02.2017 - 11:33

Lea otras preguntas en las etiquetas