Acerca de los agujeros de seguridad en Java

FlamingGodzilla
A estas alturas ya sabrán que hay una cantidad absurda de noticias respecto a subsecuentes agujeros de seguridad en la maquina virtual de Java.
Hace un tiempo escribí un poco al respecto de los planes que tiene Oracle, sin embargo hay información nueva vale la pena resaltar para seguirle los pasos a Oracle para ver como termina todo esto y ver si es tiempo de migrar todo a Ruby en Patines :).

¿De que se trata este problema, puedo ser afectado por estos errores?

Como explica Tim Boudreau en una descripción detallada del error, los Java applets son pequeños programas que se ejecutan en el explorador web similar a programas en Javascript o Flash. En su diseño original estos programas son ejecutados dentro de un «sandbox» en la JVM para que en teoría solo puedan realizar operaciones limitadas y solicitar autorización al usuario cuando requieren privilegios elevados como por ejemplo acceder a archivos dentro del computador o utilizar dispositivos de entrada.
El problema inicia cuando varias personas han encontrado como saltarse el sandbox de Java y ejecutar estas operaciones sin solicitar permisos al usuario.

¿Porque el problema con Java ha tenido tanta cobertura?

Oracle afirma existen más de mil millones de instalaciones de Java que al existir estos errores se convierten en mil millones de potenciales puntos de ataque (similar a lo que ocurria con Flash), ademas de esto porque el record de Java en seguridad ha sido considerablemente bueno con lo cual tantos problemas en un corto periodo de tiempo se ha vuelto una sorpresa.

¿El problema puede afectarme a mi?

La respuesta es: depende, este error no afecta a las instalaciones de escritorio, enterprise o embedidas de Java porque estas sencillamente se ejecutan con todos los privilegios, sin embargo si un usuario acostumbra visitar paginas de dudosa procedencia podría ser atacado no solo mediante Java, sino también con códigos más simples en Javascript o Flash, el saltarse los sandbox no es algo nuevo para los atacantes.

¿Quien es el responsable de actualizar Java, porque la respuesta es tan lenta?

La respuesta de nuevo es depende, existe más de una maquina virtual de Java donde cada uno de sus creadores es responsable de mantenerla al día. En el caso de las maquinas virtuales soportadas por Oracle (Hotspot, JRockit y OpenJDK) el responsable es Oracle (duh!) que tiene una política bastante clara pero poco conocida al respecto del manejo de estos errores, en palabras de seres humanos normales es «si el error no es tan grave, la actualizacion llegara en un periodo maximo de 3 meses, si el error es muy grave, se generará una actualización de seguridad en el menor tiempo posible», motivado de nuevo por la relativa omnipresencia de Java lo que significaría un dolor de cabeza a varios administradores de sistemas, especialmente aquellos que tengan un numero considerable de sistemas a su cargo.

¿Y porque no se hacen actualizaciones incrementales como en Windows o Linux?

Básicamente por la forma monolítica en la que esta construida la maquina virtual. Aunque Oracle mantiene la maquina virtual de referencia (OpenJDK) decisiones tan radicales son planificadas por el JCP (el consorcio que dirige el desarrollo de Java). Sin embargo esta característica ya esta planificada y depende del avance del proyecto Jigsaw para la modularización de Java, entonces es cuestión de tiempo.

¿Todo es culpa de que el código sea propietario?

Diremos que en parte si, que el software sea Open Source o no nunca garantiza que un software no tenga fallos de seguridad (de hecho son bastante comunes) pero generalmente garantiza que habrá alguien cuidando que el software reciba más colaboraciones.
Aunque la mayoría de código fuente fue liberado por Sun, el plugin para navegadores web fue parte de lo que no se pudo liberar porque Sun no tenia la propiedad intelectual sobre algunos componentes y las implementaciones libres de Java como IcedTea tuvieron que implementarlo a su modo.

Oracle no ha comentado al respecto ¿Le importan poco los usuarios y desarrolladores de Java?

Dejare que ustedes decidan esto para no parecer fan de Oracle (de hecho en estos momentos programo más en C++ que en Java). Motivado por estos hechos Oracle ha intentado obtener comentarios de la comunidad de desarrolladores Java acerca de la mejor forma de manejar este problema y asignó un encargado de tiempo completo para estas políticas de seguridad, si tienen curiosidad pueden escuchar en The Aquarium la discusión de este encargado con los JUG Leaders mundiales que básicamente representan a la comunidad Java a nivel mundial.

