Articulo de referencia

Seguridad de la plataforma de software Java

La plataforma de software Java ofrece diversas funcionalidades diseñadas para mejorar la seguridad de las aplicaciones Java. Esto incluye la aplicación de restricciones en tiemp...

La plataforma de software Java ofrece diversas funcionalidades diseñadas para mejorar la seguridad de las aplicaciones Java. Esto incluye la aplicación de restricciones en tiempo de ejecución mediante la Máquina Virtual Java (JVM), un gestor de seguridad que aísla el código no confiable del resto del sistema operativo y un conjunto de API de seguridad que los desarrolladores Java pueden utilizar. A pesar de ello, el lenguaje de programación y Oracle han recibido críticas debido a un aumento de programas maliciosos que revelaron vulnerabilidades de seguridad en la JVM, las cuales Oracle no abordó adecuadamente de manera oportuna.

Características de seguridad

La JVM

La forma binaria de los programas que se ejecutan en la plataforma Java no es código máquina nativo , sino un código de bytes intermedio . La JVM verifica este código de bytes antes de ejecutarlo para evitar que el programa realice operaciones inseguras, como saltos a ubicaciones incorrectas que podrían contener datos en lugar de instrucciones. También permite a la JVM aplicar restricciones en tiempo de ejecución, como la comprobación de límites de matrices . Esto significa que los programas Java tienen una probabilidad significativamente menor de sufrir fallos de seguridad de memoria , como desbordamientos de búfer, que los programas escritos en lenguajes como C , que no ofrecen tales garantías de seguridad de memoria.

La plataforma impide que los programas realicen ciertas operaciones potencialmente inseguras, como aritmética de punteros o conversiones de tipo sin verificación . Gestiona la asignación e inicialización de memoria y proporciona recolección automática de basura , lo que en muchos casos (aunque no en todos) libera al desarrollador de la gestión manual de la memoria . Esto contribuye a la seguridad de tipos y a la seguridad de la memoria.

gerente de seguridad

La plataforma proporciona un gestor de seguridad que permite a los usuarios ejecutar código de bytes no confiable en un entorno aislado, diseñado para protegerlos de software malicioso o mal programado, impidiendo que dicho código acceda a ciertas funciones y API de la plataforma. Por ejemplo, se puede impedir que el código no confiable lea o escriba archivos en el sistema de archivos local, ejecute comandos arbitrarios con los privilegios del usuario actual, acceda a redes de comunicación, acceda al estado privado interno de los objetos mediante reflexión o provoque el cierre de la JVM.

El gestor de seguridad también permite firmar criptográficamente los programas Java ; los usuarios pueden optar por permitir que el código con una firma digital válida de una entidad de confianza se ejecute con todos los privilegios en circunstancias en las que, de otro modo, no sería de confianza.

Los usuarios también pueden establecer políticas de control de acceso detalladas para programas de diferentes orígenes. Por ejemplo, un usuario puede decidir que solo las clases del sistema sean totalmente confiables, que el código de ciertas entidades confiables pueda leer ciertos archivos específicos y que todo el demás código esté completamente aislado (sandbox).

API de seguridad

La biblioteca de clases de Java proporciona una serie de API relacionadas con la seguridad, como algoritmos criptográficos estándar , autenticación y protocolos de comunicación seguros.

El sol.misc.Clase insegura

sun.misc.Unsafees una clase de utilidad interna en el lenguaje de programación Java que es una colección de operaciones inseguras de bajo nivel. [ 1 ] Si bien no forma parte de la biblioteca oficial de clases de Java , las bibliotecas de Java la llaman internamente. Reside en un módulo Java no oficial llamado jdk.unsupported. A partir de Java 11, se ha migrado parcialmente a jdk.internal.misc.Unsafe(que reside en el módulo java.base). [ 1 ]

Su característica principal es permitir la gestión directa de la memoria (similar a la gestión de memoria de C ) y la manipulación de direcciones de memoria, la manipulación de objetos y campos, la manipulación de hilos y las primitivas de concurrencia.

