Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: extensions/browser/content_hash_fetcher.cc

Issue 465333003: Close a loophole in extension content verification (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ready for review Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/browser/content_hash_fetcher.cc
diff --git a/extensions/browser/content_hash_fetcher.cc b/extensions/browser/content_hash_fetcher.cc
index 421271125eb7b51ed275bdd8752085e6760da7ae..a8cc0f79738b1f6d78adc76810f9a7d409f17188 100644
--- a/extensions/browser/content_hash_fetcher.cc
+++ b/extensions/browser/content_hash_fetcher.cc
@@ -22,7 +22,6 @@
#include "extensions/browser/computed_hashes.h"
#include "extensions/browser/content_hash_tree.h"
#include "extensions/browser/content_verifier_delegate.h"
-#include "extensions/browser/extension_registry.h"
#include "extensions/browser/verified_contents.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension.h"
@@ -85,6 +84,13 @@ class ContentHashFetcherJob
friend class base::RefCountedThreadSafe<ContentHashFetcherJob>;
virtual ~ContentHashFetcherJob();
+ // Tries to load a verified_contents.json file at |path|. On successfully
+ // reading and validing the file, the verified_contents_ member variable will
+ // be set and this function will return true. If the file does not exist, or
+ // exists but is invalid, it will return false. Also, any invalid
+ // file will be removed from disk and
+ bool LoadVerifiedContents(const base::FilePath& path);
+
// Callback for when we're done doing file I/O to see if we already have
// a verified contents file. If we don't, this will kick off a network
// request to get one.
@@ -134,6 +140,10 @@ class ContentHashFetcherJob
// The key used to validate verified_contents.json.
ContentVerifierKey key_;
+ // The parsed contents of the verified_contents.json file, either read from
+ // disk or fetched from the network and then written to disk.
+ scoped_ptr<VerifiedContents> verified_contents_;
+
// Whether this job succeeded.
bool success_;
@@ -184,7 +194,9 @@ void ContentHashFetcherJob::Start() {
base::PostTaskAndReplyWithResult(
content::BrowserThread::GetBlockingPool(),
FROM_HERE,
- base::Bind(&base::PathExists, verified_contents_path),
+ base::Bind(&ContentHashFetcherJob::LoadVerifiedContents,
+ this,
+ verified_contents_path),
base::Bind(&ContentHashFetcherJob::DoneCheckingForVerifiedContents,
this));
}
@@ -203,6 +215,19 @@ bool ContentHashFetcherJob::IsCancelled() {
ContentHashFetcherJob::~ContentHashFetcherJob() {
}
+bool ContentHashFetcherJob::LoadVerifiedContents(const base::FilePath& path) {
+ if (!base::PathExists(path))
+ return false;
+ verified_contents_.reset(new VerifiedContents(key_.data, key_.size));
+ if (!verified_contents_->InitFrom(path, false)) {
+ verified_contents_.reset();
+ if (!base::DeleteFile(path, false))
+ LOG(WARNING) << "Failed to delete " << path.value();
+ return false;
+ }
+ return true;
+}
+
void ContentHashFetcherJob::DoneCheckingForVerifiedContents(bool found) {
if (IsCancelled())
return;
@@ -319,11 +344,14 @@ bool ContentHashFetcherJob::CreateHashes(const base::FilePath& hashes_file) {
if (!base::CreateDirectoryAndGetError(hashes_file.DirName(), NULL))
return false;
- base::FilePath verified_contents_path =
- file_util::GetVerifiedContentsPath(extension_path_);
- VerifiedContents verified_contents(key_.data, key_.size);
- if (!verified_contents.InitFrom(verified_contents_path, false))
- return false;
+ if (!verified_contents_.get()) {
+ base::FilePath verified_contents_path =
+ file_util::GetVerifiedContentsPath(extension_path_);
+ verified_contents_.reset(new VerifiedContents(key_.data, key_.size));
+ if (!verified_contents_->InitFrom(verified_contents_path, false))
+ return false;
+ verified_contents_.reset();
+ }
base::FileEnumerator enumerator(extension_path_,
true, /* recursive */
@@ -352,7 +380,7 @@ bool ContentHashFetcherJob::CreateHashes(const base::FilePath& hashes_file) {
relative_path = relative_path.NormalizePathSeparatorsTo('/');
const std::string* expected_root =
- verified_contents.GetTreeHashRoot(relative_path);
+ verified_contents_->GetTreeHashRoot(relative_path);
if (!expected_root)
continue;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698