| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/safe_browsing/download_protection_util.h" | 5 #include "chrome/common/safe_browsing/download_protection_util.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 12 #include "chrome/common/safe_browsing/file_type_policies.h" |
| 12 | 13 |
| 13 namespace safe_browsing { | 14 namespace safe_browsing { |
| 14 namespace download_protection_util { | 15 namespace download_protection_util { |
| 15 | 16 |
| 16 namespace { | |
| 17 | |
| 18 // This enum matches the SBClientDownloadExtensions enum in histograms.xml. If | |
| 19 // you are adding a value here, you should also add to the enum definition in | |
| 20 // histograms.xml. Additions only at the end just in front of EXTENSION_MAX, | |
| 21 // natch. | |
| 22 enum SBClientDownloadExtensions { | |
| 23 EXTENSION_EXE, | |
| 24 EXTENSION_MSI, | |
| 25 EXTENSION_CAB, | |
| 26 EXTENSION_SYS, | |
| 27 EXTENSION_SCR, | |
| 28 EXTENSION_DRV, | |
| 29 EXTENSION_BAT, | |
| 30 EXTENSION_ZIP, | |
| 31 EXTENSION_RAR, | |
| 32 EXTENSION_DLL, | |
| 33 EXTENSION_PIF, | |
| 34 EXTENSION_COM, | |
| 35 EXTENSION_JAR, | |
| 36 EXTENSION_CLASS, | |
| 37 EXTENSION_PDF, | |
| 38 EXTENSION_VB, | |
| 39 EXTENSION_REG, | |
| 40 EXTENSION_GRP, | |
| 41 EXTENSION_OTHER, // The "other" bucket. This is in the middle of the enum | |
| 42 // due to historical reasons. | |
| 43 EXTENSION_CRX, | |
| 44 EXTENSION_APK, | |
| 45 EXTENSION_DMG, | |
| 46 EXTENSION_PKG, | |
| 47 EXTENSION_TORRENT, | |
| 48 EXTENSION_WEBSITE, | |
| 49 EXTENSION_URL, | |
| 50 EXTENSION_VBE, | |
| 51 EXTENSION_VBS, | |
| 52 EXTENSION_JS, | |
| 53 EXTENSION_JSE, | |
| 54 EXTENSION_MHT, | |
| 55 EXTENSION_MHTML, | |
| 56 EXTENSION_MSC, | |
| 57 EXTENSION_MSP, | |
| 58 EXTENSION_MST, | |
| 59 EXTENSION_BAS, | |
| 60 EXTENSION_HTA, | |
| 61 EXTENSION_MSH, | |
| 62 EXTENSION_MSH1, | |
| 63 EXTENSION_MSH1XML, | |
| 64 EXTENSION_MSH2, | |
| 65 EXTENSION_MSH2XML, | |
| 66 EXTENSION_MSHXML, | |
| 67 EXTENSION_PS1, | |
| 68 EXTENSION_PS1XML, | |
| 69 EXTENSION_PS2, | |
| 70 EXTENSION_PS2XML, | |
| 71 EXTENSION_PSC1, | |
| 72 EXTENSION_PSC2, | |
| 73 EXTENSION_SCF, | |
| 74 EXTENSION_SCT, | |
| 75 EXTENSION_WSF, | |
| 76 EXTENSION_7Z, | |
| 77 EXTENSION_XZ, | |
| 78 EXTENSION_GZ, | |
| 79 EXTENSION_TGZ, | |
| 80 EXTENSION_BZ2, | |
| 81 EXTENSION_TAR, | |
| 82 EXTENSION_ARJ, | |
| 83 EXTENSION_LZH, | |
| 84 EXTENSION_LHA, | |
| 85 EXTENSION_WIM, | |
| 86 EXTENSION_Z, | |
| 87 EXTENSION_LZMA, | |
| 88 EXTENSION_CPIO, | |
| 89 EXTENSION_CMD, | |
| 90 EXTENSION_APP, | |
| 91 EXTENSION_OSX, | |
| 92 EXTENSION_SWF, | |
| 93 EXTENSION_SPL, | |
| 94 EXTENSION_APPLICATION, | |
| 95 EXTENSION_ASP, | |
| 96 EXTENSION_ASX, | |
| 97 EXTENSION_CFG, | |
| 98 EXTENSION_CHI, | |
| 99 EXTENSION_CHM, | |
| 100 EXTENSION_CPL, | |
| 101 EXTENSION_FXP, | |
| 102 EXTENSION_HLP, | |
| 103 EXTENSION_HTT, | |
| 104 EXTENSION_INF, | |
| 105 EXTENSION_INI, | |
| 106 EXTENSION_INS, | |
| 107 EXTENSION_ISP, | |
| 108 EXTENSION_LNK, | |
| 109 EXTENSION_LOCAL, | |
| 110 EXTENSION_MANIFEST, | |
| 111 EXTENSION_MAU, | |
| 112 EXTENSION_MMC, | |
| 113 EXTENSION_MOF, | |
| 114 EXTENSION_OCX, | |
| 115 EXTENSION_OPS, | |
| 116 EXTENSION_PCD, | |
| 117 EXTENSION_PLG, | |
| 118 EXTENSION_PRF, | |
| 119 EXTENSION_PRG, | |
| 120 EXTENSION_PST, | |
| 121 EXTENSION_CRT, | |
| 122 EXTENSION_ADE, | |
| 123 EXTENSION_ADP, | |
| 124 EXTENSION_MAD, | |
| 125 EXTENSION_MAF, | |
| 126 EXTENSION_MAG, | |
| 127 EXTENSION_MAM, | |
| 128 EXTENSION_MAQ, | |
| 129 EXTENSION_MAR, | |
| 130 EXTENSION_MAS, | |
| 131 EXTENSION_MAT, | |
| 132 EXTENSION_MAV, | |
| 133 EXTENSION_MAW, | |
| 134 EXTENSION_MDA, | |
| 135 EXTENSION_MDB, | |
| 136 EXTENSION_MDE, | |
| 137 EXTENSION_MDT, | |
| 138 EXTENSION_MDW, | |
| 139 EXTENSION_MDZ, | |
| 140 EXTENSION_SHB, | |
| 141 EXTENSION_SHS, | |
| 142 EXTENSION_VSD, | |
| 143 EXTENSION_VSMACROS, | |
| 144 EXTENSION_VSS, | |
| 145 EXTENSION_VST, | |
| 146 EXTENSION_VSW, | |
| 147 EXTENSION_WS, | |
| 148 EXTENSION_WSC, | |
| 149 EXTENSION_WSH, | |
| 150 EXTENSION_XBAP, | |
| 151 EXTENSION_XNK, | |
| 152 EXTENSION_JNLP, | |
| 153 EXTENSION_PL, | |
| 154 EXTENSION_PY, | |
| 155 EXTENSION_PYC, | |
| 156 EXTENSION_PYW, | |
| 157 EXTENSION_RB, | |
| 158 EXTENSION_BASH, | |
| 159 EXTENSION_CSH, | |
| 160 EXTENSION_KSH, | |
| 161 EXTENSION_SH, | |
| 162 EXTENSION_SHAR, | |
| 163 EXTENSION_TCSH, | |
| 164 EXTENSION_COMMAND, | |
| 165 EXTENSION_DEB, | |
| 166 EXTENSION_RPM, | |
| 167 EXTENSION_DEX, | |
| 168 EXTENSION_APPREF_MS, | |
| 169 EXTENSION_GADGET, | |
| 170 EXTENSION_EFI, | |
| 171 EXTENSION_FON, | |
| 172 EXTENSION_BZIP2, | |
| 173 EXTENSION_GZIP, | |
| 174 EXTENSION_TAZ, | |
| 175 EXTENSION_TBZ, | |
| 176 EXTENSION_TBZ2, | |
| 177 EXTENSION_PARTIAL, | |
| 178 EXTENSION_SVG, | |
| 179 EXTENSION_XML, | |
| 180 EXTENSION_XRM_MS, | |
| 181 EXTENSION_XSL, | |
| 182 EXTENSION_ACTION, | |
| 183 EXTENSION_BIN, | |
| 184 EXTENSION_INX, | |
| 185 EXTENSION_IPA, | |
| 186 EXTENSION_ISU, | |
| 187 EXTENSION_JOB, | |
| 188 EXTENSION_OUT, | |
| 189 EXTENSION_PAD, | |
| 190 EXTENSION_PAF, | |
| 191 EXTENSION_RGS, | |
| 192 EXTENSION_U3P, | |
| 193 EXTENSION_VBSCRIPT, | |
| 194 EXTENSION_WORKFLOW, | |
| 195 EXTENSION_001, | |
| 196 EXTENSION_ACE, | |
| 197 EXTENSION_ARC, | |
| 198 EXTENSION_B64, | |
| 199 EXTENSION_BALZ, | |
| 200 EXTENSION_BHX, | |
| 201 EXTENSION_BZ, | |
| 202 EXTENSION_FAT, | |
| 203 EXTENSION_HFS, | |
| 204 EXTENSION_HQX, | |
| 205 EXTENSION_ISO, | |
| 206 EXTENSION_LPAQ1, | |
| 207 EXTENSION_LPAQ5, | |
| 208 EXTENSION_LPAQ8, | |
| 209 EXTENSION_MIM, | |
| 210 EXTENSION_NTFS, | |
| 211 EXTENSION_PAQ8F, | |
| 212 EXTENSION_PAQ8JD, | |
| 213 EXTENSION_PAQ8L, | |
| 214 EXTENSION_PAQ8O, | |
| 215 EXTENSION_PEA, | |
| 216 EXTENSION_PET, | |
| 217 EXTENSION_PUP, | |
| 218 EXTENSION_QUAD, | |
| 219 EXTENSION_R00, | |
| 220 EXTENSION_R01, | |
| 221 EXTENSION_R02, | |
| 222 EXTENSION_R03, | |
| 223 EXTENSION_R04, | |
| 224 EXTENSION_R05, | |
| 225 EXTENSION_R06, | |
| 226 EXTENSION_R07, | |
| 227 EXTENSION_R08, | |
| 228 EXTENSION_R09, | |
| 229 EXTENSION_R10, | |
| 230 EXTENSION_R11, | |
| 231 EXTENSION_R12, | |
| 232 EXTENSION_R13, | |
| 233 EXTENSION_R14, | |
| 234 EXTENSION_R15, | |
| 235 EXTENSION_R16, | |
| 236 EXTENSION_R17, | |
| 237 EXTENSION_R18, | |
| 238 EXTENSION_R19, | |
| 239 EXTENSION_R20, | |
| 240 EXTENSION_R21, | |
| 241 EXTENSION_R22, | |
| 242 EXTENSION_R23, | |
| 243 EXTENSION_R24, | |
| 244 EXTENSION_R25, | |
| 245 EXTENSION_R26, | |
| 246 EXTENSION_R27, | |
| 247 EXTENSION_R28, | |
| 248 EXTENSION_R29, | |
| 249 EXTENSION_SLP, | |
| 250 EXTENSION_SQUASHFS, | |
| 251 EXTENSION_SWM, | |
| 252 EXTENSION_TPZ, | |
| 253 EXTENSION_TXZ, | |
| 254 EXTENSION_TZ, | |
| 255 EXTENSION_UDF, | |
| 256 EXTENSION_UU, | |
| 257 EXTENSION_UUE, | |
| 258 EXTENSION_VHD, | |
| 259 EXTENSION_VMDK, | |
| 260 EXTENSION_WRC, | |
| 261 EXTENSION_XAR, | |
| 262 EXTENSION_XXE, | |
| 263 EXTENSION_ZIPX, | |
| 264 EXTENSION_ZPAQ, | |
| 265 EXTENSION_RELS, | |
| 266 EXTENSION_MSG, | |
| 267 EXTENSION_EML, | |
| 268 EXTENSION_RTF, | |
| 269 EXTENSION_VHDX, | |
| 270 EXTENSION_SEARCH_MS, | |
| 271 EXTENSION_IMG, | |
| 272 EXTENSION_SMI, | |
| 273 EXTENSION_SPARSEBUNDLE, | |
| 274 EXTENSION_SPARSEIMAGE, | |
| 275 EXTENSION_CDR, | |
| 276 EXTENSION_DMGPART, | |
| 277 EXTENSION_DVDR, | |
| 278 EXTENSION_DART, | |
| 279 EXTENSION_DC42, | |
| 280 EXTENSION_DISKCOPY42, | |
| 281 EXTENSION_IMGPART, | |
| 282 EXTENSION_NDIF, | |
| 283 EXTENSION_UDIF, | |
| 284 EXTENSION_TOAST, | |
| 285 | |
| 286 // New values go above this one. | |
| 287 EXTENSION_MAX | |
| 288 }; | |
| 289 | |
| 290 static_assert(EXTENSION_TOAST + 1 == EXTENSION_MAX, | |
| 291 "You must add new types to download_file_types.asciipb as " | |
| 292 "well."); | |
| 293 | |
| 294 struct SafeBrowsingFiletype { | |
| 295 const base::FilePath::CharType* const extension; | |
| 296 int uma_value; | |
| 297 bool is_supported_binary; | |
| 298 bool is_archive; | |
| 299 }; | |
| 300 | |
| 301 const SafeBrowsingFiletype kSafeBrowsingFileTypes[] = { | |
| 302 // KEEP THIS LIST SORTED! | |
| 303 {FILE_PATH_LITERAL(".001"), EXTENSION_001, true, true}, | |
| 304 {FILE_PATH_LITERAL(".7z"), EXTENSION_7Z, true, true}, | |
| 305 {FILE_PATH_LITERAL(".ace"), EXTENSION_ACE, true, true}, | |
| 306 {FILE_PATH_LITERAL(".action"), EXTENSION_ACTION, false, false}, // UMA. | |
| 307 {FILE_PATH_LITERAL(".ade"), EXTENSION_ADE, true, false}, | |
| 308 {FILE_PATH_LITERAL(".adp"), EXTENSION_ADP, true, false}, | |
| 309 {FILE_PATH_LITERAL(".apk"), EXTENSION_APK, true, false}, | |
| 310 {FILE_PATH_LITERAL(".app"), EXTENSION_APP, true, false}, | |
| 311 {FILE_PATH_LITERAL(".application"), EXTENSION_APPLICATION, true, false}, | |
| 312 {FILE_PATH_LITERAL(".appref-ms"), EXTENSION_APPREF_MS, true, false}, | |
| 313 {FILE_PATH_LITERAL(".arc"), EXTENSION_ARC, true, true}, | |
| 314 {FILE_PATH_LITERAL(".arj"), EXTENSION_ARJ, true, true}, | |
| 315 {FILE_PATH_LITERAL(".asp"), EXTENSION_ASP, true, false}, | |
| 316 {FILE_PATH_LITERAL(".asx"), EXTENSION_ASX, true, false}, | |
| 317 {FILE_PATH_LITERAL(".b64"), EXTENSION_B64, true, true}, | |
| 318 {FILE_PATH_LITERAL(".balz"), EXTENSION_BALZ, true, true}, | |
| 319 {FILE_PATH_LITERAL(".bas"), EXTENSION_BAS, true, false}, | |
| 320 {FILE_PATH_LITERAL(".bash"), EXTENSION_BASH, true, false}, | |
| 321 {FILE_PATH_LITERAL(".bat"), EXTENSION_BAT, true, false}, | |
| 322 {FILE_PATH_LITERAL(".bhx"), EXTENSION_BHX, true, true}, | |
| 323 {FILE_PATH_LITERAL(".bin"), EXTENSION_BIN, false, false}, // UMA only. | |
| 324 {FILE_PATH_LITERAL(".bz"), EXTENSION_BZ, true, true}, | |
| 325 {FILE_PATH_LITERAL(".bz2"), EXTENSION_BZ2, true, true}, | |
| 326 {FILE_PATH_LITERAL(".bzip2"), EXTENSION_BZIP2, true, true}, | |
| 327 {FILE_PATH_LITERAL(".cab"), EXTENSION_CAB, true, true}, | |
| 328 {FILE_PATH_LITERAL(".cdr"), EXTENSION_CDR, true, false}, | |
| 329 {FILE_PATH_LITERAL(".cfg"), EXTENSION_CFG, true, false}, | |
| 330 {FILE_PATH_LITERAL(".chi"), EXTENSION_CHI, true, false}, | |
| 331 {FILE_PATH_LITERAL(".chm"), EXTENSION_CHM, true, false}, | |
| 332 {FILE_PATH_LITERAL(".class"), EXTENSION_CLASS, true, false}, | |
| 333 {FILE_PATH_LITERAL(".cmd"), EXTENSION_CMD, true, false}, | |
| 334 {FILE_PATH_LITERAL(".com"), EXTENSION_COM, true, false}, | |
| 335 {FILE_PATH_LITERAL(".command"), EXTENSION_COMMAND, true, false}, | |
| 336 {FILE_PATH_LITERAL(".cpio"), EXTENSION_CPIO, true, true}, | |
| 337 {FILE_PATH_LITERAL(".cpl"), EXTENSION_CPL, true, false}, | |
| 338 {FILE_PATH_LITERAL(".crt"), EXTENSION_CRT, true, false}, | |
| 339 {FILE_PATH_LITERAL(".crx"), EXTENSION_CRX, true, false}, | |
| 340 {FILE_PATH_LITERAL(".csh"), EXTENSION_CSH, true, false}, | |
| 341 {FILE_PATH_LITERAL(".dart"), EXTENSION_DART, true, false}, | |
| 342 {FILE_PATH_LITERAL(".dc42"), EXTENSION_DC42, true, false}, | |
| 343 {FILE_PATH_LITERAL(".deb"), EXTENSION_DEB, true, false}, | |
| 344 {FILE_PATH_LITERAL(".dex"), EXTENSION_DEX, true, false}, | |
| 345 {FILE_PATH_LITERAL(".diskcopy42"), EXTENSION_DISKCOPY42, true, false}, | |
| 346 {FILE_PATH_LITERAL(".dll"), EXTENSION_DLL, true, false}, | |
| 347 {FILE_PATH_LITERAL(".dmg"), EXTENSION_DMG, true, false}, | |
| 348 {FILE_PATH_LITERAL(".dmgpart"), EXTENSION_DMGPART, true, false}, | |
| 349 {FILE_PATH_LITERAL(".drv"), EXTENSION_DRV, true, false}, | |
| 350 {FILE_PATH_LITERAL(".dvdr"), EXTENSION_DVDR, true, false}, | |
| 351 {FILE_PATH_LITERAL(".efi"), EXTENSION_EFI, true, false}, | |
| 352 {FILE_PATH_LITERAL(".eml"), EXTENSION_EML, true, false}, | |
| 353 {FILE_PATH_LITERAL(".exe"), EXTENSION_EXE, true, false}, | |
| 354 {FILE_PATH_LITERAL(".fat"), EXTENSION_FAT, true, true}, | |
| 355 {FILE_PATH_LITERAL(".fon"), EXTENSION_FON, true, false}, | |
| 356 {FILE_PATH_LITERAL(".fxp"), EXTENSION_FXP, true, false}, | |
| 357 {FILE_PATH_LITERAL(".gadget"), EXTENSION_GADGET, true, false}, | |
| 358 {FILE_PATH_LITERAL(".grp"), EXTENSION_GRP, true, false}, | |
| 359 {FILE_PATH_LITERAL(".gz"), EXTENSION_GZ, true, true}, | |
| 360 {FILE_PATH_LITERAL(".gzip"), EXTENSION_GZIP, true, true}, | |
| 361 {FILE_PATH_LITERAL(".hfs"), EXTENSION_HFS, true, true}, | |
| 362 {FILE_PATH_LITERAL(".hlp"), EXTENSION_HLP, true, false}, | |
| 363 {FILE_PATH_LITERAL(".hqx"), EXTENSION_HQX, true, true}, | |
| 364 {FILE_PATH_LITERAL(".hta"), EXTENSION_HTA, true, false}, | |
| 365 {FILE_PATH_LITERAL(".htt"), EXTENSION_HTT, true, false}, | |
| 366 {FILE_PATH_LITERAL(".img"), EXTENSION_IMG, true, false}, | |
| 367 {FILE_PATH_LITERAL(".imgpart"), EXTENSION_IMGPART, true, false}, | |
| 368 {FILE_PATH_LITERAL(".inf"), EXTENSION_INF, true, false}, | |
| 369 {FILE_PATH_LITERAL(".ini"), EXTENSION_INI, true, false}, | |
| 370 {FILE_PATH_LITERAL(".ins"), EXTENSION_INS, true, false}, | |
| 371 {FILE_PATH_LITERAL(".inx"), EXTENSION_INX, false, false}, // UMA only. | |
| 372 {FILE_PATH_LITERAL(".ipa"), EXTENSION_IPA, false, false}, // UMA only. | |
| 373 {FILE_PATH_LITERAL(".iso"), EXTENSION_ISO, true, true}, | |
| 374 {FILE_PATH_LITERAL(".isp"), EXTENSION_ISP, true, false}, | |
| 375 {FILE_PATH_LITERAL(".isu"), EXTENSION_ISU, false, false}, // UMA only. | |
| 376 {FILE_PATH_LITERAL(".jar"), EXTENSION_JAR, true, false}, | |
| 377 {FILE_PATH_LITERAL(".jnlp"), EXTENSION_JNLP, true, false}, | |
| 378 {FILE_PATH_LITERAL(".job"), EXTENSION_JOB, false, false}, // UMA only. | |
| 379 {FILE_PATH_LITERAL(".js"), EXTENSION_JS, true, false}, | |
| 380 {FILE_PATH_LITERAL(".jse"), EXTENSION_JSE, true, false}, | |
| 381 {FILE_PATH_LITERAL(".ksh"), EXTENSION_KSH, true, false}, | |
| 382 {FILE_PATH_LITERAL(".lha"), EXTENSION_LHA, true, true}, | |
| 383 {FILE_PATH_LITERAL(".lnk"), EXTENSION_LNK, true, false}, | |
| 384 {FILE_PATH_LITERAL(".local"), EXTENSION_LOCAL, true, false}, | |
| 385 {FILE_PATH_LITERAL(".lpaq1"), EXTENSION_LPAQ1, true, true}, | |
| 386 {FILE_PATH_LITERAL(".lpaq5"), EXTENSION_LPAQ5, true, true}, | |
| 387 {FILE_PATH_LITERAL(".lpaq8"), EXTENSION_LPAQ8, true, true}, | |
| 388 {FILE_PATH_LITERAL(".lzh"), EXTENSION_LZH, true, true}, | |
| 389 {FILE_PATH_LITERAL(".lzma"), EXTENSION_LZMA, true, true}, | |
| 390 {FILE_PATH_LITERAL(".mad"), EXTENSION_MAD, true, false}, | |
| 391 {FILE_PATH_LITERAL(".maf"), EXTENSION_MAF, true, false}, | |
| 392 {FILE_PATH_LITERAL(".mag"), EXTENSION_MAG, true, false}, | |
| 393 {FILE_PATH_LITERAL(".mam"), EXTENSION_MAM, true, false}, | |
| 394 {FILE_PATH_LITERAL(".manifest"), EXTENSION_MANIFEST, true, false}, | |
| 395 {FILE_PATH_LITERAL(".maq"), EXTENSION_MAQ, true, false}, | |
| 396 {FILE_PATH_LITERAL(".mar"), EXTENSION_MAR, true, false}, | |
| 397 {FILE_PATH_LITERAL(".mas"), EXTENSION_MAS, true, false}, | |
| 398 {FILE_PATH_LITERAL(".mat"), EXTENSION_MAT, true, false}, | |
| 399 {FILE_PATH_LITERAL(".mau"), EXTENSION_MAU, true, false}, | |
| 400 {FILE_PATH_LITERAL(".mav"), EXTENSION_MAV, true, false}, | |
| 401 {FILE_PATH_LITERAL(".maw"), EXTENSION_MAW, true, false}, | |
| 402 {FILE_PATH_LITERAL(".mda"), EXTENSION_MDA, true, false}, | |
| 403 {FILE_PATH_LITERAL(".mdb"), EXTENSION_MDB, true, false}, | |
| 404 {FILE_PATH_LITERAL(".mde"), EXTENSION_MDE, true, false}, | |
| 405 {FILE_PATH_LITERAL(".mdt"), EXTENSION_MDT, true, false}, | |
| 406 {FILE_PATH_LITERAL(".mdw"), EXTENSION_MDW, true, false}, | |
| 407 {FILE_PATH_LITERAL(".mdz"), EXTENSION_MDZ, true, false}, | |
| 408 {FILE_PATH_LITERAL(".mht"), EXTENSION_MHT, true, false}, | |
| 409 {FILE_PATH_LITERAL(".mhtml"), EXTENSION_MHTML, true, false}, | |
| 410 {FILE_PATH_LITERAL(".mim"), EXTENSION_MIM, true, true}, | |
| 411 {FILE_PATH_LITERAL(".mmc"), EXTENSION_MMC, true, false}, | |
| 412 {FILE_PATH_LITERAL(".mof"), EXTENSION_MOF, true, false}, | |
| 413 {FILE_PATH_LITERAL(".msc"), EXTENSION_MSC, true, false}, | |
| 414 {FILE_PATH_LITERAL(".msg"), EXTENSION_MSG, true, false}, | |
| 415 {FILE_PATH_LITERAL(".msh"), EXTENSION_MSH, true, false}, | |
| 416 {FILE_PATH_LITERAL(".msh1"), EXTENSION_MSH1, true, false}, | |
| 417 {FILE_PATH_LITERAL(".msh1xml"), EXTENSION_MSH1XML, true, false}, | |
| 418 {FILE_PATH_LITERAL(".msh2"), EXTENSION_MSH2, true, false}, | |
| 419 {FILE_PATH_LITERAL(".msh2xml"), EXTENSION_MSH2XML, true, false}, | |
| 420 {FILE_PATH_LITERAL(".mshxml"), EXTENSION_MSHXML, true, false}, | |
| 421 {FILE_PATH_LITERAL(".msi"), EXTENSION_MSI, true, false}, | |
| 422 {FILE_PATH_LITERAL(".msp"), EXTENSION_MSP, true, false}, | |
| 423 {FILE_PATH_LITERAL(".mst"), EXTENSION_MST, true, false}, | |
| 424 {FILE_PATH_LITERAL(".ndif"), EXTENSION_NDIF, true, false}, | |
| 425 {FILE_PATH_LITERAL(".ntfs"), EXTENSION_NTFS, true, true}, | |
| 426 {FILE_PATH_LITERAL(".ocx"), EXTENSION_OCX, true, false}, | |
| 427 {FILE_PATH_LITERAL(".ops"), EXTENSION_OPS, true, false}, | |
| 428 {FILE_PATH_LITERAL(".osx"), EXTENSION_OSX, true, false}, | |
| 429 {FILE_PATH_LITERAL(".out"), EXTENSION_OUT, false, false}, // UMA only. | |
| 430 {FILE_PATH_LITERAL(".pad"), EXTENSION_PAD, false, false}, // UMA only. | |
| 431 {FILE_PATH_LITERAL(".paf"), EXTENSION_PAF, false, false}, // UMA only. | |
| 432 {FILE_PATH_LITERAL(".paq8f"), EXTENSION_PAQ8F, true, true}, | |
| 433 {FILE_PATH_LITERAL(".paq8jd"), EXTENSION_PAQ8JD, true, true}, | |
| 434 {FILE_PATH_LITERAL(".paq8l"), EXTENSION_PAQ8L, true, true}, | |
| 435 {FILE_PATH_LITERAL(".paq8o"), EXTENSION_PAQ8O, true, true}, | |
| 436 {FILE_PATH_LITERAL(".partial"), EXTENSION_PARTIAL, true, false}, | |
| 437 {FILE_PATH_LITERAL(".pcd"), EXTENSION_PCD, true, false}, | |
| 438 {FILE_PATH_LITERAL(".pea"), EXTENSION_PEA, true, true}, | |
| 439 {FILE_PATH_LITERAL(".pet"), EXTENSION_PET, true, true}, | |
| 440 {FILE_PATH_LITERAL(".pif"), EXTENSION_PIF, true, false}, | |
| 441 {FILE_PATH_LITERAL(".pkg"), EXTENSION_PKG, true, false}, | |
| 442 {FILE_PATH_LITERAL(".pl"), EXTENSION_PL, true, false}, | |
| 443 {FILE_PATH_LITERAL(".plg"), EXTENSION_PLG, true, false}, | |
| 444 {FILE_PATH_LITERAL(".prf"), EXTENSION_PRF, true, false}, | |
| 445 {FILE_PATH_LITERAL(".prg"), EXTENSION_PRG, true, false}, | |
| 446 {FILE_PATH_LITERAL(".ps1"), EXTENSION_PS1, true, false}, | |
| 447 {FILE_PATH_LITERAL(".ps1xml"), EXTENSION_PS1XML, true, false}, | |
| 448 {FILE_PATH_LITERAL(".ps2"), EXTENSION_PS2, true, false}, | |
| 449 {FILE_PATH_LITERAL(".ps2xml"), EXTENSION_PS2XML, true, false}, | |
| 450 {FILE_PATH_LITERAL(".psc1"), EXTENSION_PSC1, true, false}, | |
| 451 {FILE_PATH_LITERAL(".psc2"), EXTENSION_PSC2, true, false}, | |
| 452 {FILE_PATH_LITERAL(".pst"), EXTENSION_PST, true, false}, | |
| 453 {FILE_PATH_LITERAL(".pup"), EXTENSION_PUP, true, true}, | |
| 454 {FILE_PATH_LITERAL(".py"), EXTENSION_PY, true, false}, | |
| 455 {FILE_PATH_LITERAL(".pyc"), EXTENSION_PYC, true, false}, | |
| 456 {FILE_PATH_LITERAL(".pyw"), EXTENSION_PYW, true, false}, | |
| 457 {FILE_PATH_LITERAL(".quad"), EXTENSION_QUAD, true, true}, | |
| 458 {FILE_PATH_LITERAL(".r00"), EXTENSION_R00, true, true}, | |
| 459 {FILE_PATH_LITERAL(".r01"), EXTENSION_R01, true, true}, | |
| 460 {FILE_PATH_LITERAL(".r02"), EXTENSION_R02, true, true}, | |
| 461 {FILE_PATH_LITERAL(".r03"), EXTENSION_R03, true, true}, | |
| 462 {FILE_PATH_LITERAL(".r04"), EXTENSION_R04, true, true}, | |
| 463 {FILE_PATH_LITERAL(".r05"), EXTENSION_R05, true, true}, | |
| 464 {FILE_PATH_LITERAL(".r06"), EXTENSION_R06, true, true}, | |
| 465 {FILE_PATH_LITERAL(".r07"), EXTENSION_R07, true, true}, | |
| 466 {FILE_PATH_LITERAL(".r08"), EXTENSION_R08, true, true}, | |
| 467 {FILE_PATH_LITERAL(".r09"), EXTENSION_R09, true, true}, | |
| 468 {FILE_PATH_LITERAL(".r10"), EXTENSION_R10, true, true}, | |
| 469 {FILE_PATH_LITERAL(".r11"), EXTENSION_R11, true, true}, | |
| 470 {FILE_PATH_LITERAL(".r12"), EXTENSION_R12, true, true}, | |
| 471 {FILE_PATH_LITERAL(".r13"), EXTENSION_R13, true, true}, | |
| 472 {FILE_PATH_LITERAL(".r14"), EXTENSION_R14, true, true}, | |
| 473 {FILE_PATH_LITERAL(".r15"), EXTENSION_R15, true, true}, | |
| 474 {FILE_PATH_LITERAL(".r16"), EXTENSION_R16, true, true}, | |
| 475 {FILE_PATH_LITERAL(".r17"), EXTENSION_R17, true, true}, | |
| 476 {FILE_PATH_LITERAL(".r18"), EXTENSION_R18, true, true}, | |
| 477 {FILE_PATH_LITERAL(".r19"), EXTENSION_R19, true, true}, | |
| 478 {FILE_PATH_LITERAL(".r20"), EXTENSION_R20, true, true}, | |
| 479 {FILE_PATH_LITERAL(".r21"), EXTENSION_R21, true, true}, | |
| 480 {FILE_PATH_LITERAL(".r22"), EXTENSION_R22, true, true}, | |
| 481 {FILE_PATH_LITERAL(".r23"), EXTENSION_R23, true, true}, | |
| 482 {FILE_PATH_LITERAL(".r24"), EXTENSION_R24, true, true}, | |
| 483 {FILE_PATH_LITERAL(".r25"), EXTENSION_R25, true, true}, | |
| 484 {FILE_PATH_LITERAL(".r26"), EXTENSION_R26, true, true}, | |
| 485 {FILE_PATH_LITERAL(".r27"), EXTENSION_R27, true, true}, | |
| 486 {FILE_PATH_LITERAL(".r28"), EXTENSION_R28, true, true}, | |
| 487 {FILE_PATH_LITERAL(".r29"), EXTENSION_R29, true, true}, | |
| 488 {FILE_PATH_LITERAL(".rar"), EXTENSION_RAR, true, true}, | |
| 489 {FILE_PATH_LITERAL(".rb"), EXTENSION_RB, true, false}, | |
| 490 {FILE_PATH_LITERAL(".rels"), EXTENSION_RELS, true, false}, | |
| 491 {FILE_PATH_LITERAL(".reg"), EXTENSION_REG, true, false}, | |
| 492 {FILE_PATH_LITERAL(".rgs"), EXTENSION_RGS, false, false}, // UMA only. | |
| 493 {FILE_PATH_LITERAL(".rpm"), EXTENSION_RPM, true, false}, | |
| 494 {FILE_PATH_LITERAL(".rtf"), EXTENSION_RTF, false, false}, // UMA only. | |
| 495 {FILE_PATH_LITERAL(".scf"), EXTENSION_SCF, true, false}, | |
| 496 {FILE_PATH_LITERAL(".scr"), EXTENSION_SCR, true, false}, | |
| 497 {FILE_PATH_LITERAL(".sct"), EXTENSION_SCT, true, false}, | |
| 498 {FILE_PATH_LITERAL(".search-ms"), EXTENSION_SEARCH_MS, true, false}, | |
| 499 {FILE_PATH_LITERAL(".sh"), EXTENSION_SH, true, false}, | |
| 500 {FILE_PATH_LITERAL(".shar"), EXTENSION_SHAR, true, false}, | |
| 501 {FILE_PATH_LITERAL(".shb"), EXTENSION_SHB, true, false}, | |
| 502 {FILE_PATH_LITERAL(".shs"), EXTENSION_SHS, true, false}, | |
| 503 {FILE_PATH_LITERAL(".slp"), EXTENSION_SLP, true, true}, | |
| 504 {FILE_PATH_LITERAL(".smi"), EXTENSION_SMI, true, false}, | |
| 505 {FILE_PATH_LITERAL(".sparsebundle"), EXTENSION_SPARSEBUNDLE, true, false}, | |
| 506 {FILE_PATH_LITERAL(".sparseimage"), EXTENSION_SPARSEIMAGE, true, false}, | |
| 507 {FILE_PATH_LITERAL(".spl"), EXTENSION_SPL, true, false}, | |
| 508 {FILE_PATH_LITERAL(".squashfs"), EXTENSION_SQUASHFS, true, true}, | |
| 509 {FILE_PATH_LITERAL(".svg"), EXTENSION_SVG, true, false}, | |
| 510 {FILE_PATH_LITERAL(".swf"), EXTENSION_SWF, true, false}, | |
| 511 {FILE_PATH_LITERAL(".swm"), EXTENSION_SWM, true, true}, | |
| 512 {FILE_PATH_LITERAL(".sys"), EXTENSION_SYS, true, false}, | |
| 513 {FILE_PATH_LITERAL(".tar"), EXTENSION_TAR, true, true}, | |
| 514 {FILE_PATH_LITERAL(".taz"), EXTENSION_TAZ, true, true}, | |
| 515 {FILE_PATH_LITERAL(".tbz"), EXTENSION_TBZ, true, true}, | |
| 516 {FILE_PATH_LITERAL(".tbz2"), EXTENSION_TBZ2, true, true}, | |
| 517 {FILE_PATH_LITERAL(".tcsh"), EXTENSION_TCSH, true, false}, | |
| 518 {FILE_PATH_LITERAL(".tgz"), EXTENSION_TGZ, true, true}, | |
| 519 {FILE_PATH_LITERAL(".toast"), EXTENSION_TOAST, true, false}, | |
| 520 {FILE_PATH_LITERAL(".torrent"), EXTENSION_TORRENT, true, false}, | |
| 521 {FILE_PATH_LITERAL(".tpz"), EXTENSION_TPZ, true, true}, | |
| 522 {FILE_PATH_LITERAL(".txz"), EXTENSION_TXZ, true, true}, | |
| 523 {FILE_PATH_LITERAL(".tz"), EXTENSION_TZ, true, true}, | |
| 524 {FILE_PATH_LITERAL(".u3p"), EXTENSION_U3P, false, false}, // UMA only. | |
| 525 {FILE_PATH_LITERAL(".udf"), EXTENSION_UDF, true, true}, | |
| 526 {FILE_PATH_LITERAL(".udif"), EXTENSION_UDIF, true, false}, | |
| 527 {FILE_PATH_LITERAL(".url"), EXTENSION_URL, true, false}, | |
| 528 {FILE_PATH_LITERAL(".uu"), EXTENSION_UU, true, true}, | |
| 529 {FILE_PATH_LITERAL(".uue"), EXTENSION_UUE, true, true}, | |
| 530 {FILE_PATH_LITERAL(".vb"), EXTENSION_VB, true, false}, | |
| 531 {FILE_PATH_LITERAL(".vbe"), EXTENSION_VBE, true, false}, | |
| 532 {FILE_PATH_LITERAL(".vbs"), EXTENSION_VBS, true, false}, | |
| 533 {FILE_PATH_LITERAL(".vbscript"), EXTENSION_VBSCRIPT, false, false}, // UMA. | |
| 534 {FILE_PATH_LITERAL(".vhd"), EXTENSION_VHD, true, true}, | |
| 535 {FILE_PATH_LITERAL(".vhdx"), EXTENSION_VHDX, true, true}, | |
| 536 {FILE_PATH_LITERAL(".vmdk"), EXTENSION_VMDK, true, true}, | |
| 537 {FILE_PATH_LITERAL(".vsd"), EXTENSION_VSD, true, false}, | |
| 538 {FILE_PATH_LITERAL(".vsmacros"), EXTENSION_VSMACROS, true, false}, | |
| 539 {FILE_PATH_LITERAL(".vss"), EXTENSION_VSS, true, false}, | |
| 540 {FILE_PATH_LITERAL(".vst"), EXTENSION_VST, true, false}, | |
| 541 {FILE_PATH_LITERAL(".vsw"), EXTENSION_VSW, true, false}, | |
| 542 {FILE_PATH_LITERAL(".website"), EXTENSION_WEBSITE, true, false}, | |
| 543 {FILE_PATH_LITERAL(".wim"), EXTENSION_WIM, true, true}, | |
| 544 {FILE_PATH_LITERAL(".workflow"), EXTENSION_WORKFLOW, false, false}, // UMA. | |
| 545 {FILE_PATH_LITERAL(".wrc"), EXTENSION_WRC, true, true}, | |
| 546 {FILE_PATH_LITERAL(".ws"), EXTENSION_WS, true, false}, | |
| 547 {FILE_PATH_LITERAL(".wsc"), EXTENSION_WSC, true, false}, | |
| 548 {FILE_PATH_LITERAL(".wsf"), EXTENSION_WSF, true, false}, | |
| 549 {FILE_PATH_LITERAL(".wsh"), EXTENSION_WSH, true, false}, | |
| 550 {FILE_PATH_LITERAL(".xar"), EXTENSION_XAR, true, true}, | |
| 551 {FILE_PATH_LITERAL(".xbap"), EXTENSION_XBAP, true, false}, | |
| 552 {FILE_PATH_LITERAL(".xml"), EXTENSION_XML, true, false}, | |
| 553 {FILE_PATH_LITERAL(".xnk"), EXTENSION_XNK, true, false}, | |
| 554 {FILE_PATH_LITERAL(".xrm-ms"), EXTENSION_XRM_MS, true, false}, | |
| 555 {FILE_PATH_LITERAL(".xsl"), EXTENSION_XSL, true, false}, | |
| 556 {FILE_PATH_LITERAL(".xxe"), EXTENSION_XXE, true, true}, | |
| 557 {FILE_PATH_LITERAL(".xz"), EXTENSION_XZ, true, true}, | |
| 558 {FILE_PATH_LITERAL(".z"), EXTENSION_Z, true, true}, | |
| 559 {FILE_PATH_LITERAL(".zip"), EXTENSION_ZIP, true, true}, | |
| 560 {FILE_PATH_LITERAL(".zipx"), EXTENSION_ZIPX, true, true}, | |
| 561 {FILE_PATH_LITERAL(".zpaq"), EXTENSION_ZPAQ, true, true}, | |
| 562 }; | |
| 563 | |
| 564 const SafeBrowsingFiletype& GetFileType(const base::FilePath& file) { | |
| 565 static const SafeBrowsingFiletype kOther = { | |
| 566 nullptr, EXTENSION_OTHER, false, false | |
| 567 }; | |
| 568 | |
| 569 base::FilePath::StringType extension = GetFileExtension(file); | |
| 570 SafeBrowsingFiletype needle = {extension.c_str()}; | |
| 571 | |
| 572 const auto begin = kSafeBrowsingFileTypes; | |
| 573 const auto end = kSafeBrowsingFileTypes + arraysize(kSafeBrowsingFileTypes); | |
| 574 const auto result = std::lower_bound( | |
| 575 begin, end, needle, | |
| 576 [](const SafeBrowsingFiletype& left, const SafeBrowsingFiletype& right) { | |
| 577 return base::FilePath::CompareLessIgnoreCase(left.extension, | |
| 578 right.extension); | |
| 579 }); | |
| 580 if (result == end || | |
| 581 !base::FilePath::CompareEqualIgnoreCase(needle.extension, | |
| 582 result->extension)) | |
| 583 return kOther; | |
| 584 return *result; | |
| 585 } | |
| 586 | |
| 587 } // namespace | |
| 588 | |
| 589 const int kSBClientDownloadExtensionsMax = EXTENSION_MAX; | |
| 590 | |
| 591 const base::FilePath::StringType GetFileExtension(const base::FilePath& file) { | |
| 592 // Remove trailing space and period characters from the extension. | |
| 593 base::FilePath::StringType file_basename = file.BaseName().value(); | |
| 594 base::FilePath::StringPieceType trimmed_filename = base::TrimString( | |
| 595 file_basename, FILE_PATH_LITERAL(". "), base::TRIM_TRAILING); | |
| 596 return base::FilePath(trimmed_filename).FinalExtension(); | |
| 597 } | |
| 598 | |
| 599 bool IsArchiveFile(const base::FilePath& file) { | |
| 600 // List of interesting archive file formats in kSafeBrowsingFileTypes is by no | |
| 601 // means exhaustive, but are currently file types that Safe Browsing would | |
| 602 // like to see pings for due to the possibility of them being used as wrapper | |
| 603 // formats for malicious payloads. | |
| 604 return GetFileType(file).is_archive; | |
| 605 } | |
| 606 | |
| 607 bool IsSupportedBinaryFile(const base::FilePath& file) { | |
| 608 return GetFileType(file).is_supported_binary; | |
| 609 } | |
| 610 | |
| 611 ClientDownloadRequest::DownloadType GetDownloadType( | 17 ClientDownloadRequest::DownloadType GetDownloadType( |
| 612 const base::FilePath& file) { | 18 const base::FilePath& file) { |
| 613 DCHECK(IsSupportedBinaryFile(file)); | 19 // TODO(nparker): Put all of this logic into the FileTypePolicies |
| 20 // protobuf. |
| 614 if (file.MatchesExtension(FILE_PATH_LITERAL(".apk"))) | 21 if (file.MatchesExtension(FILE_PATH_LITERAL(".apk"))) |
| 615 return ClientDownloadRequest::ANDROID_APK; | 22 return ClientDownloadRequest::ANDROID_APK; |
| 616 else if (file.MatchesExtension(FILE_PATH_LITERAL(".crx"))) | 23 else if (file.MatchesExtension(FILE_PATH_LITERAL(".crx"))) |
| 617 return ClientDownloadRequest::CHROME_EXTENSION; | 24 return ClientDownloadRequest::CHROME_EXTENSION; |
| 618 else if (file.MatchesExtension(FILE_PATH_LITERAL(".zip"))) | 25 else if (file.MatchesExtension(FILE_PATH_LITERAL(".zip"))) |
| 619 // DownloadProtectionService doesn't send a ClientDownloadRequest for ZIP | 26 // DownloadProtectionService doesn't send a ClientDownloadRequest for ZIP |
| 620 // files unless they contain either executables or archives. The resulting | 27 // files unless they contain either executables or archives. The resulting |
| 621 // DownloadType is either ZIPPED_EXECUTABLE or ZIPPED_ARCHIVE respectively. | 28 // DownloadType is either ZIPPED_EXECUTABLE or ZIPPED_ARCHIVE respectively. |
| 622 // This function will return ZIPPED_EXECUTABLE for ZIP files as a | 29 // This function will return ZIPPED_EXECUTABLE for ZIP files as a |
| 623 // placeholder. The correct DownloadType will be determined based on the | 30 // placeholder. The correct DownloadType will be determined based on the |
| (...skipping 12 matching lines...) Expand all Loading... |
| 636 file.MatchesExtension(FILE_PATH_LITERAL(".dart")) || | 43 file.MatchesExtension(FILE_PATH_LITERAL(".dart")) || |
| 637 file.MatchesExtension(FILE_PATH_LITERAL(".dc42")) || | 44 file.MatchesExtension(FILE_PATH_LITERAL(".dc42")) || |
| 638 file.MatchesExtension(FILE_PATH_LITERAL(".diskcopy42")) || | 45 file.MatchesExtension(FILE_PATH_LITERAL(".diskcopy42")) || |
| 639 file.MatchesExtension(FILE_PATH_LITERAL(".imgpart")) || | 46 file.MatchesExtension(FILE_PATH_LITERAL(".imgpart")) || |
| 640 file.MatchesExtension(FILE_PATH_LITERAL(".ndif")) || | 47 file.MatchesExtension(FILE_PATH_LITERAL(".ndif")) || |
| 641 file.MatchesExtension(FILE_PATH_LITERAL(".udif")) || | 48 file.MatchesExtension(FILE_PATH_LITERAL(".udif")) || |
| 642 file.MatchesExtension(FILE_PATH_LITERAL(".toast")) || | 49 file.MatchesExtension(FILE_PATH_LITERAL(".toast")) || |
| 643 file.MatchesExtension(FILE_PATH_LITERAL(".sparsebundle")) || | 50 file.MatchesExtension(FILE_PATH_LITERAL(".sparsebundle")) || |
| 644 file.MatchesExtension(FILE_PATH_LITERAL(".sparseimage"))) | 51 file.MatchesExtension(FILE_PATH_LITERAL(".sparseimage"))) |
| 645 return ClientDownloadRequest::MAC_EXECUTABLE; | 52 return ClientDownloadRequest::MAC_EXECUTABLE; |
| 646 else if (IsArchiveFile(file)) | 53 else if (FileTypePolicies::GlobalInstance()->IsArchiveFile(file)) |
| 647 return ClientDownloadRequest::ARCHIVE; | 54 return ClientDownloadRequest::ARCHIVE; |
| 648 return ClientDownloadRequest::WIN_EXECUTABLE; | 55 return ClientDownloadRequest::WIN_EXECUTABLE; |
| 649 } | 56 } |
| 650 | 57 |
| 651 int GetSBClientDownloadExtensionValueForUMA(const base::FilePath& file) { | |
| 652 return GetFileType(file).uma_value; | |
| 653 } | |
| 654 | |
| 655 } // namespace download_protection_util | 58 } // namespace download_protection_util |
| 656 } // namespace safe_browsing | 59 } // namespace safe_browsing |
| OLD | NEW |