Medium chrome Logic Error 📄 Reporter bug report 🔧 Commit mapped

Overview

Medium
Severity
CVSS
No
Exploited ITW
Fixed
Fix Status
ImpactInappropriate implementation in Downloads
DescriptionInappropriate implementation in Downloads
ComponentDownloads
Bug ClassLogic Error
Tracker415496161
Fix commitb2bf216dc223 (chromium/src) +102/-15
CISA KEVNot listed
CreditedFarras Givari
Disclosed2025-09-02

Changed Functions

FunctionChangeNotes
DangerousDownloadDialogBridge
chrome/browser/download/android/dangerous_download_dialog_bridge.cc
modified
if
chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DangerousDownloadDialogBridge.java
modified

Files Changed

  • chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java
  • chrome/browser/download/android/dangerous_download_dialog_bridge.cc
  • chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DangerousDownloadDialogBridge.java
  • chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java
From b2bf216dc223e333700a470b55df72ffeba66c6d Mon Sep 17 00:00:00 2001
From: Lily Chen <[email protected]>
Date: Wed, 02 Jul 2025 12:17:41 -0700
Subject: [PATCH] Improve DangerousDownloadDialog message

This CL improves the message string shown in DangerousDownloadDialog to
more accurately convey security-relevant information to the user.

* Puts the filename in quotation marks and adds bold font, to make it
  clearer that the filename portion is site-controlled and delineate it
  from adjacent Chrome-produced parts of the UI string. The use of bold
  font is consistent with the iOS download dialog, updated in
  crrev.com/c/6633364.

* Adds the domain of the download URL to the string if available, in a
  colored font. This domain string is currently the download URL,
  processed through elide_url formatting functions, but we may select a
  more representative URL or origin in the future.

Screenshots:
https://drive.google.com/drive/folders/10U4_bv9OZxIpCOCR3pPdJE9PC1MIg5Ve

Bug: 415496161, 410721828
Change-Id: I5366c4f95350e0bbabda25f004288b760213da20
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6696592
Reviewed-by: Xinghui Lu <[email protected]>
Commit-Queue: Lily Chen <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1481797}
---

diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java
index 7c59973..41667efc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java
@@ -44,6 +44,7 @@
     private static final String DOWNLOAD_PATH = "/android/Download";
     private static final String PAGE_URL = "www.pageurl.com/download";
     private static final String FILE_NAME = "download.pdf";
+    private static final String DOWNLOAD_DOMAIN = "pageurl.com";
     public static final int ICON_ID = R.drawable.btn_close;
 
     @Rule
@@ -179,6 +180,7 @@
                                     mModalDialogManager,
                                     FILE_NAME,
                                     TOTAL_BYTES,
+                                    DOWNLOAD_DOMAIN,
                                     ICON_ID,
                                     mResultCallback);
                 });
diff --git a/chrome/browser/download/android/dangerous_download_dialog_bridge.cc b/chrome/browser/download/android/dangerous_download_dialog_bridge.cc
index 100df18c..7039954 100644
--- a/chrome/browser/download/android/dangerous_download_dialog_bridge.cc
+++ b/chrome/browser/download/android/dangerous_download_dialog_bridge.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/download/android/download_dialog_utils.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/url_formatter/elide_url.h"
 #include "ui/android/window_android.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -25,6 +26,15 @@
 using base::android::ConvertJavaStringToUTF8;
 using base::android::JavaParamRef;
 
+namespace {
+// Gets the "download domain" string shown in the dialog. Currently, this is
+// derived from the download URL.
+std::u16string GetDownloadDomain(download::DownloadItem* item) {
+  return url_formatter::FormatUrlForDisplayOmitSchemePathAndTrivialSubdomains(
+      item->GetURL());
+}
+}  // namespace
+
 DangerousDownloadDialogBridge::DangerousDownloadDialogBridge() {
   JNIEnv* env = base::android::AttachCurrentThread();
   java_object_.Reset(Java_DangerousDownloadDialogBridge_create(
@@ -59,6 +69,8 @@
       download_item->GetGuid(),
       base::UTF8ToUTF16(download_item->GetFileNameToReportUser().value()),
       download_item->GetTotalBytes(),
+      base::android::ConvertUTF16ToJavaString(env,
+                                              GetDownloadDomain(download_item)),
       ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_INFOBAR_WARNING));
 }
 
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DangerousDownloadDialogBridge.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DangerousDownloadDialogBridge.java
index 350a718..dbaabb4a 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DangerousDownloadDialogBridge.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DangerousDownloadDialogBridge.java
@@ -45,6 +45,7 @@
      * @param guid GUID of the download.
      * @param fileName Name of the download file.
      * @param totalBytes Total bytes of the file.
