Nueva herramienta: JavaRuleSetter para crear Deployment Rule Sets

lunes, 16 de febrero de 2015

Oracle introdujo la noción de lista blanca en Java 7u40. Se llamó Deployment Rule Set. En Java7u51, se introdujo otra nueva funcionalidad, que estaba también cerca de las listas blancas, pero era muy diferente. Se llamó Lista de sitios de Excepción. En esta entrada, vamos a diferenciar entre ambas y presentaremos una nueva herramienta que hemos desarrollado que podría ser visto como una especie de cortafuegos para Java. Se llama JavaRuleSetter.

Deployment Rule Set

Al principio solo existían las Deployment Rule Set para intentar crear listas blancas o negras de la ejecución de applets de Java. Estaba destinado a administradores que deseasen bloquear RIAs (applets de Java y Java Web Start Applications, conocidos en conjunto como Rich Internet Applications) por dominios, certificados o nombre. Esto suponía un avance pero era terriblemente complejo de implementar. Los pasos que había que seguir eran:
  • Crear un ruleset en xml. Es necesario conocer la sintaxis. Por ejemplo:
    <rule>
      <id location="http://*.java.com" />
      <action permission="run" version="SECURE-1.7" />
    </rule>
    <rule>
    <id />
      <action permission="block">
      <message>Bloqueado por las reglas del sistema</message>
    </action>
    </rule>
    </ruleset>

  • Compilarlo con Java (se necesita disponer del JDK).
  • Firmarlo con un certificado de confianza propio. Si no se tiene, hay que crearlo.
  • Copiarlo a un punto concreto del sistema.
El resultado es que, a la hora de visitar una web con un applet, se aplica este árbol de decisión para ejecutarlo o no. La regla podría bloquearlo por completo, o permitirlo solo si estaba bien firmado digitalmente. El applet se ejecuta sin hacer preguntas. Si la regla está definida a "default", se toma el camino que determinará la lista de excepción de sitios.

Cuando el navegador detecta un RIA (applet o JWSA) primero pasa por este árbol de decisión para los Deployment Rule Sets
Esto resultaba bastante complejo para un administrador, y casi imposible para un usuario estándar, así que Java reacción creando la lista de excepción o Exception Site List. Pero aun así, las Rule Sets siguen pudiendo ser perfectamente usadas por usuarios y no solo por administradores. Esa es la razón por la que se ha creado esta herramienta, simplificamos la creación de reglas para usuarios avanzados, y abstraemos al usuario de todo el proceso de crear certificados, firmarlos, etc.

Exception Site List

Este sistema se introdujo en enero de 2014 (solo unos meses después de las Deployment rules), orientado a los usuarios. No requiere tener privilegios de administrador y todo se hace desde la interfaz de Java. Es en realidad una segunda forma de crear listas blancas,  pero no tan poderosa como las Rule Sets. Se puede concebir como una segunda línea de defensa para el usuario medio. 

