# MLS override can't be used to access private app data.

# Apps should not normally be mlstrustedsubject, but if they must be
# they cannot use this to access app private data files; their own app
# data files must use a different label.

neverallow {
  mlstrustedsubject
  -artd # compile secondary dex files
  -installd
} {
  app_data_file
  privapp_data_file
  is_flag_enabled(RELEASE_UNLOCKED_STORAGE_API, `storage_area_content_file')
}:file ~{ read write map getattr ioctl lock append };

neverallow {
  mlstrustedsubject
  -artd # compile secondary dex files
  -installd
} {
  app_data_file
  privapp_data_file
  is_flag_enabled(RELEASE_UNLOCKED_STORAGE_API, `storage_area_content_file')
}:dir ~{ read getattr search };

is_flag_enabled(RELEASE_UNLOCKED_STORAGE_API, `
  neverallow {
    mlstrustedsubject
    -artd # compile secondary dex files
    -installd
    -vold # encryption of storage areas
    -vold_prepare_subdirs # creation of storage area directories
  } { storage_area_dir storage_area_app_dir }:dir ~{ read getattr search };
')

neverallow {
  mlstrustedsubject
  -artd # compile secondary dex files
  -installd
  -system_server
  -adbd
  -runas
  -zygote
} {
  app_data_file
  privapp_data_file
  is_flag_enabled(RELEASE_UNLOCKED_STORAGE_API, `storage_area_content_file')
}:dir { read getattr search };

is_flag_enabled(RELEASE_UNLOCKED_STORAGE_API, `
  neverallow {
    mlstrustedsubject
    -artd # compile secondary dex files
    -installd
    -system_server
    -adbd
    -runas
    -vold # encryption of storage area directories
    -vold_prepare_subdirs # creation of storage area directories
    -zygote
  } { storage_area_dir storage_area_app_dir }:dir { read getattr search };
')