+     * @param downloadDomain Domain name to associate with the downloaded file.
      * @param iconId The icon resource for the warning dialog.
      */
     @CalledByNative
@@ -53,6 +54,7 @@
             @JniType("std::string") String guid,
             @JniType("std::u16string") String fileName,
             long totalBytes,
+            String downloadDomain,
             int iconId) {
         Activity activity = windowAndroid.getActivity().get();
         if (activity == null) {
@@ -66,6 +68,7 @@
                         ((ModalDialogManagerHolder) activity).getModalDialogManager(),
                         fileName,
                         totalBytes,
+                        downloadDomain,
                         iconId,
                         (accepted) -> {
                             if (accepted) {
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java
index 0c31593..34eb503 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DangerousDownloadDialog.java
@@ -5,6 +5,12 @@
 package org.chromium.chrome.browser.download.dialogs;
 
 import android.content.Context;
+import android.graphics.Typeface;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.StyleSpan;
 
 import androidx.annotation.IntDef;
 import androidx.core.content.res.ResourcesCompat;
@@ -13,6 +19,7 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.download.R;
+import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.components.browser_ui.util.DownloadUtils;
 import org.chromium.ui.UiUtils;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -55,31 +62,25 @@
 
     /**
      * Called to show a warning dialog for dangerous download.
+     *
      * @param context Context for showing the dialog.
      * @param modalDialogManager Manager for managing the modal dialog.
      * @param fileName Name of the download file.
      * @param totalBytes Total bytes of the file.
+     * @param downloadDomain Domain name to associate with the downloaded file.
      * @param iconId Icon ID of the warning dialog.
      * @param callback Callback to run when confirming the download, true for accept the download,
-     *         false otherwise.
+     *     false otherwise.
      */
     public void show(
             Context context,
             ModalDialogManager modalDialogManager,
             String fileName,
             long totalBytes,
+            String downloadDomain,
             int iconId,
             Callback<Boolean> callback) {
         var resources = context.getResources();
-        String message =
-                totalBytes > 0
-                        ? resources.getString(R.string.dangerous_download_dialog_text, fileName)
-                        : resources.getString(
-                                R.string.dangerous_download_dialog_text_with_size,
-                                fileName,
-                                DownloadUtils.getStringForBytes(context, totalBytes));
-        ArrayList<CharSequence> message_paragraphs = new ArrayList<>(List.of(message));
-
         var controller =
                 new ModalDialogProperties.Controller() {
                     @Override
@@ -112,13 +113,16 @@
                         }
                     }
                 };
+
         PropertyModel propertyModel =
                 new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
                         .with(ModalDialogProperties.CONTROLLER, controller)
                         .with(
                                 ModalDialogProperties.TITLE,
                                 resources.getString(R.string.dangerous_download_dialog_title))
-                        .with(ModalDialogProperties.MESSAGE_PARAGRAPHS, message_paragraphs)
+                        .with(
+                                ModalDialogProperties.MESSAGE_PARAGRAPHS,
+                                getMessageParagraphs(context, fileName, totalBytes, downloadDomain))
                         .with(
                                 ModalDialogProperties.POSITIVE_BUTTON_TEXT,
                                 resources.getString(
@@ -143,6 +147,64 @@
     }
 
     /**
+     * Selects the appropriate message string template and inserts formatted substitutions.
+     *
Loading diff…

Original Bug Report

reported by [email protected]

"File might be harmful" dialog does not have origin

Steps to reproduce the problem

  1. Access poc.html
  2. Click the button
  3. The download pop-up will still appear on https://google.com

Problem Description

This vulnerability occurs when there is a condition that a file download pop-up origin can be overlaid on other origin. The file download pop-up should only be appear when user is accessing the real origin where the file download pop-up come from.

For more information you can read on crbug.com/40055527

Chrome version: 135.0.7049.111 (Official Build) (64-bit)

Summary

crbug.com/40055527 is still reproducible on newest version of Chrome

Additional Data

Category: Security
Chrome Channel: Not sure
Regression: Yes

View on issue tracker