| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "extensions/common/csp_validator.h" | 5 #include "extensions/common/csp_validator.h" |
| 6 #include "extensions/common/error_utils.h" |
| 7 #include "extensions/common/install_warning.h" |
| 8 #include "extensions/common/manifest_constants.h" |
| 6 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 7 | 10 |
| 8 using extensions::csp_validator::ContentSecurityPolicyIsLegal; | 11 using extensions::csp_validator::ContentSecurityPolicyIsLegal; |
| 9 using extensions::csp_validator::ContentSecurityPolicyIsSecure; | 12 using extensions::csp_validator::ContentSecurityPolicyIsSecure; |
| 10 using extensions::csp_validator::ContentSecurityPolicyIsSandboxed; | 13 using extensions::csp_validator::ContentSecurityPolicyIsSandboxed; |
| 11 using extensions::csp_validator::OPTIONS_NONE; | 14 using extensions::csp_validator::OPTIONS_NONE; |
| 12 using extensions::csp_validator::OPTIONS_ALLOW_UNSAFE_EVAL; | 15 using extensions::csp_validator::OPTIONS_ALLOW_UNSAFE_EVAL; |
| 13 using extensions::csp_validator::OPTIONS_ALLOW_INSECURE_OBJECT_SRC; | 16 using extensions::csp_validator::OPTIONS_ALLOW_INSECURE_OBJECT_SRC; |
| 17 using extensions::ErrorUtils; |
| 18 using extensions::InstallWarning; |
| 14 using extensions::Manifest; | 19 using extensions::Manifest; |
| 15 | 20 |
| 21 namespace { |
| 22 |
| 23 std::string InsecureValueWarning(const std::string& directive, |
| 24 const std::string& value) { |
| 25 return ErrorUtils::FormatErrorMessage( |
| 26 extensions::manifest_errors::kInvalidCSPInsecureValue, value, directive); |
| 27 } |
| 28 |
| 29 std::string MissingSecureSrcWarning(const std::string& directive) { |
| 30 return ErrorUtils::FormatErrorMessage( |
| 31 extensions::manifest_errors::kInvalidCSPMissingSecureSrc, directive); |
| 32 } |
| 33 |
| 34 }; // namespace |
| 35 |
| 16 TEST(ExtensionCSPValidator, IsLegal) { | 36 TEST(ExtensionCSPValidator, IsLegal) { |
| 17 EXPECT_TRUE(ContentSecurityPolicyIsLegal("foo")); | 37 EXPECT_TRUE(ContentSecurityPolicyIsLegal("foo")); |
| 18 EXPECT_TRUE(ContentSecurityPolicyIsLegal( | 38 EXPECT_TRUE(ContentSecurityPolicyIsLegal( |
| 19 "default-src 'self'; script-src http://www.google.com")); | 39 "default-src 'self'; script-src http://www.google.com")); |
| 20 EXPECT_FALSE(ContentSecurityPolicyIsLegal( | 40 EXPECT_FALSE(ContentSecurityPolicyIsLegal( |
| 21 "default-src 'self';\nscript-src http://www.google.com")); | 41 "default-src 'self';\nscript-src http://www.google.com")); |
| 22 EXPECT_FALSE(ContentSecurityPolicyIsLegal( | 42 EXPECT_FALSE(ContentSecurityPolicyIsLegal( |
| 23 "default-src 'self';\rscript-src http://www.google.com")); | 43 "default-src 'self';\rscript-src http://www.google.com")); |
| 24 EXPECT_FALSE(ContentSecurityPolicyIsLegal( | 44 EXPECT_FALSE(ContentSecurityPolicyIsLegal( |
| 25 "default-src 'self';,script-src http://www.google.com")); | 45 "default-src 'self';,script-src http://www.google.com")); |
| 26 } | 46 } |
| 27 | 47 |
| 28 TEST(ExtensionCSPValidator, IsSecure) { | 48 TEST(ExtensionCSPValidator, IsSecure) { |
| 29 EXPECT_FALSE( | 49 std::string csp; |
| 30 ContentSecurityPolicyIsSecure(std::string(), OPTIONS_ALLOW_UNSAFE_EVAL)); | 50 std::vector<InstallWarning> warnings; |
| 31 EXPECT_FALSE(ContentSecurityPolicyIsSecure("img-src https://google.com", | 51 |
| 32 OPTIONS_ALLOW_UNSAFE_EVAL)); | 52 warnings.push_back(InstallWarning("should not be removed")); |
| 33 | 53 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 34 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 54 std::string(), OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 35 "default-src *", OPTIONS_ALLOW_UNSAFE_EVAL)); | 55 EXPECT_EQ("script-src 'self' chrome-extension-resource:; object-src 'self';", |
| 36 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 56 csp); |
| 37 "default-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 57 EXPECT_EQ(3U, warnings.size()); |
| 38 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 58 // ContentSecurityPolicyIsSecure should append (not replace) warnings. |
| 39 "default-src 'none'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 59 EXPECT_EQ("should not be removed", warnings[0].message); |
| 40 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 60 EXPECT_EQ(MissingSecureSrcWarning("script-src"), warnings[1].message); |
| 41 "default-src 'self' ftp://google.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 61 EXPECT_EQ(MissingSecureSrcWarning("object-src"), warnings[2].message); |
| 42 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 62 warnings.clear(); |
| 43 "default-src 'self' https://google.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 63 |
| 44 | 64 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 45 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 65 "img-src https://google.com", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 46 "default-src *; default-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 66 &warnings)); |
| 47 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 67 EXPECT_EQ("img-src https://google.com; script-src 'self'" |
| 48 "default-src 'self'; default-src *", OPTIONS_ALLOW_UNSAFE_EVAL)); | 68 " chrome-extension-resource:; object-src 'self';", csp); |
| 69 EXPECT_EQ(2U, warnings.size()); |
| 70 EXPECT_EQ(MissingSecureSrcWarning("script-src"), warnings[0].message); |
| 71 EXPECT_EQ(MissingSecureSrcWarning("object-src"), warnings[1].message); |
| 72 warnings.clear(); |
| 73 |
| 74 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 75 "script-src a b", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 76 EXPECT_EQ("script-src; object-src 'self';", csp); |
| 77 EXPECT_EQ(3U, warnings.size()); |
| 78 EXPECT_EQ(InsecureValueWarning("script-src", "a"), warnings[0].message); |
| 79 EXPECT_EQ(InsecureValueWarning("script-src", "b"), warnings[1].message); |
| 80 EXPECT_EQ(MissingSecureSrcWarning("object-src"), warnings[2].message); |
| 81 warnings.clear(); |
| 82 |
| 83 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 84 "default-src *", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 85 EXPECT_EQ("default-src;", csp); |
| 86 EXPECT_EQ(1U, warnings.size()); |
| 87 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 88 warnings.clear(); |
| 89 |
| 90 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 91 "default-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 92 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 93 "default-src 'none'", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 94 |
| 95 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 96 "default-src 'self' ftp://google.com", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 97 &warnings)); |
| 98 EXPECT_EQ("default-src 'self';", csp); |
| 99 EXPECT_EQ(1U, warnings.size()); |
| 100 EXPECT_EQ(InsecureValueWarning("default-src", "ftp://google.com"), |
| 101 warnings[0].message); |
| 102 warnings.clear(); |
| 103 |
| 104 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 105 "default-src 'self' https://google.com", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 106 NULL)); |
| 107 |
| 108 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 109 "default-src *; default-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 110 &warnings)); |
| 111 EXPECT_EQ("default-src; default-src 'self';", csp); |
| 112 EXPECT_EQ(1U, warnings.size()); |
| 113 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 114 warnings.clear(); |
| 115 |
| 116 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 117 "default-src 'self'; default-src *", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 118 NULL)); |
| 49 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 119 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 50 "default-src 'self'; default-src *; script-src *; script-src 'self'", | 120 "default-src 'self'; default-src *; script-src *; script-src 'self'", |
| 51 OPTIONS_ALLOW_UNSAFE_EVAL)); | 121 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 122 EXPECT_EQ("default-src 'self'; default-src; script-src; script-src 'self';", |
| 123 csp); |
| 124 // No warning about "object-src *" because it comes after "object-src 'self'". |
| 125 EXPECT_EQ(1U, warnings.size()); |
| 126 EXPECT_EQ(InsecureValueWarning("script-src", "*"), warnings[0].message); |
| 127 warnings.clear(); |
| 128 |
| 52 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 129 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 53 "default-src 'self'; default-src *; script-src 'self'; script-src *", | 130 "default-src 'self'; default-src *; script-src 'self'; script-src *", |
| 54 OPTIONS_ALLOW_UNSAFE_EVAL)); | 131 OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 55 | 132 |
| 56 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 133 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 57 "default-src *; script-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 134 "default-src *; script-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 135 &warnings)); |
| 136 EXPECT_EQ("default-src; script-src 'self';", csp); |
| 137 EXPECT_EQ(1U, warnings.size()); |
| 138 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 139 warnings.clear(); |
| 140 |
| 58 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 141 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 59 "default-src *; script-src 'self'; img-src 'self'", | 142 "default-src *; script-src 'self'; img-src 'self'", |
| 60 OPTIONS_ALLOW_UNSAFE_EVAL)); | 143 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 144 EXPECT_EQ("default-src; script-src 'self'; img-src 'self';", csp); |
| 145 EXPECT_EQ(1U, warnings.size()); |
| 146 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 147 warnings.clear(); |
| 148 |
| 61 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 149 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 62 "default-src *; script-src 'self'; object-src 'self'", | 150 "default-src *; script-src 'self'; object-src 'self'", |
| 63 OPTIONS_ALLOW_UNSAFE_EVAL)); | 151 OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 64 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 152 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 65 "script-src 'self'; object-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 153 "script-src 'self'; object-src 'self'", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 66 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 154 NULL)); |
| 67 "default-src 'unsafe-eval'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 155 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 68 | 156 "default-src 'unsafe-eval'", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 69 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 157 |
| 70 "default-src 'unsafe-eval'", OPTIONS_NONE)); | 158 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 71 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 159 "default-src 'unsafe-eval'", OPTIONS_NONE, &csp, &warnings)); |
| 72 "default-src 'unsafe-inline'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 160 EXPECT_EQ("default-src;", csp); |
| 73 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 161 EXPECT_EQ(1U, warnings.size()); |
| 74 "default-src 'unsafe-inline' 'none'", OPTIONS_ALLOW_UNSAFE_EVAL)); | 162 EXPECT_EQ(InsecureValueWarning("default-src", "'unsafe-eval'"), |
| 75 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 163 warnings[0].message); |
| 76 "default-src 'self' http://google.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 164 warnings.clear(); |
| 77 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 165 |
| 78 "default-src 'self' https://google.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 166 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 79 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 167 "default-src 'unsafe-inline'", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 80 "default-src 'self' chrome://resources", OPTIONS_ALLOW_UNSAFE_EVAL)); | 168 &warnings)); |
| 169 EXPECT_EQ("default-src;", csp); |
| 170 EXPECT_EQ(1U, warnings.size()); |
| 171 EXPECT_EQ(InsecureValueWarning("default-src", "'unsafe-inline'"), |
| 172 warnings[0].message); |
| 173 warnings.clear(); |
| 174 |
| 175 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 176 "default-src 'unsafe-inline' 'none'", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 177 &warnings)); |
| 178 EXPECT_EQ("default-src 'none';", csp); |
| 179 EXPECT_EQ(1U, warnings.size()); |
| 180 EXPECT_EQ(InsecureValueWarning("default-src", "'unsafe-inline'"), |
| 181 warnings[0].message); |
| 182 warnings.clear(); |
| 183 |
| 184 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 185 "default-src 'self' http://google.com", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 186 &warnings)); |
| 187 EXPECT_EQ("default-src 'self';", csp); |
| 188 EXPECT_EQ(1U, warnings.size()); |
| 189 EXPECT_EQ(InsecureValueWarning("default-src", "http://google.com"), |
| 190 warnings[0].message); |
| 191 warnings.clear(); |
| 192 |
| 193 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 194 "default-src 'self' https://google.com", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 195 NULL)); |
| 196 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 197 "default-src 'self' chrome://resources", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 198 NULL)); |
| 81 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 199 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 82 "default-src 'self' chrome-extension://aabbcc", | 200 "default-src 'self' chrome-extension://aabbcc", |
| 83 OPTIONS_ALLOW_UNSAFE_EVAL)); | 201 OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 84 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 202 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 85 "default-src 'self' chrome-extension-resource://aabbcc", | 203 "default-src 'self' chrome-extension-resource://aabbcc", |
| 86 OPTIONS_ALLOW_UNSAFE_EVAL)); | 204 OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 87 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 205 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 88 "default-src 'self' https:", OPTIONS_ALLOW_UNSAFE_EVAL)); | 206 "default-src 'self' https:", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 89 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 207 EXPECT_EQ("default-src 'self';", csp); |
| 90 "default-src 'self' http:", OPTIONS_ALLOW_UNSAFE_EVAL)); | 208 EXPECT_EQ(1U, warnings.size()); |
| 91 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 209 EXPECT_EQ(InsecureValueWarning("default-src", "https:"), warnings[0].message); |
| 92 "default-src 'self' google.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 210 warnings.clear(); |
| 93 | 211 |
| 94 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 212 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 95 "default-src 'self' *", OPTIONS_ALLOW_UNSAFE_EVAL)); | 213 "default-src 'self' http:", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 96 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 214 EXPECT_EQ("default-src 'self';", csp); |
| 97 "default-src 'self' *:*", OPTIONS_ALLOW_UNSAFE_EVAL)); | 215 EXPECT_EQ(1U, warnings.size()); |
| 98 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 216 EXPECT_EQ(InsecureValueWarning("default-src", "http:"), warnings[0].message); |
| 99 "default-src 'self' *:*/", OPTIONS_ALLOW_UNSAFE_EVAL)); | 217 warnings.clear(); |
| 100 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 218 |
| 101 "default-src 'self' *:*/path", OPTIONS_ALLOW_UNSAFE_EVAL)); | 219 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 102 // "https://" is an invalid CSP, so it will be ignored by Blink. | 220 "default-src 'self' google.com", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 103 // TODO(robwu): Change to EXPECT_FALSE once http://crbug.com/434773 is fixed. | 221 &warnings)); |
| 104 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 222 EXPECT_EQ("default-src 'self';", csp); |
| 105 "default-src 'self' https://", OPTIONS_ALLOW_UNSAFE_EVAL)); | 223 EXPECT_EQ(1U, warnings.size()); |
| 106 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 224 EXPECT_EQ(InsecureValueWarning("default-src", "google.com"), |
| 107 "default-src 'self' https://*:*", OPTIONS_ALLOW_UNSAFE_EVAL)); | 225 warnings[0].message); |
| 108 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 226 warnings.clear(); |
| 109 "default-src 'self' https://*:*/", OPTIONS_ALLOW_UNSAFE_EVAL)); | 227 |
| 110 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 228 |
| 111 "default-src 'self' https://*:*/path", OPTIONS_ALLOW_UNSAFE_EVAL)); | 229 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 112 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 230 "default-src 'self' *", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 113 "default-src 'self' https://*.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 231 EXPECT_EQ("default-src 'self';", csp); |
| 114 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 232 EXPECT_EQ(1U, warnings.size()); |
| 115 "default-src 'self' https://*.*.google.com/", OPTIONS_ALLOW_UNSAFE_EVAL)); | 233 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 116 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 234 warnings.clear(); |
| 117 "default-src 'self' https://*.*.google.com:*/", | 235 |
| 118 OPTIONS_ALLOW_UNSAFE_EVAL)); | 236 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 119 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 237 "default-src 'self' *:*", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 120 "default-src 'self' https://www.*.google.com/", | 238 EXPECT_EQ("default-src 'self';", csp); |
| 121 OPTIONS_ALLOW_UNSAFE_EVAL)); | 239 EXPECT_EQ(1U, warnings.size()); |
| 240 EXPECT_EQ(InsecureValueWarning("default-src", "*:*"), warnings[0].message); |
| 241 warnings.clear(); |
| 242 |
| 243 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 244 "default-src 'self' *:*/", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 245 EXPECT_EQ("default-src 'self';", csp); |
| 246 EXPECT_EQ(1U, warnings.size()); |
| 247 EXPECT_EQ(InsecureValueWarning("default-src", "*:*/"), warnings[0].message); |
| 248 warnings.clear(); |
| 249 |
| 250 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 251 "default-src 'self' *:*/path", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 252 &warnings)); |
| 253 EXPECT_EQ("default-src 'self';", csp); |
| 254 EXPECT_EQ(1U, warnings.size()); |
| 255 EXPECT_EQ(InsecureValueWarning("default-src", "*:*/path"), |
| 256 warnings[0].message); |
| 257 warnings.clear(); |
| 258 |
| 259 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 260 "default-src 'self' https://", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 261 &warnings)); |
| 262 EXPECT_EQ("default-src 'self';", csp); |
| 263 EXPECT_EQ(1U, warnings.size()); |
| 264 EXPECT_EQ(InsecureValueWarning("default-src", "https://"), |
| 265 warnings[0].message); |
| 266 warnings.clear(); |
| 267 |
| 268 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 269 "default-src 'self' https://*:*", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 270 &warnings)); |
| 271 EXPECT_EQ("default-src 'self';", csp); |
| 272 EXPECT_EQ(1U, warnings.size()); |
| 273 EXPECT_EQ(InsecureValueWarning("default-src", "https://*:*"), |
| 274 warnings[0].message); |
| 275 warnings.clear(); |
| 276 |
| 277 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 278 "default-src 'self' https://*:*/", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 279 &warnings)); |
| 280 EXPECT_EQ("default-src 'self';", csp); |
| 281 EXPECT_EQ(1U, warnings.size()); |
| 282 EXPECT_EQ(InsecureValueWarning("default-src", "https://*:*/"), |
| 283 warnings[0].message); |
| 284 warnings.clear(); |
| 285 |
| 286 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 287 "default-src 'self' https://*:*/path", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 288 &warnings)); |
| 289 EXPECT_EQ("default-src 'self';", csp); |
| 290 EXPECT_EQ(1U, warnings.size()); |
| 291 EXPECT_EQ(InsecureValueWarning("default-src", "https://*:*/path"), |
| 292 warnings[0].message); |
| 293 warnings.clear(); |
| 294 |
| 295 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 296 "default-src 'self' https://*.com", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 297 &warnings)); |
| 298 EXPECT_EQ("default-src 'self';", csp); |
| 299 EXPECT_EQ(1U, warnings.size()); |
| 300 EXPECT_EQ(InsecureValueWarning("default-src", "https://*.com"), |
| 301 warnings[0].message); |
| 302 warnings.clear(); |
| 303 |
| 304 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 305 "default-src 'self' https://*.*.google.com/", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 306 &csp, &warnings)); |
| 307 EXPECT_EQ("default-src 'self';", csp); |
| 308 EXPECT_EQ(1U, warnings.size()); |
| 309 EXPECT_EQ(InsecureValueWarning("default-src", "https://*.*.google.com/"), |
| 310 warnings[0].message); |
| 311 warnings.clear(); |
| 312 |
| 313 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 314 "default-src 'self' https://*.*.google.com:*/", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 315 &csp, &warnings)); |
| 316 EXPECT_EQ("default-src 'self';", csp); |
| 317 EXPECT_EQ(1U, warnings.size()); |
| 318 EXPECT_EQ(InsecureValueWarning("default-src", "https://*.*.google.com:*/"), |
| 319 warnings[0].message); |
| 320 warnings.clear(); |
| 321 |
| 322 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 323 "default-src 'self' https://www.*.google.com/", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 324 &csp, &warnings)); |
| 325 EXPECT_EQ("default-src 'self';", csp); |
| 326 EXPECT_EQ(1U, warnings.size()); |
| 327 EXPECT_EQ(InsecureValueWarning("default-src", "https://www.*.google.com/"), |
| 328 warnings[0].message); |
| 329 warnings.clear(); |
| 330 |
| 122 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 331 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 123 "default-src 'self' https://www.*.google.com:*/", | 332 "default-src 'self' https://www.*.google.com:*/", |
| 124 OPTIONS_ALLOW_UNSAFE_EVAL)); | 333 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 125 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 334 EXPECT_EQ("default-src 'self';", csp); |
| 126 "default-src 'self' chrome://*", OPTIONS_ALLOW_UNSAFE_EVAL)); | 335 EXPECT_EQ(1U, warnings.size()); |
| 127 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 336 EXPECT_EQ(InsecureValueWarning("default-src", "https://www.*.google.com:*/"), |
| 128 "default-src 'self' chrome-extension://*", OPTIONS_ALLOW_UNSAFE_EVAL)); | 337 warnings[0].message); |
| 129 | 338 warnings.clear(); |
| 130 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 339 |
| 131 "default-src 'self' https://*.google.com", OPTIONS_ALLOW_UNSAFE_EVAL)); | 340 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 132 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 341 "default-src 'self' chrome://*", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 133 "default-src 'self' https://*.google.com:1", OPTIONS_ALLOW_UNSAFE_EVAL)); | 342 &warnings)); |
| 134 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 343 EXPECT_EQ("default-src 'self';", csp); |
| 135 "default-src 'self' https://*.google.com:*", OPTIONS_ALLOW_UNSAFE_EVAL)); | 344 EXPECT_EQ(1U, warnings.size()); |
| 136 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 345 EXPECT_EQ(InsecureValueWarning("default-src", "chrome://*"), |
| 137 "default-src 'self' https://*.google.com:1/", OPTIONS_ALLOW_UNSAFE_EVAL)); | 346 warnings[0].message); |
| 138 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 347 warnings.clear(); |
| 139 "default-src 'self' https://*.google.com:*/", OPTIONS_ALLOW_UNSAFE_EVAL)); | 348 |
| 140 | 349 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 141 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 350 "default-src 'self' chrome-extension://*", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 142 "default-src 'self' http://127.0.0.1", OPTIONS_ALLOW_UNSAFE_EVAL)); | 351 &csp, &warnings)); |
| 143 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 352 EXPECT_EQ("default-src 'self';", csp); |
| 144 "default-src 'self' http://localhost", OPTIONS_ALLOW_UNSAFE_EVAL)); | 353 EXPECT_EQ(1U, warnings.size()); |
| 145 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 354 EXPECT_EQ(InsecureValueWarning("default-src", "chrome-extension://*"), |
| 146 "default-src 'self' http://lOcAlHoSt", OPTIONS_ALLOW_UNSAFE_EVAL)); | 355 warnings[0].message); |
| 147 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 356 warnings.clear(); |
| 148 "default-src 'self' http://127.0.0.1:9999", OPTIONS_ALLOW_UNSAFE_EVAL)); | 357 |
| 149 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 358 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 150 "default-src 'self' http://localhost:8888", OPTIONS_ALLOW_UNSAFE_EVAL)); | 359 "default-src 'self' chrome-extension://", OPTIONS_ALLOW_UNSAFE_EVAL, &csp, |
| 360 &warnings)); |
| 361 EXPECT_EQ("default-src 'self';", csp); |
| 362 EXPECT_EQ(1U, warnings.size()); |
| 363 EXPECT_EQ(InsecureValueWarning("default-src", "chrome-extension://"), |
| 364 warnings[0].message); |
| 365 warnings.clear(); |
| 366 |
| 367 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 368 "default-src 'self' https://*.google.com", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 369 NULL, NULL)); |
| 370 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 371 "default-src 'self' https://*.google.com:1", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 372 NULL, NULL)); |
| 373 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 374 "default-src 'self' https://*.google.com:*", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 375 NULL, NULL)); |
| 376 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 377 "default-src 'self' https://*.google.com:1/", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 378 NULL, NULL)); |
| 379 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 380 "default-src 'self' https://*.google.com:*/", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 381 NULL, NULL)); |
| 382 |
| 383 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 384 "default-src 'self' http://127.0.0.1", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 385 NULL)); |
| 386 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 387 "default-src 'self' http://localhost", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 388 NULL)); |
| 389 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 390 "default-src 'self' http://lOcAlHoSt", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, |
| 391 NULL)); |
| 392 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 393 "default-src 'self' http://127.0.0.1:9999", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 394 NULL, NULL)); |
| 395 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 396 "default-src 'self' http://localhost:8888", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 397 NULL, NULL)); |
| 151 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 398 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 152 "default-src 'self' http://127.0.0.1.example.com", | 399 "default-src 'self' http://127.0.0.1.example.com", |
| 153 OPTIONS_ALLOW_UNSAFE_EVAL)); | 400 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 401 EXPECT_EQ("default-src 'self';", csp); |
| 402 EXPECT_EQ(1U, warnings.size()); |
| 403 EXPECT_EQ(InsecureValueWarning("default-src", "http://127.0.0.1.example.com"), |
| 404 warnings[0].message); |
| 405 warnings.clear(); |
| 406 |
| 154 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 407 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 155 "default-src 'self' http://localhost.example.com", | 408 "default-src 'self' http://localhost.example.com", |
| 156 OPTIONS_ALLOW_UNSAFE_EVAL)); | 409 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 157 | 410 EXPECT_EQ("default-src 'self';", csp); |
| 158 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 411 EXPECT_EQ(1U, warnings.size()); |
| 159 "default-src 'self' blob:", OPTIONS_ALLOW_UNSAFE_EVAL)); | 412 EXPECT_EQ(InsecureValueWarning("default-src", "http://localhost.example.com"), |
| 413 warnings[0].message); |
| 414 warnings.clear(); |
| 415 |
| 416 |
| 417 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 418 "default-src 'self' blob:", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 160 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 419 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 161 "default-src 'self' blob:http://example.com/XXX", | 420 "default-src 'self' blob:http://example.com/XXX", |
| 162 OPTIONS_ALLOW_UNSAFE_EVAL)); | 421 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 163 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 422 EXPECT_EQ("default-src 'self';", csp); |
| 164 "default-src 'self' filesystem:", OPTIONS_ALLOW_UNSAFE_EVAL)); | 423 EXPECT_EQ(1U, warnings.size()); |
| 424 EXPECT_EQ(InsecureValueWarning("default-src", "blob:http://example.com/xxx"), |
| 425 warnings[0].message); |
| 426 warnings.clear(); |
| 427 |
| 428 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 429 "default-src 'self' filesystem:", OPTIONS_ALLOW_UNSAFE_EVAL, NULL, NULL)); |
| 165 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 430 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 166 "default-src 'self' filesystem:http://example.com/XXX", | 431 "default-src 'self' filesystem:http://example.com/XXX", |
| 167 OPTIONS_ALLOW_UNSAFE_EVAL)); | 432 OPTIONS_ALLOW_UNSAFE_EVAL, &csp, &warnings)); |
| 168 | 433 EXPECT_EQ("default-src 'self';", csp); |
| 169 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 434 EXPECT_EQ(1U, warnings.size()); |
| 170 "default-src 'self' https://*.googleapis.com", | 435 EXPECT_EQ(InsecureValueWarning("default-src", |
| 171 OPTIONS_ALLOW_UNSAFE_EVAL)); | 436 "filesystem:http://example.com/xxx"), |
| 172 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 437 warnings[0].message); |
| 173 "default-src 'self' https://x.googleapis.com", | 438 warnings.clear(); |
| 174 OPTIONS_ALLOW_UNSAFE_EVAL)); | 439 |
| 175 // "chrome-extension://" is an invalid CSP and ignored by Blink, but extension | 440 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 176 // authors have been using this string anyway, so we cannot refuse this string | 441 "default-src 'self' https://*.googleapis.com", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 177 // until extensions can be loaded with an invalid CSP. http://crbug.com/434773 | 442 NULL, NULL)); |
| 178 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 443 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 179 "default-src 'self' chrome-extension://", OPTIONS_ALLOW_UNSAFE_EVAL)); | 444 "default-src 'self' https://x.googleapis.com", OPTIONS_ALLOW_UNSAFE_EVAL, |
| 180 | 445 NULL, NULL)); |
| 181 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 446 |
| 182 "script-src 'self'; object-src *", OPTIONS_NONE)); | 447 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 183 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 448 "script-src 'self'; object-src *", OPTIONS_NONE, &csp, &warnings)); |
| 184 "script-src 'self'; object-src *", OPTIONS_ALLOW_INSECURE_OBJECT_SRC)); | 449 EXPECT_EQ("script-src 'self'; object-src;", csp); |
| 450 EXPECT_EQ(1U, warnings.size()); |
| 451 EXPECT_EQ(InsecureValueWarning("object-src", "*"), warnings[0].message); |
| 452 warnings.clear(); |
| 453 |
| 454 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 455 "script-src 'self'; object-src *", OPTIONS_ALLOW_INSECURE_OBJECT_SRC, NULL, |
| 456 NULL)); |
| 185 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 457 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 186 "script-src 'self'; object-src http://www.example.com", | 458 "script-src 'self'; object-src http://www.example.com", |
| 187 OPTIONS_ALLOW_INSECURE_OBJECT_SRC)); | 459 OPTIONS_ALLOW_INSECURE_OBJECT_SRC, NULL, NULL)); |
| 188 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 460 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 189 "object-src http://www.example.com blob:; script-src 'self'", | 461 "object-src http://www.example.com blob:; script-src 'self'", |
| 190 OPTIONS_ALLOW_INSECURE_OBJECT_SRC)); | 462 OPTIONS_ALLOW_INSECURE_OBJECT_SRC, NULL, NULL)); |
| 191 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 463 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 192 "script-src 'self'; object-src http://*.example.com", | 464 "script-src 'self'; object-src http://*.example.com", |
| 193 OPTIONS_ALLOW_INSECURE_OBJECT_SRC)); | 465 OPTIONS_ALLOW_INSECURE_OBJECT_SRC, NULL, NULL)); |
| 194 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 466 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 195 "script-src *; object-src *;", OPTIONS_ALLOW_INSECURE_OBJECT_SRC)); | 467 "script-src *; object-src *;", OPTIONS_ALLOW_INSECURE_OBJECT_SRC, &csp, |
| 468 &warnings)); |
| 469 EXPECT_EQ("script-src; object-src *;", csp); |
| 470 EXPECT_EQ(1U, warnings.size()); |
| 471 EXPECT_EQ(InsecureValueWarning("script-src", "*"), warnings[0].message); |
| 472 warnings.clear(); |
| 196 } | 473 } |
| 197 | 474 |
| 198 TEST(ExtensionCSPValidator, IsSandboxed) { | 475 TEST(ExtensionCSPValidator, IsSandboxed) { |
| 199 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed(std::string(), | 476 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed(std::string(), |
| 200 Manifest::TYPE_EXTENSION)); | 477 Manifest::TYPE_EXTENSION)); |
| 201 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed("img-src https://google.com", | 478 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed("img-src https://google.com", |
| 202 Manifest::TYPE_EXTENSION)); | 479 Manifest::TYPE_EXTENSION)); |
| 203 | 480 |
| 204 // Sandbox directive is required. | 481 // Sandbox directive is required. |
| 205 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( | 482 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 221 "sandbox allow-top-navigation", Manifest::TYPE_EXTENSION)); | 498 "sandbox allow-top-navigation", Manifest::TYPE_EXTENSION)); |
| 222 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed( | 499 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed( |
| 223 "sandbox allow-top-navigation", Manifest::TYPE_PLATFORM_APP)); | 500 "sandbox allow-top-navigation", Manifest::TYPE_PLATFORM_APP)); |
| 224 | 501 |
| 225 // Popups are OK. | 502 // Popups are OK. |
| 226 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( | 503 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( |
| 227 "sandbox allow-popups", Manifest::TYPE_EXTENSION)); | 504 "sandbox allow-popups", Manifest::TYPE_EXTENSION)); |
| 228 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( | 505 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( |
| 229 "sandbox allow-popups", Manifest::TYPE_PLATFORM_APP)); | 506 "sandbox allow-popups", Manifest::TYPE_PLATFORM_APP)); |
| 230 } | 507 } |
| OLD | NEW |