<AWT Dev> Bug in AWT's image-loading Security checking?

Clemens Eisserer linuxhippy at gmail.com
Wed Nov 7 11:13:12 PST 2007


Hi again,

I played a bit with JDK's source and researched a bit and I think I
was able to nail down the problem.

1.) The URL which refers to my image is redirected, the
redirection-logic is in URLImageSource.getDecoder
The original URL is: http://juibrowser.sf.net/imgs/1.png
The redirected URL is: http://juibrowser.sourceforge.net/imgs/1.png

2.) The ImageConsumerQueue associated with my
Image/ImageRepresentation does not have a securityContext set.

3.) When calling InputStreamImageSource.setDecoder, it loops over all
consumers in that queue calling checkSecurity.
If the image-url is not redirected this call does nothing, because
there's a check in URLImageSource.checkSecurity wether the URL was
redirected. (It only needs to be checked twice when the original URL
was redirected to another one). Thats why it works for not-redirected
images.

For redirected images this calls SecurityManager.checkConnect with
context=null, which accordingly to Securitymanager's source immediatly
leads to a SecurityException.

So there are two possible solutions/problems:

1.) Modify the call to checkConnect in checkSecurity, to not specify a
Security-Context if context=null. I don't know wether this could lead
to security problems. I guess it would use the default context instead
a specified one - could this be problematic?

URLImageSource.checkSecurity:
SecurityManager security = System.getSecurityManager();
if (security != null)
{
   if(context != null)
   {
        security.checkConnect(actualHost, actualPort, context);
    }else
   {
        security.checkConnect(actualHost, actualPort);
   }
}

2.) Check why the context of the ImageConsumerQueue is null - is that
a valid configuration?

It would be great if somebody could loose some words about how this is
expected to work and wether solution 1.) could cause problems.

lg Clemens

PS: Another potential "problem" I found is:
When the URL is redirected, the new port and the new hostname is
queried. However if somebody does not specify a port in the URL the
call to URL.getPort() returns -1, although the user ment port 80.

However later in checkSecurity the port-value is passed to the
SecurityManager - and its still -1 instead of 80. Worse the
SecurityManager handle's ports with -1 with a special case accordin to
javadoc:
> This method calls checkPermission with the
> SocketPermission(host+":"+port,"connect") permission if the port is not equal to -1.
> If the port is equal to -1, then it calls checkPermission with the
> SocketPermission(host,"resolve") permission.

At least as far as I can see the code does not anymore do for whats
intended. Could that be a problem?



More information about the awt-dev mailing list