A mi me gusta Java ¿Donde puedo colaborar o con quien tengo que hablar?

La ruta más corta seria entrar en contacto con su JUG más cercano y si están dispuestos a aportar código pues existen los proyectos AdoptOpenJDK y AdoptAJSR donde su ayuda sera bienvenida, vale la pena resaltar que los JUGs también tienen presencia en el JCP y pueden influenciar bastante.

A mi no me gusta Java ¿Vale la pena tener instalada la maquina virtual?

Depende de ustedes, en mi caso las dos veces que he sido «hackeado» fue porque deje sin bloquear mi computadora al alcance de mi novia. A opinion personal aun dependo mucho de Java y realmente me gusta la plataforma por sus virtudes, además necesito Java para utilizar Vuze, JDownloader, jugar Minecraft, y acceder a las paginas del Banco do Brasil.
Sin embargo si son adictos a la deep web y temen por su seguridad pero necesitan de Java en el escritorio, siempre esta la opción de deshabilitar solo el plugin web, de hecho Apple y Mozilla ya lo han hecho por ustedes mientras esta situación vuelve a estar bajo control.

[QuickTip] Copiar dependencias de un proyecto en maven

binary-107510-48999

Para copiar las dependencias de un proyecto podemos utilizar maven-dependency-plugin, por ejemplo:

<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>

Con lo anterior todas las dependencias de nuestro proyecto seran copiadas al directorio target/lib.

[QuickTip] Crear un jar con dependencias embedidas en maven

binary-107510-48999

Para crear un .jar con dependencias en maven, podemos utilizar maven-assembly-plugin. Por ejemplo si nuestra clase principal es org.foo.Main, bastaria con agregar la siguiente configuración al archivo pom.xml

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.foo.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin-->

Y listo, una vez que regeneramos el proyecto encontraremos un archivo-version.jar y tambien un archivo-version-jar-with-dependencies.jar en nuestro directorio target.

[QuickTip] Agregando anotaciones a archivos PDF con evince

1308725027Crear anotaciones sobre un PDF es el proceso más fácil del planeta, tan fácil que luego de buscar como loco durante 15 minutos encontré que Evince soporta de serie esta característica, que al menos para mi, es poco conocida.
Para esto basta con seguir los siguientes pasos:

  • Abrir su PDF favorito
  • En la esquina superior izquierda buscar la opcion «Thumbnails» y alternarla por la opción «Anotaciones»
  • Luego en la pestaña «Agregar» basta con presionar el icono de agregar, generalmente un lápiz, esto ultimo depende del tema de iconos.
  • Al realizar esto el cursor debería haberse transformado en un símbolo + y basta con hacer click para agregar la anotación.

A mi gusto el icono de anotaciones es bastante feo y puede ser cambiado por otros no tan feos, ademas de eso para no perder las anotaciones se debe guardar el PDF como una copia, de lo contrario perderán todas sus anotaciones :'(.

39 tutoriales de Java y relacionados

JuicyNewsNetwork

Limpiando bookmarks encontré algunos links interesantes de Java y tecnologías relacionadas que datan desde mis estudios de pregrado hasta épocas recientes.
Muchos de estos links son clásicos y otros los tengo en un lugar especial porque a pesar de los años, van al grano en sus explicaciones y aun son validos.

Por supuesto deben ser complemento y no reemplazo al tutorial oficial de JSE, JME y JEE.
JSE/General:

JEE/Java Web:

JME

Configuraciones y herramientas

Migración rapida desde Gnome hacia awesome-wm en Gentoo

Algunos posts atras comentaba mi experiencia con awesome-wm y Sabayon, luego de utilizarlo la mayor parte del tiempo decidí que era el momento de aceptar que me estaba gustando más que Gnome 3 a excepción de un solo detalle: perdía demasiado tiempo configurando el entorno y le he invertido mucho tiempo a Gnome.
Durante la instalación en mi computadora de casa (esta vez con Funtoo y compilando) note que el ebuild de awesome ofrece la use flag gnome, y si se compila con esta use flag  todas las configuraciones mencionadas en la wiki de awesome, se realizan de manera automática.
¿Que ventajas obtengo?
Entre las mas importantes y que me interesaban puedo mencionar:

  • Las aplicaciones recuperan las notificaciones via libnotify
  • Las teclas multimedia y especiales del teclado funcionan exactamente igual que Gnome (inclusive los screenshots con gnome-screenshot)
  • Las configuraciones de layouts de teclado y el shortcut de cambio (Shift+Caps Lock) son conservados

