The buffer classes (Buffer classes defined in the java.nio package, such as IntBuffer, CharBuffer, and ByteBuffer) defined in the java.nio package define wrap() methods, varying in parameters. The wrap() , define a variety of methods that wrap an array (or a portion of the array) of the corresponding primitive data type into a buffer and return the buffer as a Buffer object. Although these methods create a new Buffer object, however, the elements continue to persist in the backing array from which the buffer was created. If the buffer is altered by untrusted code, the backing array is maliciously modified. Likewise, the duplicate() method allows the creation of copies of the buffer but a caller may indirectly alter the contents of the backing array.
...
the new Buffer is backed by the given input array. According to the Java API for these methods [API 2014],
The new buffer will be backed by the given character array; that is, modifications to the buffer will cause the array to be modified and vice versa.
Exposing these buffers to untrusted code exposes the backing array of the original buffer to malicious modification. Likewise, the duplicate(), array(), slice(), and subsequence() methods create additional buffers that are backed by the original buffer's backing array; exposing such additional buffers to untrusted code affords the same opportunity for malicious modification.
This rule is an instance of OBJ06-J. Defensively copy mutable inputs and mutable internal components.
Noncompliant Code Example (wrap())
This noncompliant code example declares a char array and allows untrusted code to obtain a copy using , wraps it within a CharBuffer, and exposes that CharBuffer to untrusted code via the getBufferCopy() method:
| Code Block | ||
|---|---|---|
| ||
final class Wrap { private char[] dataArray; public Wrap() { dataArray = new char[10]; // Initialize } public CharBuffer getBufferCopy() { return CharBuffer.wrap(dataArray); } } |
Compliant Solution (asReadOnlyBuffer())
This compliant solution returns a read-only view of the char array in the form of a read-only CharBuffer. The standard library implementation of CharBuffer guarantees that attempts to modify the elements of a read-only CharBuffer will result in a java.nio.ReadOnlyBufferException The return value of this method is required to be of type CharBuffer.
| Code Block | ||
|---|---|---|
| ||
final class Wrap { private char[] dataArray; public Wrap () { dataArray = new char[10]; // initializeInitialize } public CharBuffer getBufferCopy() { return CharBuffer.wrap(dataArray).asReadOnlyBuffer(); } } |
Noncompliant Code Example
Compliant Solution (Copy)
This compliant solution allocates a new CharBuffer and explicitly copies the contents This noncompliant code example uses the duplicate() method to create and return a copy of the char array . The returned buffer allows the caller to indirectly modify the elements of the arrayinto it before returning the copy. Consequently, malicious callers can modify the copy of the array but cannot modify the original.
| Code Block | ||
|---|---|---|
| ||
final class Wrap { private char[] dataArray; public Wrap () { dataArray = new char[10]; // initializeInitialize } public CharBuffer getBufferCopy() { CharBuffer cb = CharBuffer.allocate(10dataArray.length); return cb.duplicateput(dataArray); return cb; } } |
Compliant Solution
Noncompliant Code Example (duplicate())
This noncompliant code example invokes the duplicate() method to create and return a copy of the CharBuffer. As stated in the contract for the duplicate() method, the returned buffer is backed by the same array as is the original buffer. Consequently, if a caller were This compliant solution returns a read-only view of the char array, in the form of a CharBuffer. Attempts to modify the elements of the CharBuffer result in a java.nio.ReadOnlyBufferException.the backing array, these modifications would also affect the original buffer.
| Code Block | ||
|---|---|---|
| ||
final class WrapDup { private char[] dataArrayCharBuffer cb; Wrappublic Dup() { dataArraycb = new char[10]CharBuffer.allocate(10); // initializeInitialize } public CharBuffer getBufferCopy() { return cb.duplicate(); } } |
Compliant Solution (asReadOnlyBuffer())
This compliant solution exposes a read-only view of the CharBuffer to untrusted code:
| Code Block | ||
|---|---|---|
| ||
final class Dup { CharBuffer cb; public Dup() { cb = CharBuffer.allocate(10); // Initialize } public CharBuffer getBufferCopy() { return cb.asReadOnlyBuffer(); } } |
Risk Assessment
Returning Exposing buffers created using the wrap(), duplicate(), array(), slice(), or duplicatesubsequence() methods methods may allow an untrusted caller to alter the contents of the original data.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|
FIO05-J |
Medium |
Likely |
Low | P18 | L1 |
Automated Detection
...
TODO
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
References
| Wiki Markup |
|---|
\[[API 06|AA. Java References#API 06]\] class {{CharBuffer}}
\[[Hitchens 02|AA. Java References#Hitchens 02]\] 2.3 Duplicating Buffers |
Sound automated detection of this vulnerability is not feasible. Heuristic approaches may be useful.
| Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Parasoft Jtest |
| CERT.FIO05.BUFEXP | Do not expose data wrapped by a buffer to untrusted code | ||||||
| SpotBugs |
| MS_EXPOSE_BUF | Implemented (since 4.3.0) |
Bibliography
[API 2014] | |
Section 2.3 "Duplicating Buffers" |
...
FIO36-J. Do not create multiple buffered wrappers on an InputStream 08. Input Output (FIO) 08. Input Output (FIO)