Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Defining a wrapper method facilitates installing appropriate security manager checks, validating arguments passed to native code, validating return values, defensively copying mutable inputs, and sanitizing untrusted data. Consequently, every native method must be private and must be invoked only by a wrapper method.

...

In this noncompliant code example, the nativeOperation() method is both native and public; thereforeconsequently, untrusted callers may invoke it. Native method invocations bypass security manager checks.

...

Code Block
bgColor#FFcccc
public final class NativeMethod {

  // publicPublic native method
  public native void nativeOperation(byte[] data, int offset, int len);

  // wrapperWrapper method that lacks security checks and input validation
  public void doOperation(byte[] data, int offset, int len) {
    nativeOperation(data, offset, len);
  }
  
  static {
    // loadLoad native library in static initializer of class
    System.loadLibrary("NativeMethodLib"); 
  }
}

...

Code Block
bgColor#ccccff
public final class NativeMethodWrapper {

  // privatePrivate native method
  private native void nativeOperation(byte[] data, int offset, int len);

  // wrapperWrapper method performs SecurityManager and input validation checks
  public void doOperation(byte[] data, int offset, int len) {
    // permissionPermission needed to invoke native method
    securityManagerCheck();

    if (data == null) {
      throw new NullPointerException();
    }

    // copyCopy mutable input
    data = data.clone();

    // validateValidate input
    if ((offset < 0) || (len < 0) || (offset > (data.length - len))) {
      throw new IllegalArgumentException();
    }

    nativeOperation(data, offset, len);
  }

  static {
    // loadLoad native library in static initializer of class
    System.loadLibrary("NativeMethodLib"); 
  }
}

...

Failure to define wrappers around native methods can allow unprivileged callers to invoke them and exploit inherent vulnerabilities such as buffer overflows in native libraries.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

JNI00-J

mediumMedium

probableProbable

highHigh

P4

L3

Automated Detection

Automated detection is not feasible in the fully general case. However, an approach similar to Design Fragments [Fairbanks 2007] could assist both programmers and static analysis tools.

Related Guidelines

MITRE CWE

CWE-111. , Direct use Use of unsafe Unsafe JNI

Secure Coding Guidelines for the Java Programming LanguageSE, Version 45.0

Guideline 5-3 . / INPUT-3: Define wrappers around native methods

...

[Fairbanks 2007]

 

[JNI 2006]

 

[Liang 1997]

 

[Macgregor 1998]

Section 2.2.3, "Interfaces and Architectures"

 

...