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

Unified Diff: content/browser/loader/resource_dispatcher_host_impl.cc

Issue 1270663002: Validate the Origin HTTP header in the browser process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 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
Index: content/browser/loader/resource_dispatcher_host_impl.cc
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index 2fe2443130d966e1b97051833d6322879646cdfd..ba9f88ebce1f0acca80ca0e79df7128fb885f592 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -275,7 +275,9 @@ void SetReferrerForRequest(net::URLRequest* request, const Referrer& referrer) {
bool ShouldServiceRequest(int process_type,
int child_id,
const ResourceHostMsg_Request& request_data,
- storage::FileSystemContext* file_system_context) {
+ const net::HttpRequestHeaders& headers,
+ ResourceMessageFilter* filter,
+ ResourceContext* resource_context) {
if (process_type == PROCESS_TYPE_PLUGIN)
return true;
@@ -289,6 +291,21 @@ bool ShouldServiceRequest(int process_type,
return false;
}
+ // Check if the renderer is using an illegal Origin header. If so, kill it.
+ std::string origin_string;
+ bool has_origin = headers.GetHeader("Origin", &origin_string) &&
+ origin_string != "null";
+ if (has_origin) {
+ GURL origin(origin_string);
+ if (!policy->CanCommitURL(child_id, origin) ||
+ GetContentClient()->browser()->IsIllegalOrigin(resource_context,
+ child_id, origin)) {
+ VLOG(1) << "Killed renderer for illegal origin: " << origin_string;
+ bad_message::ReceivedBadMessage(filter, bad_message::RDH_INVALID_ORIGIN);
nasko 2015/08/14 22:14:43 nit: It will be good to be consistent in illegal v
Charlie Reis 2015/08/14 23:23:32 Done. (I was trying to be consistent with other c
+ return false;
+ }
+ }
+
// Check if the renderer is permitted to upload the requested files.
if (request_data.request_body.get()) {
const std::vector<ResourceRequestBody::Element>* uploads =
@@ -303,7 +320,7 @@ bool ShouldServiceRequest(int process_type,
}
if (iter->type() == ResourceRequestBody::Element::TYPE_FILE_FILESYSTEM) {
storage::FileSystemURL url =
- file_system_context->CrackURL(iter->filesystem_url());
+ filter->file_system_context()->CrackURL(iter->filesystem_url());
if (!policy->CanReadFileSystemFile(child_id, url)) {
NOTREACHED() << "Denied unauthorized upload of "
<< iter->filesystem_url().spec();
@@ -1172,9 +1189,14 @@ void ResourceDispatcherHostImpl::BeginRequest(
// http://crbug.com/90971
CHECK(ContainsKey(active_resource_contexts_, resource_context));
+ // Parse the headers before calling ShouldServiceRequest, so that they are
+ // available to be validated.
+ net::HttpRequestHeaders headers;
+ headers.AddHeadersFromString(request_data.headers);
+
if (is_shutdown_ ||
- !ShouldServiceRequest(process_type, child_id, request_data,
- filter_->file_system_context())) {
+ !ShouldServiceRequest(process_type, child_id, request_data, headers,
+ filter_, resource_context)) {
AbortRequestBeforeItStarts(filter_, sync_result, request_id);
return;
}
@@ -1206,8 +1228,6 @@ void ResourceDispatcherHostImpl::BeginRequest(
const Referrer referrer(request_data.referrer, request_data.referrer_policy);
SetReferrerForRequest(new_request.get(), referrer);
- net::HttpRequestHeaders headers;
- headers.AddHeadersFromString(request_data.headers);
new_request->SetExtraRequestHeaders(headers);
storage::BlobStorageContext* blob_context =

Powered by Google App Engine
This is Rietveld 408576698