Su declaración es: , y es una clase singleton con un constructor privado. [ 2 ]publicfinalclassUnsafe;

Contiene los siguientes métodos, muchos de los cuales están declarados native(invocando la Interfaz Nativa de Java ): [ 2 ] [ 3 ]

  • staticUnsafegetUnsafe(): recupera la Unsafeinstancia. Se utiliza sun.reflect.Reflectionpara hacerlo.
  • intgetInt(Objecto,longoffset): obtiene un valor (un campo o un elemento de matriz) en el objeto en el desplazamiento dado. ( También existen métodos correspondientes como getBoolean(), getByte(), getShort(), getChar(), getLong(), getFloat(), y ).getDouble()
  • voidputInt(Objecto,longoffset,intx): almacena un valor en un objeto en el desplazamiento dado. ( También existen métodos correspondientes como putBoolean(), putByte(), putShort(), putChar(), putLong(), putFloat(), y ).putDouble()
  • ObjectgetObject(Objecto,longoffset): obtiene un valor de referencia de un objeto en el desplazamiento dado.
  • voidputObject(Objecto,longoffset,Objectx): almacena un valor de referencia en un objeto en el desplazamiento dado.
  • intgetInt(longaddress): obtiene un valor en la dirección dada. ( También existen métodos correspondientes como getBoolean(), getByte(), getShort(), getChar(), getLong(), getFloat(), y ).getDouble()
  • voidputInt(longaddress,intx): almacena un valor en la dirección dada. ( También existen métodos correspondientes como putBoolean(), putByte(), putShort(), putChar(), putLong(), putFloat(), y ).putDouble()
  • longgetAddress(longaddress): obtiene un puntero nativo desde una dirección dada.
  • voidputAddress(longaddress,longx): almacena un puntero nativo en una dirección determinada.
  • longallocateMemory(longbytes): asigna un bloque de memoria nativa del tamaño dado (similar a malloc() ).
  • longreallocateMemory(longaddress,longbytes): redimensiona un bloque de memoria nativa al tamaño dado (similar a realloc() ).
  • voidsetMemory(Objecto,longoffset,longbytes,bytevalue), : establece todos los bytes en un bloque de memoria a un valor fijo (similar a memset() ).voidsetMemory(longaddress,longbytes,bytevalue)
  • voidcopyMemory(ObjectsrcBase,longsrcOffset,ObjectdestBase,longdestOffset,longbytes), : establece todos los bytes en un bloque de memoria dado como una copia de otro bloque (similar a memcpy() ).voidcopyMemory(longsrcAddress,longdestAddress,longbytes)
  • voidfreeMemory(longaddress): libera un bloque de memoria nativa obtenido de allocateMemory()o reallocateMemory(), de forma similar a free() ).
  • longstaticFieldOffset(Fieldf): obtiene la ubicación de un campo determinado en la asignación de almacenamiento de su clase.
  • longobjectFieldOffset(Fieldf): obtiene la ubicación de un campo estático dado en conjunto con staticFieldBase().
  • ObjectstaticFieldBase(Fieldf): obtiene la ubicación de un campo estático dado en conjunto con staticFieldOffset().
  • voidensureClassInitialized(Class<?>c): garantiza que la clase dada haya sido inicializada.
  • intarrayBaseOffset(Class<?>arrayClass): obtiene el desplazamiento del primer elemento en la asignación de almacenamiento de una clase de matriz determinada.
  • intarrayIndexScale(Class<?>arrayClass): obtiene el factor de escala para direccionar elementos en la asignación de almacenamiento de una clase de matriz determinada.
  • staticintaddressSize(): obtiene el tamaño (en bytes) de un puntero nativo.
  • intpageSize(): obtiene el tamaño (en bytes) de una página de memoria nativa.
  • Class<?>defineClass(Stringname,byte[]b,intoff,intlen,ClassLoaderloader,ProtectionDomainprotectionDomain): indica a la JVM que defina una clase sin comprobaciones de seguridad.
  • Class<?>defineAnonymousClass(Class<?>hostClass,byte[]data,Object[]cpPatches): indica a la JVM que defina una clase, pero no la da a conocer al cargador de clases ni al directorio del sistema.
  • ObjectallocateInstance(Class<?>cls)throwsInstantiationException: Asigna una instancia de una clase sin ejecutar su constructor.
  • voidmonitorEnter(Objecto): bloquea un objeto.
  • voidmonitorExit(Objecto): desbloquea un objeto.
  • booleantryMonitorEnter(Objecto): intenta bloquear un objeto y devuelve si el bloqueo se realizó correctamente.
  • voidthrowException(Throwableee): lanza una excepción sin avisar al verificador.
  • finalbooleancompareAndSwapInt(Objecto,longoffset,intexpected,intx)Actualiza una variable a xsi contiene , devolviendo si la operación se realizó correctamente. ( También expectedexisten métodos correspondientes compareAndSwapLong()) .compareAndSwapObject()
  • intgetIntVolatile(Objecto,longoffset): versión volátil de . ( También getInt()existen métodos correspondientes getBooleanVolatile(), getByteVolatile(), getShortVolatile(), getCharVolatile(), getLongVolatile(), getFloatVolatile(), getDoubleVolatile(), y .)getObjectVolatile()
  • voidputIntVolatile(Objecto,longoffset,intx): versión volátil de . ( También putInt()existen métodos correspondientes putBooleanVolatile(), putByteVolatile(), putShortVolatile(), putCharVolatile(), putLongVolatile(), putFloatVolatile(), putDoubleVolatile(), y .)putObjectVolatile()
  • voidputOrderedInt(Objecto,longoffset,intx): versión que no garantiza la visibilidad inmediata del almacenamiento a otros subprocesos. ( También putIntVolatile()existen métodos correspondientes putOrderedLong()) .putOrderedObject()
  • voidunpark(Objectthread): desbloquea un hilo.
  • voidpark(booleanisAbsolute,longtime): bloquea el hilo actual.
  • intgetLoadAverage(double[]loadavg,intnelems): obtiene la carga promedio en la cola de ejecución del sistema asignada a los procesadores disponibles, promediada durante varios períodos de tiempo.
  • voidinvokeCleaner(ByteBufferdirectBuffer): invoca el limpiador del búfer de bytes directo dado.
  • voidfullFence(): garantiza que las cargas y los almacenes anteriores a la valla no se vuelvan a ordenar con las cargas y los almacenes posteriores a la valla.
  • voidloadFence(): garantiza que las cargas anteriores a la valla no se vuelvan a ordenar con cargas y almacenes posteriores a la valla.
  • voidstoreFence(): garantiza que las cargas y los almacenes anteriores a la valla no se vuelvan a pedir con los almacenes posteriores a la valla.