Podría continuar la lista pero básicamente obtengo todas las configuraciones propias de una sesion de Gnome dentro de awesome (o Gnome usando awesome como su window manager, como quieran verlo), mi sueño hecho realidad :D.
¿Algun problema con esta configuración?
Por defecto awesome utiliza el comando awesome.quit para cerrar sesión, pero al existir una sesion de Gnome en ejecución la sesión no es terminada y solo queda un lindo escritorio Gnome sin administrador de ventanas (otra referencia).

Mi solución para este inconveniente es utilizar gnome-session-quit como reemplazo a awesome.quit modificando el menú de awesome, el atajo de teclado de cierre de sesión y configurarlo como una ventana flotante en el archivo rc.lua:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#awesome menu config
myawesomemenu = {
{ "manual", terminal .. " -e man awesome" },
{ "edit config", editor_cmd .. " " .. awesome.conffile },
{ "restart", awesome.restart },
{ "quit", "gnome-session-quit --logout"}
}
....
#keyboard shortcut config
awful.key({ modkey, "Shift"   }, "q", 
function () awful.util.spawn("gnome-session-quit --logout") end),
...
#floating windows section
{ rule = { class = "gnome-session-quit" },
properties = { floating = true } },
....

Ademas de esto existe el inconveniente de que awesome depende de Gnome pero es un costo que no me molesta pagar a cambio de usabilidad y dejar de quebrarme la cabeza con el archivo rc.lua :).

Si la configuración es correcta obtienen algo como el siguiente screenshot:

Gentoo Linux 20121221 LiveDVD – End Of World Edition


Siguiendo con su tradición esporádica de lanzar ediciones especiales de LiveDVD como las que vimos en anteriores oportunidades con la versión 10 y la versión 12.1, el proyecto Gentoo publico un LiveDVD conmemorativo al fin del mundo que debe ocurrir exactamente a las 11:12 UTC (aproximadamente 4 horas después de la publicación de este post).
Como de costumbre el DVD presenta algunos paquetes actualizados en relacion a DVDs anteriores incluyendo Kernel 3.6.8, Xorg 1.12.4, KDE 4.9.4, Gnome 3.4.2, XFCE 4.10, Fluxbox 1.3.2, Firefox 17.0.1, LibreOffice 3.6.4.3, Gimp 2.8.2-r1, Blender 2.64a, Amarok 2.6.0, Mplayer 2.2.0, Chromium 24.0.1312.35.
De acuerdo a la publicación oficial no hay mucho por mostrar ya que el FAQ y el artwork siguen siendo los mismos. Entonces disfrutemos del fin de la humanidad utilizando uno de los sistemas operativos más eficientes del planeta y cantemos con R.E.M.

Last.fm player sobre un tunel ssh con proxychains

El año 2009 muchos usuarios frecuentes de Last.fm fuimos discriminados por no ser habitantes de Estados Unidos, Reino Unido o Alemania, y perdimos el acceso a las estaciones de radio gratuitas.
Luego de unos meses de usar un clásico tunel ssh, termine refugiándome en Shoutcast porque el reproductor web esta basado en Flash y reproductores de terceros como Clementine o Amarok solo funcionan con una suscripción activada.
Esto ultimo lo descubrí hace poco 😀 y luego de varios meses sin radios de Last.fm instale el cliente oficial. . . que no admite el uso de proxy socks (supongo que para evitar los tuneles ssh).

Y aquí es donde entra en juego proxychains, una herramienta diseñada para forzar las conexiones tcp de cualquier aplicación sobre un proxy y/o multiples proxies.

Paso 0: Instalación de proxychains
Instalamos proxychains con nuestro administrador de paquetes favorito, en el caso de Gentoo, usamos Portage.

1
# emerge proxychains

Paso 1: Configuración de proxychains
De acuerdo a la documentación del proyecto, proxychains presenta la siguiente jerarquía para su búsqueda de configuraciones:

1) ./proxychains.conf
2) $(HOME)/.proxychains/proxychains.conf
3) /etc/proxychains.conf **

Por defecto solo existira el archivo /etc/proxychains.conf el cual puede ser copiado a cualquiera de las primeras dos direcciones. Posteriormente agregamos a la seccion [ProxyList] nuestro proxy socks, en mi caso la sección tiene la siguiente estructura:

1
2
3
4
5
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5  127.0.0.1 9999

