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

Unified Diff: chrome/browser/download/download_extensions.cc

Issue 1165893004: [Downloads] Prevent dangerous files from being opened automatically. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use a blacklist instead of including all dangerous file types. Created 5 years, 6 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: chrome/browser/download/download_extensions.cc
diff --git a/chrome/browser/download/download_extensions.cc b/chrome/browser/download/download_extensions.cc
index 623bdf48d855f651fcc7ef343522d450bd9a5fba..85fad633a85ad8fe5996c83683cd7420c62cec84 100644
--- a/chrome/browser/download/download_extensions.cc
+++ b/chrome/browser/download/download_extensions.cc
@@ -57,157 +57,184 @@ namespace download_util {
*
* ***** END LICENSE BLOCK ***** */
-static const struct Executables {
- const char* extension;
- DownloadDangerLevel level;
-} g_executables[] = {
- // Some files are dangerous on all platforms.
+namespace {
+
+enum DownloadDangerFlags {
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 Jamming these together with DownloadDangerLevel fe
asanka 2015/06/12 20:12:52 Yeah. I see what you mean. I split it out into a s
+ // The file type should not be allowed to open automatically.
+ //
+ // Includes:
+ // * Executables that are likely to start and execute arbitrary privileged
+ // code without requiring user interaction.
+ // * Files that aren't traditionally executables, but are handled by
+ // applications that have a less than stellar safety track record. Such
+ // application may allow arbitrary code execution upon opening a file.
+ // * Files that don't have executable code, but may modify system
+ // configuration in ways that are unsafe.
//
- // Flash files downloaded locally can sometimes access the local filesystem.
- { "swf", DANGEROUS },
- { "spl", DANGEROUS },
- // Chrome extensions should be obtained through the web store.
- { "crx", ALLOW_ON_USER_GESTURE },
+ // Doesn't include:
+ // * Files containing executable code if opening said file is mediated via
+ // a trusted application that obtains user consent.
+ EXCLUDE_FROM_AUTO_OPEN = 1 << 4,
+
+ // Special flag that indicates that the file path didn't have an extension.
+ NO_EXTENSION = 1 << 5,
+
+ // Mask for extracting DownloadDangerLevel from DownloadDangerFlags.
+ DOWNLOAD_DANGER_LEVEL_MASK = 0xf
+};
+
+static const struct Executable {
+ const char* extension; // Extension sans leading extension separator.
+ int danger_level_flags; // Bit combination of DownloadDangerLevel and
+ // DownloadDangerFlags.
+} g_executables[] = {
+ // Some files are dangerous on all platforms.
+ //
+ // Flash files downloaded locally can sometimes access the local filesystem.
+ {"swf", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"spl", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ // Chrome extensions should be obtained through the web store.
+ {"crx", ALLOW_ON_USER_GESTURE},
// Windows, all file categories.
#if defined(OS_WIN)
- { "ad", ALLOW_ON_USER_GESTURE },
- { "ade", ALLOW_ON_USER_GESTURE },
- { "adp", ALLOW_ON_USER_GESTURE },
- { "app", ALLOW_ON_USER_GESTURE },
- { "application", ALLOW_ON_USER_GESTURE },
- { "asp", ALLOW_ON_USER_GESTURE },
- { "asx", ALLOW_ON_USER_GESTURE },
- { "bas", ALLOW_ON_USER_GESTURE },
- { "bat", ALLOW_ON_USER_GESTURE },
- { "cfg", DANGEROUS },
- { "chi", ALLOW_ON_USER_GESTURE },
- { "chm", ALLOW_ON_USER_GESTURE },
- { "cmd", ALLOW_ON_USER_GESTURE },
- { "com", ALLOW_ON_USER_GESTURE },
- { "cpl", ALLOW_ON_USER_GESTURE },
- { "crt", ALLOW_ON_USER_GESTURE },
- { "dll", DANGEROUS },
- { "drv", DANGEROUS },
- { "exe", ALLOW_ON_USER_GESTURE },
- { "fxp", ALLOW_ON_USER_GESTURE },
- { "grp", DANGEROUS },
- { "hlp", ALLOW_ON_USER_GESTURE },
- { "hta", ALLOW_ON_USER_GESTURE },
- { "htt", ALLOW_ON_USER_GESTURE },
- { "inf", ALLOW_ON_USER_GESTURE },
- { "ini", DANGEROUS },
- { "ins", ALLOW_ON_USER_GESTURE },
- { "isp", ALLOW_ON_USER_GESTURE },
- { "js", ALLOW_ON_USER_GESTURE },
- { "jse", ALLOW_ON_USER_GESTURE },
- { "lnk", ALLOW_ON_USER_GESTURE },
- { "local", DANGEROUS },
- { "mad", ALLOW_ON_USER_GESTURE },
- { "maf", ALLOW_ON_USER_GESTURE },
- { "mag", ALLOW_ON_USER_GESTURE },
- { "mam", ALLOW_ON_USER_GESTURE },
- { "manifest", DANGEROUS },
- { "maq", ALLOW_ON_USER_GESTURE },
- { "mar", ALLOW_ON_USER_GESTURE },
- { "mas", ALLOW_ON_USER_GESTURE },
- { "mat", ALLOW_ON_USER_GESTURE },
- { "mau", ALLOW_ON_USER_GESTURE },
- { "mav", ALLOW_ON_USER_GESTURE },
- { "maw", ALLOW_ON_USER_GESTURE },
- { "mda", ALLOW_ON_USER_GESTURE },
- { "mdb", ALLOW_ON_USER_GESTURE },
- { "mde", ALLOW_ON_USER_GESTURE },
- { "mdt", ALLOW_ON_USER_GESTURE },
- { "mdw", ALLOW_ON_USER_GESTURE },
- { "mdz", ALLOW_ON_USER_GESTURE },
- { "mht", ALLOW_ON_USER_GESTURE },
- { "mhtml", ALLOW_ON_USER_GESTURE },
- { "mmc", ALLOW_ON_USER_GESTURE },
- { "mof", DANGEROUS },
- { "msc", ALLOW_ON_USER_GESTURE },
- { "msh", ALLOW_ON_USER_GESTURE },
- { "mshxml", ALLOW_ON_USER_GESTURE },
- { "msi", ALLOW_ON_USER_GESTURE },
- { "msp", ALLOW_ON_USER_GESTURE },
- { "mst", ALLOW_ON_USER_GESTURE },
- { "ocx", DANGEROUS },
- { "ops", ALLOW_ON_USER_GESTURE },
- { "pcd", ALLOW_ON_USER_GESTURE },
- { "pif", ALLOW_ON_USER_GESTURE },
- { "plg", ALLOW_ON_USER_GESTURE },
- { "prf", ALLOW_ON_USER_GESTURE },
- { "prg", ALLOW_ON_USER_GESTURE },
- { "pst", ALLOW_ON_USER_GESTURE },
- { "reg", ALLOW_ON_USER_GESTURE },
- { "scf", ALLOW_ON_USER_GESTURE },
- { "scr", ALLOW_ON_USER_GESTURE },
- { "sct", ALLOW_ON_USER_GESTURE },
- { "shb", ALLOW_ON_USER_GESTURE },
- { "shs", ALLOW_ON_USER_GESTURE },
- { "sys", DANGEROUS },
- { "url", DANGEROUS },
- { "vb", ALLOW_ON_USER_GESTURE },
- { "vbe", ALLOW_ON_USER_GESTURE },
- { "vbs", ALLOW_ON_USER_GESTURE },
- { "vsd", ALLOW_ON_USER_GESTURE },
- { "vsmacros", ALLOW_ON_USER_GESTURE },
- { "vss", ALLOW_ON_USER_GESTURE },
- { "vst", ALLOW_ON_USER_GESTURE },
- { "vsw", ALLOW_ON_USER_GESTURE },
- { "ws", ALLOW_ON_USER_GESTURE },
- { "wsc", ALLOW_ON_USER_GESTURE },
- { "wsf", ALLOW_ON_USER_GESTURE },
- { "wsh", ALLOW_ON_USER_GESTURE },
- { "xbap", DANGEROUS },
+ {"ad", ALLOW_ON_USER_GESTURE},
+ {"ade", ALLOW_ON_USER_GESTURE},
+ {"adp", ALLOW_ON_USER_GESTURE},
+ {"app", ALLOW_ON_USER_GESTURE},
+ {"application", ALLOW_ON_USER_GESTURE},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 Naively, I would have thought that something named
asanka 2015/06/12 20:12:52 I added some details in the form of comments. Let
+ {"asp", ALLOW_ON_USER_GESTURE},
+ {"asx", ALLOW_ON_USER_GESTURE},
+ {"bas", ALLOW_ON_USER_GESTURE},
+ {"bat", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"cfg", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"chi", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"chm", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"cmd", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"com", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"cpl", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"crt", ALLOW_ON_USER_GESTURE},
+ {"dll", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"drv", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"exe", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"fxp", ALLOW_ON_USER_GESTURE},
+ {"grp", DANGEROUS},
+ {"hlp", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 This is something I could easily imagine users wan
asanka 2015/06/12 20:12:52 This was due to the known default file handler hav
+ {"hta", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"htt", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"inf", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"ini", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"ins", ALLOW_ON_USER_GESTURE},
+ {"isp", ALLOW_ON_USER_GESTURE},
+ {"js", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"jse", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"lnk", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"local", DANGEROUS},
+ {"mad", ALLOW_ON_USER_GESTURE},
+ {"maf", ALLOW_ON_USER_GESTURE},
+ {"mag", ALLOW_ON_USER_GESTURE},
+ {"mam", ALLOW_ON_USER_GESTURE},
+ {"manifest", DANGEROUS},
+ {"maq", ALLOW_ON_USER_GESTURE},
+ {"mar", ALLOW_ON_USER_GESTURE},
+ {"mas", ALLOW_ON_USER_GESTURE},
+ {"mat", ALLOW_ON_USER_GESTURE},
+ {"mau", ALLOW_ON_USER_GESTURE},
+ {"mav", ALLOW_ON_USER_GESTURE},
+ {"maw", ALLOW_ON_USER_GESTURE},
+ {"mda", ALLOW_ON_USER_GESTURE},
+ {"mdb", ALLOW_ON_USER_GESTURE},
+ {"mde", ALLOW_ON_USER_GESTURE},
+ {"mdt", ALLOW_ON_USER_GESTURE},
+ {"mdw", ALLOW_ON_USER_GESTURE},
+ {"mdz", ALLOW_ON_USER_GESTURE},
+ {"mht", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"mhtml", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 Does opening a web page on the disk give it some s
asanka 2015/06/12 20:12:52 Removed the flag.
+ {"mmc", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"mof", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"msc", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"msh", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"mshxml", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"msi", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"msp", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"mst", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"ocx", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"ops", ALLOW_ON_USER_GESTURE},
+ {"pcd", ALLOW_ON_USER_GESTURE},
+ {"pif", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"plg", ALLOW_ON_USER_GESTURE},
+ {"prf", ALLOW_ON_USER_GESTURE},
+ {"prg", ALLOW_ON_USER_GESTURE},
+ {"pst", ALLOW_ON_USER_GESTURE},
+ {"reg", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"scf", ALLOW_ON_USER_GESTURE},
+ {"scr", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"sct", ALLOW_ON_USER_GESTURE},
+ {"shb", ALLOW_ON_USER_GESTURE},
+ {"shs", ALLOW_ON_USER_GESTURE},
+ {"sys", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"url", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 Why? I'm not sure why people would want to downlo
asanka 2015/06/12 20:12:52 A .url file is an OLE persisted container that can
+ {"vb", ALLOW_ON_USER_GESTURE},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 Why isn't open a .vb file dangerous? Does it alwa
asanka 2015/06/12 20:12:52 .vb (not to be confused with .vbs) isn't associate
+ {"vbe", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"vbs", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"vsd", ALLOW_ON_USER_GESTURE},
+ {"vsmacros", ALLOW_ON_USER_GESTURE},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 You know Windows (much) better than I, but I'd thi
asanka 2015/06/12 20:12:52 As far as I could discover, opening this type of f
+ {"vss", ALLOW_ON_USER_GESTURE},
+ {"vst", ALLOW_ON_USER_GESTURE},
+ {"vsw", ALLOW_ON_USER_GESTURE},
+ {"ws", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"wsc", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"wsf", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"wsh", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"xbap", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
#endif // OS_WIN
// Java.
#if !defined(OS_CHROMEOS)
- { "class", DANGEROUS },
- { "jar", DANGEROUS },
- { "jnlp", DANGEROUS },
+ {"class", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"jar", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
+ {"jnlp", DANGEROUS | EXCLUDE_FROM_AUTO_OPEN},
#endif
// Scripting languages. (Shells are handled below.)
#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
- { "pl", ALLOW_ON_USER_GESTURE },
- { "py", ALLOW_ON_USER_GESTURE },
- { "pyc", ALLOW_ON_USER_GESTURE },
- { "pyw", ALLOW_ON_USER_GESTURE },
- { "rb", ALLOW_ON_USER_GESTURE },
+ {"pl", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"py", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"pyc", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"pyw", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"rb", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
#endif
// Shell languages. (OS_ANDROID is OS_POSIX.) OS_WIN shells are handled above.
#if defined(OS_POSIX)
- { "bash", ALLOW_ON_USER_GESTURE },
- { "csh", ALLOW_ON_USER_GESTURE },
- { "ksh", ALLOW_ON_USER_GESTURE },
- { "sh", ALLOW_ON_USER_GESTURE },
- { "shar", ALLOW_ON_USER_GESTURE },
- { "tcsh", ALLOW_ON_USER_GESTURE },
+ {"bash", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"csh", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"ksh", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"sh", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"shar", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
+ {"tcsh", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
#endif
#if defined(OS_MACOSX)
- { "command", ALLOW_ON_USER_GESTURE },
+ {"command", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
#endif
// Package management formats. OS_WIN package formats are handled above.
#if defined(OS_MACOSX) || defined(OS_LINUX)
- { "pkg", ALLOW_ON_USER_GESTURE },
+ {"pkg", ALLOW_ON_USER_GESTURE},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 Hmmm. This is right at the boundary for me--I can
asanka 2015/06/12 20:12:52 Added.
#endif
#if defined(OS_LINUX)
- { "deb", ALLOW_ON_USER_GESTURE },
- { "rpm", ALLOW_ON_USER_GESTURE },
+ {"deb", ALLOW_ON_USER_GESTURE},
+ {"rpm", ALLOW_ON_USER_GESTURE},
Randy Smith (Not in Mondays) 2015/06/09 19:40:04 I think that "opening" a package on Linux installs
asanka 2015/06/12 20:12:52 Added.
#endif
#if defined(OS_ANDROID)
- { "dex", ALLOW_ON_USER_GESTURE }, // Really an executable format.
+ {"dex", ALLOW_ON_USER_GESTURE | EXCLUDE_FROM_AUTO_OPEN},
palmer 2015/06/08 19:05:07 I'm actually not sure if Android even would direct
asanka 2015/06/09 00:38:10 Yeah. I added the flag for a couple of file types
#endif
};
-DownloadDangerLevel GetFileDangerLevel(const base::FilePath& path) {
+int GetFileDangerFlags(const base::FilePath& path) {
base::FilePath::StringType extension(path.FinalExtension());
if (extension.empty())
- return NOT_DANGEROUS;
+ return NO_EXTENSION;
if (!base::IsStringASCII(extension))
return NOT_DANGEROUS;
#if defined(OS_WIN)
@@ -220,13 +247,26 @@ DownloadDangerLevel GetFileDangerLevel(const base::FilePath& path) {
if (ascii_extension[0] == base::FilePath::kExtensionSeparator)
ascii_extension.erase(0, 1);
- for (size_t i = 0; i < arraysize(g_executables); ++i) {
- if (LowerCaseEqualsASCII(ascii_extension, g_executables[i].extension))
- return g_executables[i].level;
+ for (const auto& file : g_executables) {
+ if (LowerCaseEqualsASCII(ascii_extension, file.extension))
+ return file.danger_level_flags;
}
+
return NOT_DANGEROUS;
}
+} // namespace
+
+DownloadDangerLevel GetFileDangerLevel(const base::FilePath& path) {
+ int flags = GetFileDangerFlags(path);
+ return static_cast<DownloadDangerLevel>(flags & DOWNLOAD_DANGER_LEVEL_MASK);
+}
+
+bool IsAllowedToOpenAutomatically(const base::FilePath& path) {
+ int flags = GetFileDangerFlags(path);
+ return !(flags == NO_EXTENSION || (flags & EXCLUDE_FROM_AUTO_OPEN));
+}
+
static const char* kExecutableWhiteList[] = {
// JavaScript is just as powerful as EXE.
"text/javascript",
@@ -260,5 +300,4 @@ bool IsExecutableMimeType(const std::string& mime_type) {
return net::MatchesMimeType("application/*", mime_type);
}
-
} // namespace download_util

Powered by Google App Engine
This is Rietveld 408576698