SV.PERMS.HOME

正しいパーミッションを設定せずにユーザーのホームディレクトリに作成されるファイル

正しいパーミッションを設定せずにユーザーのホームディレクトリに新しいファイルまたはディレクトリが作成されると、Klocwork は SV.PERMS.HOME の欠陥を報告します。

脆弱性とリスク

マルチユーザーのシステム上のファイルは一般に、特定のユーザーが所有します。ファイルの所有者は、システム上の他のどのユーザーがこれらのファイルの内容にアクセス可能であるかを指定できます。必要以上に広い範囲のアクターにアクセスできるようにするパーミッションがリソースに設定されると、故意ではない関係者により、機密情報が公開されるか、ユーザーのホームディレクトリ内のファイルやフォルダーなどのリソースが変更される可能性があります。

軽減と防止

次の方法を使用してパーミッションを設定することで、この指摘を防ぐことができます。
  • setReadable (ブール値読み取り可能、ブール値所有者専用)
  • setWritable (ブール値作成可能、ブール値所有者専用)
  • setExecutable (ブール値実行可能、ブール値所有者専用)

詳細については、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){
     }
    }
  }

この例では、ファイル "user.txt" が正しいパーミッションを設定せずにユーザーのホームディレクトリ "/home/ubuntu" に作成されるため、Klocwork は SV.PERMS.HOME の欠陥を報告します。

修正コード例 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){
     }
   }
  }

この例では、6 行目でファイルのパーミッションが "setWriteable" によって設定されていたため、Klocwork は欠陥をもはや報告していません。

脆弱コード例 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);
    }
  }

ファイル posix-file.txt が正しいパーミッションを設定せずに 7 行目でユーザーのホームディレクトリ "/home/ubuntu" に作成されているため、Klocwork は SV.PERMS.HOME の欠陥を報告します。

修正コード例 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);
    }
 } 

この例では、java.nio.file.attribute.PosixFileAttributes がファイルパーミッションの設定を担当しているため、Klocwork は欠陥をもはや報告していません。

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。