Paso 2: Creación del port forwarding
Establecemos una conexión via ssh con un cliente que soporte características de port-forwarding (OpenSSH lo soporta de serie) creando con esto un proxy socks 5. Vale la pena resaltar que el servidor de destino debe de estar en alguno de los países admitidos por Last.fm.

1
# ssh -D 9999 usuario@servidor.com

Paso 3: Ejecución
Por ultimo ejecutamos proxychains y como parámetro la aplicación que deseamos que sea forzada a utilizar el proxy

1
$ proxychains lastfm

Si toda la configuración es correcta el reproductor lastfm se conectara a través de nuestro proxy:

 

 

 

Primeras impresiones de Steam en Linux

A pesar de que en la web existen infinidad de hacks para descargar y ejecutar Steam en Linux, decidí esperar hasta tener una invitación y/o esperar la versión estable.
El día de hoy como parte de su programa de beta limitada, Valve libero el acceso a más usuarios, entre los cuales su servidor fue incluido así que pude darle un primer vistazo al cliente con una plataforma poco ortodoxa: Funtoo Linux. Vale la pena advertir que este es un post largo.
Continue reading →

JavaFX y JFocusBoost Alpha

JavaFX es la propuesta de Oracle (que inicio en Sun) para cubrir el segmento RIA  en aplicaciones cliente, para esos casos donde no todo puede/debe ser web+html5.
La plataforma originalmente utilizaba un lenguaje denominado JavaFX Script del cual me desencante a los 5 minutos por considerarlo un lenguaje para programar pelotas que rebotan una con otra y transiciones de colores con psico-marihuana que quedaban fuera de mis intereses.
Por el contrario la versión 2 reemplazo este lenguaje con una especificación clara en un modelo MVC aprovechando el motor de JavaFX original y reemplazando JavaFX script por Java, re enfocando la plataforma a aplicaciones cliente y/o aplicaciones de escritorio con controles fácilmente decorables via CSS, aceleración gráfica y navegador web embebido.

¿Que cosas se pueden hacer en JavaFX?

A diferencia de Swing, AWT o SWT, JavaFX es una tecnología muy nueva así que no esperen por el momento frameworks de desarrollo de interfaces gráficas como Eclipse o Netbeans con composición de ventanas, ademas el paradigma de GUI es nuevo y se basa en escenarios y escenas. Entre algunas aplicaciones interesantes que encontré están:

Con una búsqueda en Google basta para ver la infinidad de blogs que hablan de la tecnología, el problema es que la mayoría habla de ejemplos y muchos son repetidos :/.

Entre mis comentarios puntuales de cosas que no pude hacer con JavaFX están:

Otra cosa a tomar en cuenta es que el soporte a CSS es parcialmente cierto ya que en realidad JavaFX no soporta CSS como lo conocemos sino una implementación de CSS 2 personalizada.

JFocusBoost

Hace tiempo he tenido un proyecto en mente para un simple reloj pomodoro basado en mis necesidades porque mi reloj preferido estaba desarrollado en AIR y pues . . . Adobe descontinuo AIR en Linux, entre algunos reemplazos notables encontré a Tomighty, gnome-shell-pomodoro y N paginas web, sin embargo no cubrían lo que necesitaba.
Luego de tomar algunas horas de mis fines de semana logre desarrollar un prototipo de mi propio reloj pomodoro denominado JFocusBoost el cual pueden encontrar en la pagina del proyecto, bajo una licencia libre.
Entre las cosas interesantes del código fuente están:

  • Localización de la aplicación a Español, Portugués e Ingles utilizando resource bundle.
  • Demostración de el uso de MVC haciendo bindings directos al modelo y como dos archivos FXML pueden utilizar el mismo controlador (esto fue lo más difícil).
  • Uso de javafx.concurrent.Service, el wrapper simplista de JavaFX para el uso de threads en Java.
  • Cambio en tiempo de ejecución de la apariencia utilizando distintas clases CSS.
  • Uso de recursos de audio con AudioClip.
  • El viejo y no tan explorado almacenamiento de preferencias utilizando java.util.prefs.Preferences.
  • Eliminación de bordes y fondo transparente.

Vale la pena resaltar que es un release alpha, y el desarrollo lo hice pensado para mi propio uso. Cualquier ayuda, parche, reporte de bug o sugerencia es bienvenida, realmente no tuve el tiempo de probar la aplicación fuera de Linux porque la idea de desarrollarla fue aprovechar mi tiempo :D.