Mercurial > hg > release > icedtea6-1.7
changeset 1955:b3f4988afff9
Fix issue that allowed unsigned applications to modify system properties.
author | Deepak Bhole <dbhole@redhat.com> |
---|---|
date | Wed, 21 Jul 2010 18:40:30 -0400 |
parents | 7763083fc25d |
children | 6b9ccc0f74d2 |
files | ChangeLog rt/net/sourceforge/jnlp/SecurityDesc.java rt/net/sourceforge/jnlp/runtime/ApplicationInstance.java rt/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java |
diffstat | 4 files changed, 77 insertions(+), 83 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Mon Jul 26 20:51:29 2010 +0100 +++ b/ChangeLog Wed Jul 21 18:40:30 2010 -0400 @@ -1,3 +1,18 @@ +2010-07-21 Deepak Bhole <dbhole@redhat.com> + + * rt/net/sourceforge/jnlp/SecurityDesc.java: Converge all property + permission settings info a single class. + (getPermissions): Do not give read/write permissions to anything other + than what is allowed by spec. + (getSandBoxPermissions): Same. + * rt/net/sourceforge/jnlp/runtime/ApplicationInstance.java: Remove + blanket imports. + (installEnvironment): Write properties in a restricted + AccessControlContext based on app specific permissions only. + * rt/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java + (checkPermission): Remove all property permission decision making code + and collapse it all into SecurityDesc.java. + 2010-07-26 Andrew John Hughes <ahughes@redhat.com> * NEWS: Fix position of policy evaluation fix
--- a/rt/net/sourceforge/jnlp/SecurityDesc.java Mon Jul 26 20:51:29 2010 +0100 +++ b/rt/net/sourceforge/jnlp/SecurityDesc.java Wed Jul 21 18:40:30 2010 -0400 @@ -53,6 +53,11 @@ /** the JNLP file */ private JNLPFile file; + // We go by the rules here: + // http://java.sun.com/docs/books/tutorial/deployment/doingMoreWithRIA/properties.html + + // Since this is security sensitive, take a conservative approach: + // Allow only what is specifically allowed, and deny everything else /** basic permissions for restricted mode */ private static Permission j2eePermissions[] = { @@ -95,6 +100,9 @@ new PropertyPermission("java.vm.vendor", "read"), new PropertyPermission("java.vm.name", "read"), new PropertyPermission("javawebstart.version", "read"), + new PropertyPermission("javaplugin.*", "read"), + new PropertyPermission("jnlp.*", "read,write"), + new PropertyPermission("javaws.*", "read,write"), new RuntimePermission("exitVM"), new RuntimePermission("stopThread"), new AWTPermission("showWindowWithoutWarningBanner"), @@ -105,6 +113,26 @@ // new AWTPermission("accessEventQueue"), }; + /** basic permissions for restricted mode */ + private static Permission jnlpRIAPermissions[] = { + new PropertyPermission("awt.useSystemAAFontSettings", "read,write"), + new PropertyPermission("http.agent", "read,write"), + new PropertyPermission("http.keepAlive", "read,write"), + new PropertyPermission("java.awt.syncLWRequests", "read,write"), + new PropertyPermission("java.awt.Window.locationByPlatform", "read,write"), + new PropertyPermission("javaws.cfg.jauthenticator", "read,write"), + new PropertyPermission("javax.swing.defaultlf", "read,write"), + new PropertyPermission("sun.awt.noerasebackground", "read,write"), + new PropertyPermission("sun.awt.erasebackgroundonresize", "read,write"), + new PropertyPermission("sun.java2d.d3d", "read,write"), + new PropertyPermission("sun.java2d.dpiaware", "read,write"), + new PropertyPermission("sun.java2d.noddraw", "read,write"), + new PropertyPermission("sun.java2d.opengl", "read,write"), + new PropertyPermission("swing.boldMetal", "read,write"), + new PropertyPermission("swing.metalTheme", "read,write"), + new PropertyPermission("swing.noxp", "read,write"), + new PropertyPermission("swing.useSystemFontSettings", "read,write"), + }; /** * Create a security descriptor. @@ -155,12 +183,9 @@ for (int i=0; i < j2eePermissions.length; i++) permissions.add(j2eePermissions[i]); - // properties - PropertyDesc props[] = file.getResources().getProperties(); - for (int i=0; i < props.length; i++) { - // should only allow jnlp.* properties if in sandbox? - permissions.add(new PropertyPermission(props[i].getKey(), "read,write")); - } + if (file.isApplication()) + for (int i=0; i < jnlpRIAPermissions.length; i++) + permissions.add(jnlpRIAPermissions[i]); return permissions; } @@ -175,17 +200,14 @@ for (int i=0; i < sandboxPermissions.length; i++) permissions.add(sandboxPermissions[i]); + if (file.isApplication()) + for (int i=0; i < jnlpRIAPermissions.length; i++) + permissions.add(jnlpRIAPermissions[i]); + if (downloadHost != null) permissions.add(new SocketPermission(downloadHost, "connect, accept")); - // properties - PropertyDesc props[] = file.getResources().getProperties(); - for (int i=0; i < props.length; i++) { - // should only allow jnlp.* properties if in sandbox? - permissions.add(new PropertyPermission(props[i].getKey(), "read,write")); - } - return permissions; }
--- a/rt/net/sourceforge/jnlp/runtime/ApplicationInstance.java Mon Jul 26 20:51:29 2010 +0100 +++ b/rt/net/sourceforge/jnlp/runtime/ApplicationInstance.java Wed Jul 21 18:40:30 2010 -0400 @@ -17,17 +17,26 @@ package net.sourceforge.jnlp.runtime; -import java.awt.*; -import java.util.*; -import java.util.List; -import java.security.*; +import java.awt.Window; +import java.net.URL; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.CodeSource; +import java.security.PrivilegedAction; +import java.security.ProtectionDomain; + import javax.swing.event.EventListenerList; -import net.sourceforge.jnlp.*; -import net.sourceforge.jnlp.event.*; +import net.sourceforge.jnlp.JNLPFile; +import net.sourceforge.jnlp.PropertyDesc; +import net.sourceforge.jnlp.SecurityDesc; +import net.sourceforge.jnlp.ShortcutDesc; +import net.sourceforge.jnlp.event.ApplicationEvent; +import net.sourceforge.jnlp.event.ApplicationListener; import net.sourceforge.jnlp.security.SecurityWarningDialog.AccessType; import net.sourceforge.jnlp.services.ServiceUtil; -import net.sourceforge.jnlp.util.*; +import net.sourceforge.jnlp.util.WeakList; +import net.sourceforge.jnlp.util.XDesktopEntry; /** * Represents a running instance of an application described in a @@ -159,6 +168,16 @@ */ void installEnvironment() { final PropertyDesc props[] = file.getResources().getProperties(); + + CodeSource cs = new CodeSource((URL) null, (java.security.cert.Certificate [])null); + + JNLPClassLoader loader = (JNLPClassLoader) this.loader; + SecurityDesc s = loader.getSecurity(); + + ProtectionDomain pd = new ProtectionDomain(cs, s.getPermissions(), null, null); + + // Add to hashmap + AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] {pd}); PrivilegedAction installProps = new PrivilegedAction() { public Object run() { @@ -169,7 +188,7 @@ return null; } }; - AccessController.doPrivileged(installProps); + AccessController.doPrivileged(installProps, acc); } /**
--- a/rt/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java Mon Jul 26 20:51:29 2010 +0100 +++ b/rt/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java Wed Jul 21 18:40:30 2010 -0400 @@ -335,68 +335,6 @@ } } - } else if (perm instanceof PropertyPermission) { - - if (JNLPRuntime.isDebug()) - System.err.println("Requesting property: " + perm.toString()); - - // We go by the rules here: - // http://java.sun.com/docs/books/tutorial/deployment/doingMoreWithRIA/properties.html - - // Since this is security sensitive, take a conservative approach: - // Allow only what is specifically allowed, and deny everything else - - // First, allow what everyone is allowed to read - if (perm.getActions().equals("read")) { - if ( perm.getName().equals("java.class.version") || - perm.getName().equals("java.vendor") || - perm.getName().equals("java.vendor.url") || - perm.getName().equals("java.version") || - perm.getName().equals("os.name") || - perm.getName().equals("os.arch") || - perm.getName().equals("os.version") || - perm.getName().equals("file.separator") || - perm.getName().equals("path.separator") || - perm.getName().equals("line.separator") || - perm.getName().startsWith("javaplugin.") - ) { - return; - } - } - - // Next, allow what only JNLP apps can do - if (getApplication().getJNLPFile().isApplication()) { - if ( perm.getName().equals("awt.useSystemAAFontSettings") || - perm.getName().equals("http.agent") || - perm.getName().equals("http.keepAlive") || - perm.getName().equals("java.awt.syncLWRequests") || - perm.getName().equals("java.awt.Window.locationByPlatform") || - perm.getName().equals("javaws.cfg.jauthenticator") || - perm.getName().equals("javax.swing.defaultlf") || - perm.getName().equals("sun.awt.noerasebackground") || - perm.getName().equals("sun.awt.erasebackgroundonresize") || - perm.getName().equals("sun.java2d.d3d") || - perm.getName().equals("sun.java2d.dpiaware") || - perm.getName().equals("sun.java2d.noddraw") || - perm.getName().equals("sun.java2d.opengl") || - perm.getName().equals("swing.boldMetal") || - perm.getName().equals("swing.metalTheme") || - perm.getName().equals("swing.noxp") || - perm.getName().equals("swing.useSystemFontSettings") - ) { - return; // JNLP apps can read and write to these - } - } - - // Next, allow access to customizable properties - if (perm.getName().startsWith("jnlp.") || - perm.getName().startsWith("javaws.")) { - return; - } - - // Everything else is denied - throw se; - } else if (perm instanceof SecurityPermission) { // JCE's initialization requires putProviderProperty permission