En resumen, las Exception Lists afecta solo a las "preguntas" que hace Java antes de ejecutarse. Nunca las hará desaparecer, pero tampoco los bloqueará, incluso si la seguridad está establecida a "alta". Las listas de excepción no tienen efecto si la seguridad está establecida a "media" (cosa que ya no existe en la rama 8, en la que solo han dejado "Alta" y "Muy alta". Este diagrama lo muestra de forma más clara:

Flujo de decisión de las listas de excepción
Para crear una lista de excepción, simplemente se debe ejecutar javaclp.exe y añadir un dominio.

Configurar listas de excepción en Java 7. Difiere un poco el diseño en Java 8

El fichero que controla la lista de excepción se almacena en la zona de usuario situada en C:\Users\username\AppData\LocalLow\Sun\Java\Deployment\security\exception.sites en Windows.

Rule Sets vs. Exception Site Lists

Las principales diferencias se reflejan aquí:
Comparación entre las listas de excepción y las Deployment Rule Set

Rule Sets permite crear una regla y distribuirla por diferentes sistemas. Se impone siempre a las listas de excepción si existiera algún conflicto y pueden ser modificadas solo por el administrador, no por el usuario. Algo importante es que las Rule Set funcionan en un entorno de decisión muy temprano, antes de decidir si se ejecuta o no. De esta forma, si algún día los niveles de seguridad son vulnerados, las listas de excepción podrían ser eludidas, pero no las Rule Sets.

El cuadro completo

Java es complicado en estos momentos. Este es el árbol de decisión cuando se ejecuta un applet (o RIA en general). Esta es la mejor forma de entender cómo se ha mejorado la seguridad en dos años. El flujo completo de decisión depende de la versión de JRE, Deployment Rules, listas de excepción etc. Deployment rules funcionan en el segundo nivel comenzando desde arriba, y las Exception lists están en el quinto nivel.


Java, todo el árbol de decisión sobre RIAs

La herramienta

Esta herramienta está destinada a usuarios o administradores a los que le preocupe la seguridad de Java (que deberían ser todos) y tienen que trabajar con applets (no pueden simplemente deshabilitarlo en el navegador).

Si no se tiene ni idea de lo que se está haciendo, lo más sencillo es crear una regla para un dominio que se quiera meter en la lista blanca y pulsar en "Apply changes". El programa creará todos los valores por defecto y los aplicará. Los usuarios más avanzados podrían utilizar su keystore habitual para firmar el fichero con las Deployment Rules y eludir ciertas partes del proceso que prefieran controlar personalmente. En "Avanced Mode"" se encuentra toda la información al respecto.

Bloquearlo todo impedirá que se ejecute cualquier applet de forma bastante temprana
Java bloqueando la ejecución de un applet en el navegador

Añadiendo un dominio para que sea permitida su ejecución

Para mayor granularidad, se puede usar el modo avanzado

Una forma muy básica de usarla es añadir una regla del dominio que se quiera tener en la lista blanca (se soportan wildcards). Pulsar sobre "Block everything else" y aplicar cambios. Se necesitará elevar privilegios dos veces: una para añadir un certificado (solo la primera vez) y otra para copiar el fichero con las reglas firmadas a system32 en el caso de Windows.

La herramienta funciona en GNU/Linux y Mac OS X, aunque en estas plataformas no ha sido totalmente comprobada.

Hemos creado dos versiones para Java 8 y 7. Esta herramienta está en versión alpha, por lo que podría contener algún fallo. Por favor, reportadlos e intentaremos solucionarlo.

Para conocer cómo funciona por dentro el sistema de reglas de Java y aprovechar completamente la herramienta, recomendamos la lectura de esta documentación oficial:
http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/deployment_rules.html

JavaRuleSetter puede ser descargada desde aquí.


Sergio de los Santos
ssantos@11paths.com

3 comentarios:

  1. Parece bastante interesante.... le echaré un vistazo ;)

    ResponderEliminar
  2. Hay un aspecto que no entiendo de vuestra herramienta. En el desplegable dáis a elegir para versiones SECURE-1.4 y SECURE-1.5. Sin embargo, el documento http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/deployment_rules.html indica

    The Deployment Rule Set feature requires the new Java Plug-in (available since Java SE 6 Update 10). Use of the old Java Plug-in is not supported. If a deployment rule set is installed, usage of the old plug-in is blocked for all RIAs.

    Curiosamente no aparece esa referencia en los documentos de las versiones 8 y 9 (http://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_rules.html o https://docs.oracle.com/javase/9/deploy/deployment-rule-set.htm).

    Entonces, ¿se puede usar con una versión 1.4 o no?

    ResponderEliminar
    Respuestas
    1. Hola Manuel Gonzalez,

      Contestando a tu pregunta, no se pueden usar con versiones anteriores. SECURE-1.4, o SECURE-1.5 implican que, como dice el texto, todas las RIAS serán bloqueadas para esa versión. Por tanto, no es que se puedan usar, sino que con esa directiva se bloquea toda una rama si se mantuviese esa máquina en el cliente. Esperamos haberte aclarado la duda :)

      Eliminar