Index: chrome/browser/nacl_host/nacl_browser.h |
diff --git a/chrome/browser/nacl_host/nacl_browser.h b/chrome/browser/nacl_host/nacl_browser.h |
index f3d86460119f8565c535869d6d59961091837403..edbbcb5b96f059635f128ce645ca98d29882c4b2 100644 |
--- a/chrome/browser/nacl_host/nacl_browser.h |
+++ b/chrome/browser/nacl_host/nacl_browser.h |
@@ -6,6 +6,7 @@ |
#define CHROME_BROWSER_NACL_HOST_NACL_BROWSER_H_ |
#include "base/bind.h" |
+#include "base/containers/mru_cache.h" |
#include "base/files/file_util_proxy.h" |
#include "base/memory/singleton.h" |
#include "base/memory/weak_ptr.h" |
@@ -15,6 +16,15 @@ |
class URLPattern; |
class GURL; |
+namespace nacl { |
+ |
+// Open an immutable executable file that can be mmapped. |
+// This function should only be called on a thread that can perform file IO. |
+void OpenNaClExecutableImpl(const base::FilePath& file_path, |
+ base::PlatformFile* file); |
+ |
+} |
+ |
// Represents shared state for all NaClProcessHost objects in the browser. |
class NaClBrowser { |
public: |
@@ -70,6 +80,31 @@ class NaClBrowser { |
return validation_cache_.GetValidationCacheKey(); |
} |
+ // The NaCl singleton keeps information about NaCl executable files opened via |
+ // PPAPI. This allows the NaCl process to get trusted information about the |
+ // file directly from the browser process. In theory, a compromised renderer |
+ // could provide a writable file handle or lie about the file's path. If we |
+ // trusted the handle was read only but it was not, a mmaped file could |
+ // mutated after validation, allowing an escape of the NaCl sandbox. |
+ // Similarly, if we trusted the file path corresponded to the file handle but |
+ // it did not, the validation cache could be tricked into bypassing validation |
+ // for bad code. |
+ // Instead of allowing these attacks, we only trust information we get |
+ // directly from the browser process. Because the information is stored in a |
+ // cache of bounded size, it is not guaranteed the browser process will be |
+ // able to provide the requested information. In these cases, the NaCl |
+ // process must make conservative assumptions about the origin of the file. |
+ // In theory, a compromised renderer could guess file tokens in an attempt to |
+ // read files it normally doesn't have access to. This would not compromise |
+ // the NaCl sandbox, however, and only has a 1 in ~2**120 chance of success |
+ // per guess. |
+ // TODO(ncbray): move the cache onto the NaCl process host to completely |
+ // prevent one process from guessing the token of another process. |
+ void PutFilePath(const base::FilePath& path, uint64* file_token_lo, |
+ uint64* file_token_hi); |
+ bool GetFilePath(uint64 file_token_lo, uint64 file_token_hi, |
+ base::FilePath* path); |
+ |
bool QueryKnownToValidate(const std::string& signature, bool off_the_record); |
void SetKnownToValidate(const std::string& signature, bool off_the_record); |
void ClearValidationCache(const base::Closure& callback); |
@@ -123,6 +158,9 @@ class NaClBrowser { |
NaClResourceState validation_cache_state_; |
base::Callback<void(int)> debug_stub_port_listener_; |
+ typedef base::HashingMRUCache<std::string, base::FilePath> PathCacheType; |
+ PathCacheType path_cache_; |
+ |
bool ok_; |
// A list of pending tasks to start NaCl processes. |