[FileSystem] Fix open file mode security issue 08/181408/2
authorRafal Walczyna <r.walczyna@partner.samsung.com>
Wed, 13 Jun 2018 10:28:41 +0000 (12:28 +0200)
committerRafal Walczyna <r.walczyna@partner.samsung.com>
Wed, 13 Jun 2018 13:58:33 +0000 (15:58 +0200)
[Bug] Privileges could be ommited by overriding JS function what
leads to unauthorized access to files.

[Verification] TCT 100% pass

SATIZENVUL-1461

Change-Id: I801096bacd4447f915588f07a4a96bc8c147fd1e
Signed-off-by: Rafal Walczyna <r.walczyna@partner.samsung.com>
src/filesystem/filesystem_instance.cc

index 733d75d33f7a700016b6b9bf72470d9f6014ee03..4aa6f579bf70202a50d810b7da4aceb856595f7b 100644 (file)
@@ -59,14 +59,14 @@ bool WriteAccessRequested(const picojson::value& args) {
   ScopeLogger();
   const std::string& open_mode = args.get("openMode").get<std::string>();
 
-  return std::string::npos != open_mode.find("w") || "a" == open_mode;
+  return "a" == open_mode || "rw" == open_mode || "rwo" == open_mode || "w" == open_mode;
 }
 
 bool ReadAccessRequested(const picojson::value& args) {
   ScopeLogger();
   const std::string& open_mode = args.get("openMode").get<std::string>();
 
-  return std::string::npos != open_mode.find("r");
+  return "r" == open_mode || "rw" == open_mode || "rwo" == open_mode;
 }
 
 bool ShouldMakeParents(const picojson::value& args) {
@@ -1279,12 +1279,25 @@ void FilesystemInstance::FileSystemManagerOpenFile(const picojson::value& args,
     return;
   }
 
+  bool access_checked = false;
   if (WriteAccessRequested(args)) {
     CHECK_PRIVILEGE_ACCESS(kPrivilegeFilesystemWrite, &out);
+    access_checked = true;
   }
 
   if (ReadAccessRequested(args)) {
     CHECK_PRIVILEGE_ACCESS(kPrivilegeFilesystemRead, &out);
+    access_checked = true;
+  }
+
+  // File open mode received from JS layer can be different than expected by
+  // WriteAccessRequested and ReadAccessRequested functions. In case like that
+  // privilege would not be checked and user could gain unauthorized access to file.
+  // To prevent this situation we only accept specific open modes.
+  if (false == access_checked) {
+    const std::string& open_mode = args.get("openMode").get<std::string>();
+    LogAndReportError(TypeMismatchException("Invalid open mode: " + open_mode), out);
+    return;
   }
 
   const std::string& path = args.get("path").get<std::string>();