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

Unified Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 2902933002: Verify all files in the request body are accessible by the renderer process. (Closed)
Patch Set: Remove NOTREACHED as tests exercise this codepath. Created 3 years, 7 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/frame_host/render_frame_host_impl.cc
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index cd3a864d50d0e1a705539d3bfec517dfd39ce22b..a506e3f7004e3c2f9ab41769af8178f5dadc6fec 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2170,6 +2170,12 @@ void RenderFrameHostImpl::OnBeginNavigation(
BeginNavigationParams validated_begin_params = begin_params;
GetProcess()->FilterURL(true, &validated_begin_params.searchable_form_url);
+ if (!ValidateUploadParams(validated_params)) {
+ bad_message::ReceivedBadMessage(GetProcess(),
+ bad_message::RFH_ILLEGAL_UPLOAD_PARAMS);
+ return;
+ }
+
if (waiting_for_init_) {
pendinging_navigate_ = base::MakeUnique<PendingNavigation>(
validated_params, validated_begin_params);
@@ -3926,6 +3932,36 @@ void RenderFrameHostImpl::BeforeUnloadTimeout() {
SimulateBeforeUnloadAck();
}
+bool RenderFrameHostImpl::ValidateUploadParams(
+ const CommonNavigationParams& common_params) {
+ if (!common_params.post_data.get())
+ return true;
+
+ // Check if the renderer is permitted to upload the requested files.
+ const std::vector<ResourceRequestBodyImpl::Element>* uploads =
+ common_params.post_data->elements();
+ std::vector<ResourceRequestBodyImpl::Element>::const_iterator iter;
+ ChildProcessSecurityPolicyImpl* security_policy =
+ ChildProcessSecurityPolicyImpl::GetInstance();
+ for (iter = uploads->begin(); iter != uploads->end(); ++iter) {
+ if (iter->type() == ResourceRequestBodyImpl::Element::TYPE_FILE &&
+ !security_policy->CanReadFile(GetProcess()->GetID(), iter->path())) {
+ return false;
+ }
+ if (iter->type() ==
+ ResourceRequestBodyImpl::Element::TYPE_FILE_FILESYSTEM) {
+ StoragePartition* storage_partition = BrowserContext::GetStoragePartition(
+ GetSiteInstance()->GetBrowserContext(), GetSiteInstance());
+ storage::FileSystemURL url =
+ storage_partition->GetFileSystemContext()->CrackURL(
+ iter->filesystem_url());
+ if (!security_policy->CanReadFileSystemFile(GetProcess()->GetID(), url))
+ return false;
+ }
+ }
+ return true;
+}
+
#if defined(OS_ANDROID)
class RenderFrameHostImpl::JavaInterfaceProvider

Powered by Google App Engine
This is Rietveld 408576698