Ejemplos

Un ejemplo de uso es el siguiente:

paquete org.wikipedia.examples ;import java.lang.reflect.Field ;importar sun.misc.Unsafe ;public class Example { public static void main ( String [] args ) throws Exception { // Obtener instancia de Unsafe a través de reflexión Field f = Unsafe . class . getDeclaredField ( "theUnsafe" ); f . setAccessible ( true ); Unsafe unsafe = ( Unsafe ) f . get ( null );// Asignar un bloque de memoria de 8 bytes de longitud memoryAddress = unsafe . allocateMemory ( 8L );try { // Inserta un valor long en la memoria y lee desde ese bloque unsafe.putLong ( memoryAddress , 123456789L ); long value = unsafe.getLong ( memoryAddress ) ; System.out.printf ( " Valor de la memoria : %d%n" , value ); // Salida: 123456789 } finally { // Libera la memoria asignada unsafe.freeMemory ( memoryAddress ) ; } } }

También se pueden encapsular segmentos de memoria nativa, como por ejemplo java.lang.foreign.MemorySegment:

paquete org.wikipedia.examples ;import java.lang.reflect.Field ;importar sun.misc.Unsafe ;public class NativeMemory implements AutoCloseable { private static final Unsafe unsafe ; private final long address ; private final long size ;static { try { Field theUnsafe = Unsafe . class . getDeclaredField ( "theUnsafe" ); theUnsafe . setAccessible ( true ); unsafe = ( Unsafe ) theUnsafe . get ( null ); } catch ( Exception e ) { throw new RuntimeException ( "No se puede acceder a Unsafe" , e ); } }public NativeMemory ( long size ) { this.size = size ; this.address = unsafe.allocateMemory ( size ) ; }public void putByte ( long offset , byte value ) { checkBounds ( offset , 1 ) ; unsafe.putByte ( address + offset , value ) ; }public byte getByte ( long offset ) { checkBounds ( offset , 1 ) ; return unsafe.getByte ( address + offset ) ; }private void checkBounds ( long offset , long bytes ) { if ( offset < 0 || offset + bytes > size ) { throw new IndexOutOfBoundsException ( String.format ( " Offset out of bounds: %d" , offset ) ); } }@Override public void close () { unsafe . freeMemory ( address ); } }

En uso:

paquete org.wikipedia.examples ;public class Main { public static void main ( String [] args ) { try ( NativeMemory mem = new NativeMemory ( 1024 )) { mem . putByte ( 0 , ( byte ) 42 ); System . out . printf ( "Valor: %s%n" , mem . getByte ( 0 )); } } }

Posibles fuentes de vulnerabilidades de seguridad en aplicaciones Java

Existen diversas fuentes potenciales de vulnerabilidades de seguridad en las aplicaciones Java, algunas comunes a aplicaciones que no son Java y otras específicas de la plataforma Java. (Cabe destacar que estas son fuentes potenciales de vulnerabilidades que los programadores preocupados por la seguridad deben tener en cuenta; no se trata de una lista de vulnerabilidades reales ).

Ejemplos de posibles fuentes de vulnerabilidad comunes a las aplicaciones Java y no Java son:

  • Vulnerabilidades en los mecanismos de protección proporcionados por el hardware o el sistema operativo en los que se basa la aplicación para su seguridad.
  • Vulnerabilidades en bibliotecas nativas, como la biblioteca estándar de C , que pueden utilizarse para implementar la aplicación y/o el entorno de ejecución.
  • Vulnerabilidades causadas exclusivamente por errores en los programas de usuario (por ejemplo, la construcción incorrecta de consultas SQL que da lugar a vulnerabilidades de inyección SQL ).

Sin embargo, gran parte del debate sobre la seguridad de Java se centra en posibles fuentes de vulnerabilidad específicas de la plataforma Java. Estas incluyen:

  • Vulnerabilidades en el mecanismo de aislamiento que permiten que el código de bytes no confiable eluda las restricciones impuestas por el administrador de seguridad.
  • Vulnerabilidades en la biblioteca de clases Java de la que depende una aplicación para su seguridad.

Una vulnerabilidad en la plataforma Java no necesariamente hará que todas las aplicaciones Java sean vulnerables. Cuando se anuncian vulnerabilidades y parches, por ejemplo por Oracle, el anuncio normalmente incluirá un desglose de qué tipos de aplicaciones se ven afectadas ( ejemplo ).

Por ejemplo, una hipotética falla de seguridad que afecte solo al mecanismo de sandboxing del administrador de seguridad de una implementación particular de JVM significaría que solo las aplicaciones Java que ejecutan bytecode arbitrario no confiable se verían comprometidas: las aplicaciones donde el usuario confía plenamente y controla todo el bytecode que se ejecuta no se verían afectadas. Esto significaría que, por ejemplo, un complemento de navegador web basado en esa JVM sería vulnerable a applets maliciosos descargados de sitios web públicos, pero una aplicación web del lado del servidor que se ejecuta en la misma versión de la JVM donde el administrador tiene control total sobre el classpath no se vería afectada. [ 4 ] Al igual que con las aplicaciones que no son Java, las vulnerabilidades de seguridad pueden provenir de partes de la plataforma que inicialmente pueden no parecer relacionadas con la seguridad. Por ejemplo, en 2011, Oracle emitió una corrección de seguridad para un error en el Double.parseDoublemétodo. [ 5 ] Este método convierte una cadena como "12.34" en el número de punto flotante de doble precisión equivalente . El error hacía que este método entrara en un bucle infinito cuando se llamaba con una entrada específica. Este fallo tenía implicaciones de seguridad, ya que, por ejemplo, si un servidor web convierte una cadena de texto introducida por el usuario en un formulario mediante este método, un usuario malintencionado podría introducir la cadena que activa el fallo. Esto provocaría que el hilo del servidor web que procesa la solicitud maliciosa entrara en un bucle infinito y dejara de estar disponible para atender las solicitudes de otros usuarios. Repetir esta acción en un servidor web vulnerable constituiría un ataque de denegación de servicio sencillo : todos los hilos del servidor web encargados de responder a las solicitudes de los usuarios pronto quedarían bloqueados en el bucle infinito y el servidor web sería incapaz de atender a ningún usuario legítimo.

Críticas al gerente de seguridad

El gestor de seguridad de la plataforma Java (que, como se mencionó anteriormente, está diseñado para permitir al usuario ejecutar de forma segura código de bytes no confiable) ha sido criticado en los últimos años por hacer que los usuarios sean vulnerables al malware , especialmente en los complementos de navegadores web que ejecutan applets de Java descargados de sitios web públicos, conocidos informalmente como "Java en el navegador".

Los esfuerzos de Oracle para abordar estas vulnerabilidades dieron como resultado un retraso en el lanzamiento de Java 8. [ 6 ]

2012

Un troyano de OS X conocido como Flashback explotaba una vulnerabilidad en Java, que no había sido parcheada por Apple , aunque Oracle ya había publicado un parche. [ 7 ] En abril, Apple lanzó posteriormente una herramienta de eliminación para usuarios de Lion sin Java. [ 8 ] Con Java 7 Update 4, Oracle comenzó a lanzar Java directamente para Lion y versiones posteriores . [ 9 ]

En octubre, Apple lanzó una actualización que eliminó el complemento de Java de todos los navegadores . [ 10 ] Esto se interpretó como una medida de Apple para distanciar OS X de Java. [ 11 ]

2013

En enero, se descubrió una vulnerabilidad de día cero en todas las versiones de Java 7, incluida la última versión, Java 7 Update 10, que ya había sido explotada. [ 12 ] La vulnerabilidad fue causada por un parche para corregir una vulnerabilidad anterior. [ 13 ] En respuesta, Apple incluyó en la lista negra la última versión del complemento de Java. [ 14 ] Oracle publicó un parche (Update 11) en tres días. [ 15 ] Microsoft también publicó un parche para las versiones 6 , 7 y 8 de Internet Explorer . [ 16 ]

Se descubrió que el malware de ciberespionaje Red October explotaba una vulnerabilidad de Java que fue parcheada en octubre de 2011. [ 17 ] El sitio web de Reporteros Sin Fronteras también se vio comprometido por una vulnerabilidad de Java en versiones anteriores a la Actualización 11. [ 18 ]

Tras el lanzamiento de la Actualización 11, comenzó a circular en línea otra vulnerabilidad, [ 19 ] que posteriormente fue confirmada. [ 20 ] También se descubrió que el modo de seguridad de Java era vulnerable debido a un error. [ 21 ] En respuesta, Mozilla deshabilitó Java (así como Adobe Reader y Microsoft Silverlight ) en Firefox por defecto, [ 22 ] mientras que Apple volvió a incluir en la lista negra el último complemento de Java. [ 23 ]

En febrero, Twitter informó que había detenido un ataque. Twitter aconsejó a los usuarios que deshabilitaran Java, aunque no explicó el motivo. [ 24 ] Más adelante ese mes, Facebook informó que había sido víctima de un ataque de Java de día cero. [ 25 ] Apple también informó de un ataque. [ 26 ] Se descubrió que una brecha en un foro de desarrolladores de iPhone se utilizó para atacar a Twitter, Facebook y Apple. [ 27 ] El propio foro desconocía la brecha. [ 28 ] Tras Twitter, Facebook y Apple, Microsoft informó que también había sido comprometida de forma similar. [ 29 ]

Otra vulnerabilidad descubierta permitió eludir por completo el entorno aislado de seguridad de Java en la versión original de Java 7, así como en las actualizaciones 11 y 15. [ 30 ] En marzo, se descubrió un troyano llamado McRat que explotaba una vulnerabilidad de día cero en Java. [ 31 ] Oracle lanzó entonces otro parche para solucionar la vulnerabilidad. [ 32 ]

Véase también

Referencias

  1. 1 2 Ben Evans (4 de mayo de 2020). "La clase insegura: inseguro a cualquier velocidad" . blogs.oracle.com . Oracle Corporation.
  2. 1 2 "sun.misc: Unsafe.java" . docjar.com . Archivado del original el 30 de septiembre de 2016.
  3. "Inseguro (Plataforma Java SE 9)" . cr.openjdk.org . OpenJDK . Consultado el 10 de octubre de 2025 .
  4. Alerta de seguridad publicada para CVE-2013-0422 . Oracle Corporation. Consultado el 24 de abril de 2013.
  5. Oracle lanza una actualización para corregir el error Double.parseDouble en tiempo récord . InfoQ. Consultado el 24 de abril de 2013.
  6. Asegurar el tren . Blog de Mark Reinhold, arquitecto jefe del Grupo de Plataforma Java de Oracle. 18 de abril de 2013.
  7. Goodin, Dan (2 de abril de 2012). "El troyano Mac Flashback explota una vulnerabilidad de Java sin parchear, sin necesidad de contraseña" . Ars Technica . Consultado el 18 de febrero de 2014 .
  8. Geuss, Megan (14 de abril de 2012). "Llega la herramienta de eliminación de malware Flashback para usuarios de Mac sin Java" . Ars Technica . Consultado el 18 de febrero de 2014 .
  9. Foresman, Chris (27 de abril de 2012). "Olvídate de Apple: Oracle llevará las correcciones de seguridad de Java directamente a los usuarios de Mac" . Ars Technica . Consultado el 18 de febrero de 2014 .
  10. Goodin, Dan (18 de octubre de 2012). "Apple elimina Java de todos los navegadores web de OS X" . Ars Technica . Consultado el 18 de febrero de 2014 .
  11. Cheng, Jacqui (23 de diciembre de 2012). "En qué situación se encuentra la seguridad de OS X tras un volátil 2012" . Ars Technica . Consultado el 18 de febrero de 2014 .
  12. Goodin, Dan (10 de enero de 2013). "Se está explotando masivamente un error crítico de día cero en Java (actualizado)" . Ars Technica . Consultado el 18 de febrero de 2014 .
  13. Goodin, Dan (11 de enero de 2013). "Vulnerabilidad crítica de Java posible gracias a un parche anterior incompleto (actualizado)" . Ars Technica . Consultado el 18 de febrero de 2014 .
  14. Foresman, Chris (11 de enero de 2013). "Apple bloquea Java en OS X para prevenir las últimas vulnerabilidades "críticas"" . Ars Technica . Consultado el 18 de febrero de 2014 .
  15. Mattise, Nathan (14 de enero de 2013). "Oracle corrige en tres días una vulnerabilidad generalizada de día cero en Java (Actualizado)" . Ars Technica . Consultado el 18 de febrero de 2014 .
  16. Goodin, Dan (14 de enero de 2013). "Microsoft lanza una actualización de emergencia para corregir un error de Internet Explorer" . Ars Technica . Consultado el 18 de febrero de 2014 .
  17. Goodin, Dan (15 de enero de 2013). "Red October se basó en una vulnerabilidad de Java para infectar PCs" . Ars Technica . Consultado el 18 de febrero de 2014 .
  18. Goodin, Dan (22 de enero de 2013). "Se utilizan errores de Java e IE recién parcheados para atacar sitios web de derechos humanos" . Ars Technica . Consultado el 18 de febrero de 2014 .
  19. Goodin, Dan (16 de enero de 2013). "$5,000 te darán acceso a otra nueva vulnerabilidad crítica de Java (Actualizado)" . Ars Technica . Consultado el 18 de febrero de 2014 .
  20. Goodin, Dan (18 de enero de 2013). "Se confirman vulnerabilidades críticas de Java en la última versión" . Ars Technica . Consultado el 18 de febrero de 2014 .
  21. Goodin, Dan (28 de enero de 2013). "El nuevo modo de seguridad 'muy alto' de Java no puede protegerte del malware" . Ars Technica . Consultado el 18 de febrero de 2014 .
  22. Goodin, Dan (31 de enero de 2013). "Firefox bloqueará contenido basado en Java, Reader y Silverlight" . Ars Technica . Consultado el 18 de febrero de 2014 .
  23. Foresman, Chris (31 de enero de 2013). "Por segunda vez en un mes, Apple incluye en la lista negra el complemento Java Web" . Ars Technica . Consultado el 18 de febrero de 2014 .
  24. Goodin, Dan (2 de febrero de 2013). "Twitter detecta y detiene un ataque informático en curso para robar datos de contraseñas" . Ars Technica . Consultado el 18 de febrero de 2014 .
  25. Gallagher, Sean (15 de febrero de 2013). "Computadoras de Facebook comprometidas por una vulnerabilidad Java de día cero" . Ars Technica . Consultado el 18 de febrero de 2014 .
  26. Cheng, Jacqui (19 de febrero de 2013). "La sede de Apple también es blanco de hackers y lanzará una herramienta para proteger a sus clientes" . Ars Technica . Consultado el 18 de febrero de 2014 .
  27. Gallagher, Sean (19 de febrero de 2013). "Facebook, Twitter y el hackeo de Apple surgieron del foro de desarrolladores de iPhone" . Ars Technica . Recuperado el 18 de febrero de 2014 .
  28. Cheng, Jacqui (20 de febrero de 2013). "El sitio de desarrollo detrás de los hackeos de Apple y Facebook no sabía que estaba plagado de trampas" . Ars Technica . Recuperado el 18 de febrero de 2014 .
  29. Bright, Peter (22 de febrero de 2013). "Microsoft se une a Apple, Facebook y Twitter; se declara víctima de un ataque informático" . Ars Technica . Consultado el 18 de febrero de 2014 .
  30. Brodkin, Jon (25 de febrero de 2013). "Los últimos problemas de seguridad de Java: se identifica una nueva vulnerabilidad y se ataca una antigua" . Ars Technica . Consultado el 18 de febrero de 2014 .
  31. Goodin, Dan (1 de marzo de 2013). "Otro exploit de día cero de Java en circulación atacando activamente objetivos" . Ars Technica . Consultado el 18 de febrero de 2014 .
  32. Mattise, Nathan (5 de marzo de 2013). "Oracle lanza un nuevo parche de Java para solucionar el problema de McRat de esta semana" . Ars Technica . Consultado el 18 de febrero de 2014 .
  • Seguridad de Java SE . Oracle Corporation. Descargado el 24 de abril de 2013.
  • Directrices de codificación segura para el lenguaje de programación Java . Oracle Corporation. Descargado el 24 de abril de 2013.
  • Cómo ayuda el administrador de seguridad a ejecutar con el principio de mínimo privilegio .