Index: components/password_manager/content/browser/content_password_manager_driver.cc |
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc |
index ffaf3ac58cef509fbd55ecf7b772da1167bec703..83239f480de44a2f013c5dd0a63bf809d0e65733 100644 |
--- a/components/password_manager/content/browser/content_password_manager_driver.cc |
+++ b/components/password_manager/content/browser/content_password_manager_driver.cc |
@@ -7,12 +7,15 @@ |
#include "components/autofill/content/common/autofill_messages.h" |
#include "components/autofill/core/common/form_data.h" |
#include "components/autofill/core/common/password_form.h" |
+#include "components/password_manager/content/browser/bad_message.h" |
#include "components/password_manager/content/browser/content_password_manager_driver_factory.h" |
#include "components/password_manager/core/browser/password_manager_client.h" |
#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/child_process_security_policy.h" |
#include "content/public/browser/navigation_details.h" |
#include "content/public/browser/navigation_entry.h" |
#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/site_instance.h" |
#include "content/public/browser/web_contents.h" |
@@ -151,23 +154,45 @@ bool ContentPasswordManagerDriver::HandleMessage(const IPC::Message& message) { |
void ContentPasswordManagerDriver::OnPasswordFormsParsed( |
const std::vector<autofill::PasswordForm>& forms) { |
+ for (const auto& form : forms) |
+ if (!CheckChildProcessSecurityPolicy( |
+ form.origin, BadMessageReason::CPMD_BAD_ORIGIN_FORMS_PARSED)) |
+ return; |
+ |
+ OnPasswordFormsParsedNoRenderCheck(forms); |
+} |
+ |
+void ContentPasswordManagerDriver::OnPasswordFormsParsedNoRenderCheck( |
+ const std::vector<autofill::PasswordForm>& forms) { |
GetPasswordManager()->OnPasswordFormsParsed(this, forms); |
} |
void ContentPasswordManagerDriver::OnPasswordFormsRendered( |
const std::vector<autofill::PasswordForm>& visible_forms, |
bool did_stop_loading) { |
+ for (const auto& form : visible_forms) |
+ if (!CheckChildProcessSecurityPolicy( |
+ form.origin, BadMessageReason::CPMD_BAD_ORIGIN_FORMS_RENDERED)) |
+ return; |
GetPasswordManager()->OnPasswordFormsRendered(this, visible_forms, |
did_stop_loading); |
} |
void ContentPasswordManagerDriver::OnPasswordFormSubmitted( |
const autofill::PasswordForm& password_form) { |
+ if (!CheckChildProcessSecurityPolicy( |
+ password_form.origin, |
+ BadMessageReason::CPMD_BAD_ORIGIN_FORM_SUBMITTED)) |
+ return; |
GetPasswordManager()->OnPasswordFormSubmitted(this, password_form); |
} |
void ContentPasswordManagerDriver::OnFocusedPasswordFormFound( |
const autofill::PasswordForm& password_form) { |
+ if (!CheckChildProcessSecurityPolicy( |
+ password_form.origin, |
+ BadMessageReason::CPMD_BAD_ORIGIN_FOCUSED_PASSWORD_FORM_FOUND)) |
+ return; |
GetPasswordManager()->OnPasswordFormForceSaveRequested(this, password_form); |
} |
@@ -183,13 +208,35 @@ void ContentPasswordManagerDriver::DidNavigateFrame( |
void ContentPasswordManagerDriver::OnInPageNavigation( |
const autofill::PasswordForm& password_form) { |
+ if (!CheckChildProcessSecurityPolicy( |
+ password_form.origin, |
+ BadMessageReason::CPMD_BAD_ORIGIN_IN_PAGE_NAVIGATION)) |
+ return; |
GetPasswordManager()->OnInPageNavigation(this, password_form); |
} |
void ContentPasswordManagerDriver::OnPasswordNoLongerGenerated( |
const autofill::PasswordForm& password_form) { |
+ if (!CheckChildProcessSecurityPolicy( |
+ password_form.origin, |
+ BadMessageReason::CPMD_BAD_ORIGIN_PASSWORD_NO_LONGER_GENERATED)) |
+ return; |
GetPasswordManager()->SetHasGeneratedPasswordForForm(this, password_form, |
false); |
} |
+bool ContentPasswordManagerDriver::CheckChildProcessSecurityPolicy( |
+ const GURL& url, |
+ BadMessageReason reason) { |
+ content::ChildProcessSecurityPolicy* policy = |
+ content::ChildProcessSecurityPolicy::GetInstance(); |
+ if (!policy->CanAccessDataForOrigin(render_frame_host_->GetProcess()->GetID(), |
+ url)) { |
+ bad_message::ReceivedBadMessage(render_frame_host_->GetProcess(), reason); |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
} // namespace password_manager |