1 // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "policy/device_policy_impl.h" 6 7 #include <memory> 8 9 #include <base/containers/adapters.h> 10 #include <base/files/file_util.h> 11 #include <base/logging.h> 12 #include <base/macros.h> 13 #include <base/memory/ptr_util.h> 14 #include <openssl/evp.h> 15 #include <openssl/x509.h> 16 17 #include <set> 18 #include <string> 19 20 #include "bindings/chrome_device_policy.pb.h" 21 #include "bindings/device_management_backend.pb.h" 22 #include "policy/policy_util.h" 23 #include "policy/resilient_policy_util.h" 24 25 namespace policy { 26 27 namespace { 28 const char kPolicyPath[] = "/var/lib/whitelist/policy"; 29 const char kPublicKeyPath[] = "/var/lib/whitelist/owner.key"; 30 31 // Reads the public key used to sign the policy from |key_file| and stores it 32 // in |public_key|. Returns true on success. 33 bool ReadPublicKeyFromFile(const base::FilePath& key_file, 34 std::string* public_key) { 35 if (!base::PathExists(key_file)) 36 return false; 37 public_key->clear(); 38 if (!base::ReadFileToString(key_file, public_key) || public_key->empty()) { 39 LOG(ERROR) << "Could not read public key off disk"; 40 return false; 41 } 42 return true; 43 } 44 45 // Verifies that the |signed_data| has correct |signature| with |public_key|. 46 bool VerifySignature(const std::string& signed_data, 47 const std::string& signature, 48 const std::string& public_key) { 49 EVP_MD_CTX ctx; 50 EVP_MD_CTX_init(&ctx); 51 52 const EVP_MD* digest = EVP_sha1(); 53 54 char* key = const_cast<char*>(public_key.data()); 55 BIO* bio = BIO_new_mem_buf(key, public_key.length()); 56 if (!bio) { 57 EVP_MD_CTX_cleanup(&ctx); 58 return false; 59 } 60 61 EVP_PKEY* public_key_ssl = d2i_PUBKEY_bio(bio, nullptr); 62 if (!public_key_ssl) { 63 BIO_free_all(bio); 64 EVP_MD_CTX_cleanup(&ctx); 65 return false; 66 } 67 68 const unsigned char* sig = 69 reinterpret_cast<const unsigned char*>(signature.data()); 70 int rv = EVP_VerifyInit_ex(&ctx, digest, nullptr); 71 if (rv == 1) { 72 EVP_VerifyUpdate(&ctx, signed_data.data(), signed_data.length()); 73 rv = EVP_VerifyFinal(&ctx, sig, signature.length(), public_key_ssl); 74 } 75 76 EVP_PKEY_free(public_key_ssl); 77 BIO_free_all(bio); 78 EVP_MD_CTX_cleanup(&ctx); 79 80 return rv == 1; 81 } 82 83 // Decodes the connection type enum from the device settings protobuf to string 84 // representations. The strings must match the connection manager definitions. 85 std::string DecodeConnectionType(int type) { 86 static const char* const kConnectionTypes[] = { 87 "ethernet", "wifi", "wimax", "bluetooth", "cellular", 88 }; 89 90 if (type < 0 || type >= static_cast<int>(arraysize(kConnectionTypes))) 91 return std::string(); 92 93 return kConnectionTypes[type]; 94 } 95 96 } // namespace 97 98 DevicePolicyImpl::DevicePolicyImpl() 99 : policy_path_(kPolicyPath), 100 keyfile_path_(kPublicKeyPath), 101 verify_root_ownership_(true) {} 102 103 DevicePolicyImpl::~DevicePolicyImpl() {} 104 105 bool DevicePolicyImpl::LoadPolicy() { 106 std::map<int, base::FilePath> sorted_policy_file_paths = 107 policy::GetSortedResilientPolicyFilePaths(policy_path_); 108 if (sorted_policy_file_paths.empty()) 109 return false; 110 111 // Try to load the existent policy files one by one in reverse order of their 112 // index until we succeed. The default policy, if present, appears as index 0 113 // in the map and is loaded the last. This is intentional as that file is the 114 // oldest. 115 bool policy_loaded = false; 116 for (const auto& map_pair : base::Reversed(sorted_policy_file_paths)) { 117 const base::FilePath& policy_path = map_pair.second; 118 if (LoadPolicyFromFile(policy_path)) { 119 policy_loaded = true; 120 break; 121 } 122 } 123 124 return policy_loaded; 125 } 126 127 bool DevicePolicyImpl::GetPolicyRefreshRate(int* rate) const { 128 if (!device_policy_.has_device_policy_refresh_rate()) 129 return false; 130 *rate = static_cast<int>( 131 device_policy_.device_policy_refresh_rate().device_policy_refresh_rate()); 132 return true; 133 } 134 135 bool DevicePolicyImpl::GetUserWhitelist( 136 std::vector<std::string>* user_whitelist) const { 137 if (!device_policy_.has_user_whitelist()) 138 return false; 139 const enterprise_management::UserWhitelistProto& proto = 140 device_policy_.user_whitelist(); 141 user_whitelist->clear(); 142 for (int i = 0; i < proto.user_whitelist_size(); i++) 143 user_whitelist->push_back(proto.user_whitelist(i)); 144 return true; 145 } 146 147 bool DevicePolicyImpl::GetGuestModeEnabled(bool* guest_mode_enabled) const { 148 if (!device_policy_.has_guest_mode_enabled()) 149 return false; 150 *guest_mode_enabled = 151 device_policy_.guest_mode_enabled().guest_mode_enabled(); 152 return true; 153 } 154 155 bool DevicePolicyImpl::GetCameraEnabled(bool* camera_enabled) const { 156 if (!device_policy_.has_camera_enabled()) 157 return false; 158 *camera_enabled = device_policy_.camera_enabled().camera_enabled(); 159 return true; 160 } 161 162 bool DevicePolicyImpl::GetShowUserNames(bool* show_user_names) const { 163 if (!device_policy_.has_show_user_names()) 164 return false; 165 *show_user_names = device_policy_.show_user_names().show_user_names(); 166 return true; 167 } 168 169 bool DevicePolicyImpl::GetDataRoamingEnabled(bool* data_roaming_enabled) const { 170 if (!device_policy_.has_data_roaming_enabled()) 171 return false; 172 *data_roaming_enabled = 173 device_policy_.data_roaming_enabled().data_roaming_enabled(); 174 return true; 175 } 176 177 bool DevicePolicyImpl::GetAllowNewUsers(bool* allow_new_users) const { 178 if (!device_policy_.has_allow_new_users()) 179 return false; 180 *allow_new_users = device_policy_.allow_new_users().allow_new_users(); 181 return true; 182 } 183 184 bool DevicePolicyImpl::GetMetricsEnabled(bool* metrics_enabled) const { 185 if (!device_policy_.has_metrics_enabled()) 186 return false; 187 *metrics_enabled = device_policy_.metrics_enabled().metrics_enabled(); 188 return true; 189 } 190 191 bool DevicePolicyImpl::GetReportVersionInfo(bool* report_version_info) const { 192 if (!device_policy_.has_device_reporting()) 193 return false; 194 195 const enterprise_management::DeviceReportingProto& proto = 196 device_policy_.device_reporting(); 197 if (!proto.has_report_version_info()) 198 return false; 199 200 *report_version_info = proto.report_version_info(); 201 return true; 202 } 203 204 bool DevicePolicyImpl::GetReportActivityTimes( 205 bool* report_activity_times) const { 206 if (!device_policy_.has_device_reporting()) 207 return false; 208 209 const enterprise_management::DeviceReportingProto& proto = 210 device_policy_.device_reporting(); 211 if (!proto.has_report_activity_times()) 212 return false; 213 214 *report_activity_times = proto.report_activity_times(); 215 return true; 216 } 217 218 bool DevicePolicyImpl::GetReportBootMode(bool* report_boot_mode) const { 219 if (!device_policy_.has_device_reporting()) 220 return false; 221 222 const enterprise_management::DeviceReportingProto& proto = 223 device_policy_.device_reporting(); 224 if (!proto.has_report_boot_mode()) 225 return false; 226 227 *report_boot_mode = proto.report_boot_mode(); 228 return true; 229 } 230 231 bool DevicePolicyImpl::GetEphemeralUsersEnabled( 232 bool* ephemeral_users_enabled) const { 233 if (!device_policy_.has_ephemeral_users_enabled()) 234 return false; 235 *ephemeral_users_enabled = 236 device_policy_.ephemeral_users_enabled().ephemeral_users_enabled(); 237 return true; 238 } 239 240 bool DevicePolicyImpl::GetReleaseChannel(std::string* release_channel) const { 241 if (!device_policy_.has_release_channel()) 242 return false; 243 244 const enterprise_management::ReleaseChannelProto& proto = 245 device_policy_.release_channel(); 246 if (!proto.has_release_channel()) 247 return false; 248 249 *release_channel = proto.release_channel(); 250 return true; 251 } 252 253 bool DevicePolicyImpl::GetReleaseChannelDelegated( 254 bool* release_channel_delegated) const { 255 if (!device_policy_.has_release_channel()) 256 return false; 257 258 const enterprise_management::ReleaseChannelProto& proto = 259 device_policy_.release_channel(); 260 if (!proto.has_release_channel_delegated()) 261 return false; 262 263 *release_channel_delegated = proto.release_channel_delegated(); 264 return true; 265 } 266 267 bool DevicePolicyImpl::GetUpdateDisabled(bool* update_disabled) const { 268 if (!device_policy_.has_auto_update_settings()) 269 return false; 270 271 const enterprise_management::AutoUpdateSettingsProto& proto = 272 device_policy_.auto_update_settings(); 273 if (!proto.has_update_disabled()) 274 return false; 275 276 *update_disabled = proto.update_disabled(); 277 return true; 278 } 279 280 bool DevicePolicyImpl::GetTargetVersionPrefix( 281 std::string* target_version_prefix) const { 282 if (!device_policy_.has_auto_update_settings()) 283 return false; 284 285 const enterprise_management::AutoUpdateSettingsProto& proto = 286 device_policy_.auto_update_settings(); 287 if (!proto.has_target_version_prefix()) 288 return false; 289 290 *target_version_prefix = proto.target_version_prefix(); 291 return true; 292 } 293 294 bool DevicePolicyImpl::GetScatterFactorInSeconds( 295 int64_t* scatter_factor_in_seconds) const { 296 if (!device_policy_.has_auto_update_settings()) 297 return false; 298 299 const enterprise_management::AutoUpdateSettingsProto& proto = 300 device_policy_.auto_update_settings(); 301 if (!proto.has_scatter_factor_in_seconds()) 302 return false; 303 304 *scatter_factor_in_seconds = proto.scatter_factor_in_seconds(); 305 return true; 306 } 307 308 bool DevicePolicyImpl::GetAllowedConnectionTypesForUpdate( 309 std::set<std::string>* connection_types) const { 310 if (!device_policy_.has_auto_update_settings()) 311 return false; 312 313 const enterprise_management::AutoUpdateSettingsProto& proto = 314 device_policy_.auto_update_settings(); 315 if (proto.allowed_connection_types_size() <= 0) 316 return false; 317 318 for (int i = 0; i < proto.allowed_connection_types_size(); i++) { 319 std::string type = DecodeConnectionType(proto.allowed_connection_types(i)); 320 if (!type.empty()) 321 connection_types->insert(type); 322 } 323 return true; 324 } 325 326 bool DevicePolicyImpl::GetOpenNetworkConfiguration( 327 std::string* open_network_configuration) const { 328 if (!device_policy_.has_open_network_configuration()) 329 return false; 330 331 const enterprise_management::DeviceOpenNetworkConfigurationProto& proto = 332 device_policy_.open_network_configuration(); 333 if (!proto.has_open_network_configuration()) 334 return false; 335 336 *open_network_configuration = proto.open_network_configuration(); 337 return true; 338 } 339 340 bool DevicePolicyImpl::GetOwner(std::string* owner) const { 341 // The device is enterprise enrolled iff a request token exists. 342 if (policy_data_.has_request_token()) { 343 *owner = ""; 344 return true; 345 } 346 if (!policy_data_.has_username()) 347 return false; 348 *owner = policy_data_.username(); 349 return true; 350 } 351 352 bool DevicePolicyImpl::GetHttpDownloadsEnabled( 353 bool* http_downloads_enabled) const { 354 if (!device_policy_.has_auto_update_settings()) 355 return false; 356 357 const enterprise_management::AutoUpdateSettingsProto& proto = 358 device_policy_.auto_update_settings(); 359 360 if (!proto.has_http_downloads_enabled()) 361 return false; 362 363 *http_downloads_enabled = proto.http_downloads_enabled(); 364 return true; 365 } 366 367 bool DevicePolicyImpl::GetAuP2PEnabled(bool* au_p2p_enabled) const { 368 if (!device_policy_.has_auto_update_settings()) 369 return false; 370 371 const enterprise_management::AutoUpdateSettingsProto& proto = 372 device_policy_.auto_update_settings(); 373 374 if (!proto.has_p2p_enabled()) 375 return false; 376 377 *au_p2p_enabled = proto.p2p_enabled(); 378 return true; 379 } 380 381 bool DevicePolicyImpl::GetAllowKioskAppControlChromeVersion( 382 bool* allow_kiosk_app_control_chrome_version) const { 383 if (!device_policy_.has_allow_kiosk_app_control_chrome_version()) 384 return false; 385 386 const enterprise_management::AllowKioskAppControlChromeVersionProto& proto = 387 device_policy_.allow_kiosk_app_control_chrome_version(); 388 389 if (!proto.has_allow_kiosk_app_control_chrome_version()) 390 return false; 391 392 *allow_kiosk_app_control_chrome_version = 393 proto.allow_kiosk_app_control_chrome_version(); 394 return true; 395 } 396 397 bool DevicePolicyImpl::GetUsbDetachableWhitelist( 398 std::vector<UsbDeviceId>* usb_whitelist) const { 399 if (!device_policy_.has_usb_detachable_whitelist()) 400 return false; 401 const enterprise_management::UsbDetachableWhitelistProto& proto = 402 device_policy_.usb_detachable_whitelist(); 403 usb_whitelist->clear(); 404 for (int i = 0; i < proto.id_size(); i++) { 405 const ::enterprise_management::UsbDeviceIdProto& id = proto.id(i); 406 UsbDeviceId dev_id; 407 dev_id.vendor_id = id.has_vendor_id() ? id.vendor_id() : 0; 408 dev_id.product_id = id.has_product_id() ? id.product_id() : 0; 409 usb_whitelist->push_back(dev_id); 410 } 411 return true; 412 } 413 414 bool DevicePolicyImpl::GetAutoLaunchedKioskAppId( 415 std::string* app_id_out) const { 416 if (!device_policy_.has_device_local_accounts()) 417 return false; 418 419 const enterprise_management::DeviceLocalAccountsProto& local_accounts = 420 device_policy_.device_local_accounts(); 421 422 // For auto-launched kiosk apps, the delay needs to be 0. 423 if (local_accounts.has_auto_login_delay() && 424 local_accounts.auto_login_delay() != 0) 425 return false; 426 427 for (const enterprise_management::DeviceLocalAccountInfoProto& account : 428 local_accounts.account()) { 429 // If this isn't an auto-login account, move to the next one. 430 if (account.account_id() != local_accounts.auto_login_id()) 431 continue; 432 433 // If the auto-launched account is not a kiosk app, bail out, we aren't 434 // running in auto-launched kiosk mode. 435 if (account.type() != 436 enterprise_management::DeviceLocalAccountInfoProto:: 437 ACCOUNT_TYPE_KIOSK_APP) { 438 return false; 439 } 440 441 *app_id_out = account.kiosk_app().app_id(); 442 return true; 443 } 444 445 // No auto-launched account found. 446 return false; 447 } 448 449 bool DevicePolicyImpl::VerifyPolicyFile(const base::FilePath& policy_path) { 450 if (!verify_root_ownership_) { 451 return true; 452 } 453 454 // Both the policy and its signature have to exist. 455 if (!base::PathExists(policy_path) || !base::PathExists(keyfile_path_)) { 456 return false; 457 } 458 459 // Check if the policy and signature file is owned by root. 460 struct stat file_stat; 461 stat(policy_path.value().c_str(), &file_stat); 462 if (file_stat.st_uid != 0) { 463 LOG(ERROR) << "Policy file is not owned by root!"; 464 return false; 465 } 466 stat(keyfile_path_.value().c_str(), &file_stat); 467 if (file_stat.st_uid != 0) { 468 LOG(ERROR) << "Policy signature file is not owned by root!"; 469 return false; 470 } 471 return true; 472 } 473 474 bool DevicePolicyImpl::VerifyPolicySignature() { 475 if (policy_.has_policy_data_signature()) { 476 std::string policy_data = policy_.policy_data(); 477 std::string policy_data_signature = policy_.policy_data_signature(); 478 std::string public_key; 479 if (!ReadPublicKeyFromFile(base::FilePath(keyfile_path_), &public_key)) { 480 LOG(ERROR) << "Could not read owner key off disk"; 481 return false; 482 } 483 if (!VerifySignature(policy_data, policy_data_signature, public_key)) { 484 LOG(ERROR) << "Signature does not match the data or can not be verified!"; 485 return false; 486 } 487 return true; 488 } 489 LOG(ERROR) << "The policy blob is not signed!"; 490 return false; 491 } 492 493 bool DevicePolicyImpl::LoadPolicyFromFile(const base::FilePath& policy_path) { 494 std::string policy_data_str; 495 if (policy::LoadPolicyFromPath(policy_path, &policy_data_str, &policy_) != 496 LoadPolicyResult::kSuccess) { 497 return false; 498 } 499 if (!policy_.has_policy_data()) { 500 LOG(ERROR) << "Policy on disk could not be parsed!"; 501 return false; 502 } 503 if (!policy_data_.ParseFromString(policy_.policy_data()) || 504 !policy_data_.has_policy_value()) { 505 LOG(ERROR) << "Policy on disk could not be parsed!"; 506 return false; 507 } 508 509 bool verify_policy = true; 510 if (!install_attributes_reader_) { 511 install_attributes_reader_ = std::make_unique<InstallAttributesReader>(); 512 } 513 const std::string& mode = install_attributes_reader_->GetAttribute( 514 InstallAttributesReader::kAttrMode); 515 if (mode == InstallAttributesReader::kDeviceModeEnterpriseAD) { 516 verify_policy = false; 517 } 518 if (verify_policy && !VerifyPolicyFile(policy_path)) { 519 return false; 520 } 521 522 // Make sure the signature is still valid. 523 if (verify_policy && !VerifyPolicySignature()) { 524 LOG(ERROR) << "Policy signature verification failed!"; 525 return false; 526 } 527 if (!device_policy_.ParseFromString(policy_data_.policy_value())) { 528 LOG(ERROR) << "Policy on disk could not be parsed!"; 529 return false; 530 } 531 532 return true; 533 } 534 535 } // namespace policy 536