You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 42 Next »

Security checks based on untrusted sources can be bypassed. The untrusted object or parameter should be defensively copied before the security check is performed. The copy operation must be a deep copy; the implementation of the clone() method may produce a shallow copy, which can still be compromised. In addition, the implementation of the clone() method can be provided by the attacker. See OBJ06-J. Defensively copy mutable inputs and mutable internal components for more information.

Noncompliant Code Example (JDK 5.0 java.io.File)

This noncompliant code example describes a security vulnerability from the JDK 5.0 java.io package. In this release, java.io.File was non-final, allowing an attacker to supply an untrusted parameter constructed by extending the legitimate File class. In this manner, the getPath() method can be overridden so that the security check passes the first time it is called but the value changes the second time to refer to a sensitive file such as /etc/passwd. This is a form of time-of-check-time-of-use (TOCTOU) vulnerability.

public RandomAccessFile openFile(final java.io.File f) {
  askUserPermission(f.getPath());
  // ...
  return (RandomAccessFile)AccessController.doPrivileged() {
    public Object run() {
      return new RandomAccessFile(f.getPath());
    }
  }
}

The attacker could extend java.io.File as follows:

public class BadFile extends java.io.File {
  private int count;
  public String getPath() {
    return (++count == 1) ? "/tmp/foo" : "/etc/passwd";
  }
}

Compliant Solution (final)

This vulnerability could have been mitigated by making java.io.File final.

Compliant Solution (copy)

This compliant solution ensures that the java.io.File object can be trusted, despite not being final. The solution creates a new File object using the standard constructor. This ensures that any methods invoked on the File object are the standard library methods rather than overriding methods potentially provided by the attacker.

public RandomAccessFile openFile(java.io.File f) {
  final java.io.File copy = new java.io.File(f.getPath());
  askUserPermission(copy.getPath());
  // ...
  return (RandomAccessFile)AccessController.doPrivileged() {
    public Object run() {
      return new RandomAccessFile(copy.getPath());
    }
  }
}

Note that using the clone() method instead of the openFile() method would copy the attacker's class, which is not desirable. (Refer to rule OBJ06-J. Defensively copy mutable inputs and mutable internal components.)

Risk Assessment

Basing security checks on untrusted sources can result in the check being bypassed.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

SEC06-J

high

probable

medium

P12

L1

Automated Detection

TODO

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

Related Guidelines

MITRE CWE

CWE-302 "Authentication Bypass by Assumed-Immutable Data"

Bibliography

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="a5c5f814-c25b-4367-a116-b6a15fdf2d32"><ac:plain-text-body><![CDATA[

[[Sterbenz 2006

AA. Bibliography#Sterbenz 06]]

]]></ac:plain-text-body></ac:structured-macro>


      14. Platform Security (SEC)      SEC07-J. Call the superclass's getPermissions method when writing a custom class loader

  • No labels