[ 
https://issues.apache.org/jira/browse/AMBARI-17962?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Robert Levas updated AMBARI-17962:
----------------------------------
    Resolution: Fixed
        Status: Resolved  (was: Patch Available)

Committed to trunk
{noformat}
commit 111b7e54b1911312209487ecc55fb40fb6255065
Author: Robert Levas <[email protected]>
Date:   Mon Aug 1 14:18:12 2016 -0400
{noformat}

Committed to branch-2.4
{noformat}
commit 433698901b64e272f7551054ac3dba356f632a2a
Author: Robert Levas <[email protected]>
Date:   Mon Aug 1 14:19:02 2016 -0400
{noformat}


> Coverity Scan Security Vulnerability - SQL injection
> ----------------------------------------------------
>
>                 Key: AMBARI-17962
>                 URL: https://issues.apache.org/jira/browse/AMBARI-17962
>             Project: Ambari
>          Issue Type: Bug
>          Components: ambari-server
>    Affects Versions: 1.2.0
>            Reporter: Robert Levas
>            Assignee: Robert Levas
>            Priority: Critical
>              Labels: coverity, security
>             Fix For: 2.4.0
>
>         Attachments: AMBARI-17962_branch-2.4_01.patch, 
> AMBARI-17962_trunk_01.patch
>
>
> The Ambari coverity scan found two "High impact security" issues, both SQL 
> Injections.  They are both the same coding issue, but one is in 
> OracleConnector.java, and one is in the analogous method in 
> PostgresConnector.java.
> This is the key description:
> {quote}
>  CID 167755 (#1 of 1): SQL injection (SQLI)9. sql_taint: Insecure 
> concatenation of a SQL statement. The value searchClause is tainted.
> Perform one of the following to guard against SQL injection attacks.
> * Parameterize the SQL statement using ? positional characters. Bind the 
> tainted values to the ? positional parameters using one of the 
> PreparedStatement.set* methods.
> * Validate user-supplied values against predefined constant values. 
> Concatenate these constant values into the SQL statement.
> * Cast tainted values to safe types such as integers. Concatenate these type 
> safe values into the statement.
> [More 
> Information|https://scan3.coverity.com/doc/en/cov_checker_ref.html#id_sql_generic]
> {quote}
> This is the one in OracleConnector.java, lines 32 -55:
> {code}
> 32  @Override
>   8. taint_path_param: Parameter searchClause receives the tainted data.
> 33  protected PreparedStatement getQualifiedPS(Statements statement, String 
> searchClause, Workflows.WorkflowDBEntry.WorkflowFields field, boolean 
> sortAscending, int offset, int limit) throws IOException {
> 34    if (db == null)
> 35      throw new IOException("db not initialized");
> 36
> 37    String order = " ORDER BY " + field.toString() + " " + (sortAscending ? 
> SORT_ASC : SORT_DESC);
> 38
> 39    String query = "select * \n" +
> 40        "  from ( select " +
> 41//        "/*+ FIRST_ROWS(n) */ \n" +
> 42        "  a.*, ROWNUM rnum \n" +
> 43        "      from ("
>   CID 167755 (#1 of 1): SQL injection (SQLI)9. sql_taint: Insecure 
> concatenation of a SQL statement. The value searchClause is tainted.
>   Perform one of the following to guard against SQL injection attacks.
>     Parameterize the SQL statement using ? positional characters. Bind the 
> tainted values to the ? positional parameters using one of the 
> PreparedStatement.set* methods.
>     Validate user-supplied values against predefined constant values. 
> Concatenate these constant values into the SQL statement.
>     Cast tainted values to safe types such as integers. Concatenate these 
> type safe values into the statement.
> More Information
> 44        + statement.getStatementString() + searchClause + order +
> 45        ") a \n" +
> 46        "      where ROWNUM <= " + (offset + limit) + ") \n" +
> 47        "where rnum  >= " + offset;
> 48
> 49    try {
>   10. sql_sink: Passing the tainted value query to the SQL API 
> java.sql.Connection.prepareStatement(java.lang.String) may allow an attacker 
> to inject SQL.
> 50      return db.prepareStatement(query);
> 51    } catch (SQLException e) {
> 52      throw new IOException(e);
> 53    }
> 54
> 55  }
> {code}
> This is the one in PostgresConnector.java, lines 495-504:
> {code}
>  
>    8. taint_path_param: Parameter searchClause receives the tainted data.
> 495  protected PreparedStatement getQualifiedPS(Statements statement, String 
> searchClause) throws IOException {
> 496    if (db == null)
> 497      throw new IOException("postgres db not initialized");
> 498    try {
> 499      // LOG.debug("preparing " + statement.getStatementString() + 
> searchClause);
>    CID 167743 (#1 of 1): SQL injection (SQLI)9. sql_taint: Insecure 
> concatenation of a SQL statement. The value searchClause is tainted. Passing 
> the tainted command to the SQL API 
> java.sql.Connection.prepareStatement(java.lang.String) may allow an attacker 
> to inject SQL.
>    Perform one of the following to guard against SQL injection attacks.
>     Parameterize the SQL statement using ? positional characters. Bind the 
> tainted values to the ? positional parameters using one of the 
> PreparedStatement.set* methods.
>     Validate user-supplied values against predefined constant values. 
> Concatenate these constant values into the SQL statement.
>     Cast tainted values to safe types such as integers. Concatenate these 
> type safe values into the statement.
> More Information
> 500      return db.prepareStatement(statement.getStatementString() + 
> searchClause);
> 501    } catch (SQLException e) {
> 502      throw new IOException(e);
> 503    }
> 504  }
> {code}
> *Solution*
> Remove code supporting an unsupported REST API call to obtain jobtracker 
> information.  his entry point is handled by 
> {{org.apache.ambari.eventdb.webservice.WorkflowJsonService}}.  By removing 
> this class and cleaning up orphaned code, the SQL injection issue list above 
> will be solved. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to