SV.PERMS.HOME

在未设置正确权限的情况下在用户主目录中创建文件

在未设置正确权限的情况下在用户主目录中创建新文件或目录时,Klocwork 会报告 SV.PERMS.HOME 缺陷。

漏洞与风险

多用户系统上的文件通常由某个特定用户拥有。文件的所有者可指定应允许系统上的哪些其他用户访问这些文件的内容。如果给资源赋予的权限设置可以提供超出所需参与者范围的访问权限,则可能会导致敏感信息暴露或资源遭到修改,例如用户主目录中的文件或文件夹被非预期方修改。

缓解与预防

如果使用以下方法来设置权限,则可防止此问题:
  • setReadable(boolean readable, boolean ownerOnly)
  • setWritable(boolean writable, boolean ownerOnly)
  • setExecutable(boolean executable, boolean ownerOnly)

有关详细信息,请参阅 https://docs.oracle.com/javase/7/docs/api/java/io/File.html。或者,Java SE 7 具有 java.nio.file.attribute.PosixFileAttributes,可以提供对所有者、组和其他用户的读取、写入和执行权限的精细控制。有关详细信息,请参阅 https://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html

漏洞代码示例 1

复制
   import java.io.*;
   class FileUserDir{
    public static void main(String args[]){
     try{
      File file = new File("/home/ubuntu/test/user.txt");
      file.createNewFile();
      } catch(IOException e){
     }
    }
  }

在此示例中,Klocwork 会报告 SV.PERMS.HOME 缺陷,因为在未设置正确权限的情况下在用户主目录 /home/ubuntu 中创建了文件 user.txt。

修正代码示例 1

复制
   import java.io.*;
   class FileUserDir{
    public static void main(String args[]){
     try{
      File file = new File("/home/ubuntu/test/user.txt");
      file.setWritable(true, true);
      file.createNewFile();
     } catch(IOException e){
     }
   }
  }

在此示例中,Klocwork 不再报告缺陷,因为在第 6 行通过 setWriteable 设置了文件权限。

漏洞代码示例 2

复制
   import java.nio.file.*;
   import java.nio.file.attribute.*;
   import java.util.Set;
   import java.io.*;
   public class FilePosix {
    public static void main(String[] args) throws IOException {
     Path path = Paths.get("/home/ubuntu/test/posix-file.txt");
     if (!Files.exists(path)) Files.createFile(path);
    }
  }

Klocwork 报告 SV.PERMS.HOME 缺陷,因为在未设置正确权限的情况下在第 7 行的用户主目录 /home/ubuntu 中创建了文件 posix-file.txt。

修正代码示例 2

复制
 import java.nio.file.*;
 import java.nio.file.attribute.*;
 import java.util.Set;
 import java.io.*;
 public class FilePosix{
     public static void main(String[] args) throws IOException {
         Path path = Paths.get(System.getProperty("user.home") + File.separator + "test.file");
         Set<PosixFilePermission> perms = Files.readAttributes(path,PosixFileAttributes.class).permissions();
         perms.add(PosixFilePermission.OWNER_WRITE);
        perms.add(PosixFilePermission.OWNER_READ);
        perms.add(PosixFilePermission.OWNER_EXECUTE);
        Files.setPosixFilePermissions(path, perms);
        if (!Files.exists(path)) Files.createFile(path);
    }
 } 

在此示例中,Klocwork 不再报告缺陷,因为 java.nio.file.attribute.PosixFileAttributes 负责设置文件权限。

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。