[ 
https://issues.apache.org/jira/browse/DERBY-3676?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13087790#comment-13087790
 ] 

Rick Hillegas commented on DERBY-3676:
--------------------------------------

I would like to understand the vulnerability better. I don't think that Derby 
uses (Prepared)Statement.toString() when it prints diagnostic information to 
derby.log after you set derby.language.logStatementText=true. As I understand 
the attack, the problem is with the (Prepared)Statement once it is in the 
application. In a sloppy application, (Prepared)Statements could be visible 
across threads/sessions, allowing blackhats to snoop sensitive information.

Is that the attack?

-----------------------

Here are some rambling thoughts about how to protect against this attack:

I am positive about controlling this new toString() behavior with a permission 
which would be checked when running under a Java SecurityManager as Dag 
suggests and as is done with DriverManager.setLogWriter(). See 
http://download.oracle.com/javase/7/docs/api/java/sql/DriverManager.html#setLogWriter%28java.io.PrintWriter%29
 and http://download.oracle.com/javase/7/docs/api/java/sql/SQLPermission.html

For reference: if you are running under a Java SecurityManager, the 
DriverManager.setLogWriter() method succeeds only if your security policy 
grants the "setLog" SQLPermission to your application's code domain. E.g.:

grant codeBase "file:///Applications/myApp.jar"
{
  permission java.sql.SQLPermission "setLog";
};

We could require something similar in order to protect the 
(Prepared)Statement.toString() method from abuse:

grant codeBase "file:///Applications/myApp.jar"
{
  permission java.sql.SQLPermission "com.apache.derby.client.am.Statement", 
"toString";
  permission java.sql.SQLPermission 
"com.apache.derby.impl.jdbc.EmbedStatement", "toString";
};

If the permission is granted, then the new toString() behavior would be in 
effect. Otherwise, you would get the old toString() behavior.


> Make the toString() method of Derby PreparedStatements print out SQL text 
> with ? parameters replaced by the values that have been set so far
> --------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3676
>                 URL: https://issues.apache.org/jira/browse/DERBY-3676
>             Project: Derby
>          Issue Type: Improvement
>          Components: JDBC
>            Reporter: Rick Hillegas
>            Assignee: Siddharth Srivastava
>         Attachments: humanstringprepared.txt, humanstringprepared.txt, 
> humanstringprepared.txt, humanstringprepared.txt, humanstringprepared.txt, 
> humanstringprepared.txt, humanstringprepared.txt, ick.txt, ick.txt, 
> prepared.diff, statementCacheVTI.sql
>
>
> This topic came up in the following email thread on the user list: 
> http://www.nabble.com/PreparedStatement.toString%28%29---nice-formatting-td17250811.html#a17250811
>  Here's what the thread requests: 
> "In mysql, a toString() on a PreparedStatement will do this, eg "select x
> from foo where x.a = ?" will become "select x from foo where x.a = 1" with
> the appropriate setValue() call."
> At first blush, this seems like it might be a simple project for a newcomer.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to