Versions Compared

Key

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

...

Comparing multiple attributes of the file increases the likelihood that the reopened file is the same file that had been was previously operated on.

File identification is less of an issue if applications maintain their files in secure directories, where they can only be accessed by the owner of the file and (possibly) by a system administrator.

...

That is, isSameFile() may simply check that the paths to the two files are the same.

Compliant Solution (

...

Multiple Attributes)

This compliant solution checks the creation and last modified times of the files to ensure that the file opened for reading is the same file as the file that was written.

Code Block
bgColor#ccccff
//Identify a file by its path
String filename = "...";

Path file1 = Paths.get(filename);

// Open the file for writing
BufferedWriter bw = new BufferedWriter(
  new OutputStreamWriter(Files.newOutputStream(file1)));

bw.write(...);

// Close the file
bw.close();

/*
 * A race condition here allows for an attacker to switch
 * out the file for another
 */

// Reopen the file for reading
Path file2 = Paths.get(filename);

BasicFileAttributes attr1 = Files.readAttributes(file1, BasicFileAttributes.class);

BasicFileAttributes attr2 = Files.readAttributes(file2, BasicFileAttributes.class);

FileTime creation1 = attr1.creationTime();
FileTime modified1 = attr1.lastModifiedTime();

FileTime creation2 = attr2.creationTime();
FileTime modified2 = attr2.lastModifiedTime();

if ( (!creation1.equals(creation2)) || (!modified1.equals(modified2)) ) {
  System.out.println("File tampered with");
  // Deal with error
}

BufferedReader br = new BufferedReader(
  new InputStreamReader(Files.newInputStream(file2)));

String line;

while ((line = br.readLine()) != null) {
    System.out.println(line);
}

// Close the file
br.close();

Although this solution is reasonably secure, a determined attacker could create a symbolic link with the same creation and last-modified times as the original file.

Compliant Solution (POSIX fileKey

...

Attribute)

In environments that support the fileKey attribute, a more reliable approach is to check that the fileKey attributes of the two files are the same, as shown in this compliant solution.

...

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="dea42864b93a0e18-dc3cc313-44cf4bc0-b644943e-5e7a1735311fbebb03e11732"><ac:plain-text-body><![CDATA[

[[API 2011

AA. References#API 11]]

[Class File

http://download.oracle.com/javase/7/docs/api/java/io/File.html], [Interface Path

http://download.oracle.com/javase/7/docs/api/java/nio/file/Path.html], [Class Files

http://download.oracle.com/javase/7/docs/api/java/nio/file/Files.html], [Interface BasicFileAttributes

http://download.oracle.com/javase/7/docs/api/java/nio/file/attribute/BasicFileAttributes.html]

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