From 2cc40b884759e98a1f7eba363a56ae942111592d Mon Sep 17 00:00:00 2001 From: Arkadiusz Szulakiewicz Date: Thu, 14 Apr 2016 16:22:27 +0200 Subject: [PATCH] Prevent installation of unsigned packages Change-Id: Id4768a04d5b923b9287c0098e3e3fe9775afb0fc --- src/common/certificate_validation.cc | 27 ++++++++++++++++++++++++ src/common/step/security/step_check_signature.cc | 7 ++++++ 2 files changed, 34 insertions(+) diff --git a/src/common/certificate_validation.cc b/src/common/certificate_validation.cc index 9fb02ef..c4202eb 100644 --- a/src/common/certificate_validation.cc +++ b/src/common/certificate_validation.cc @@ -4,6 +4,9 @@ #include "common/certificate_validation.h" +#include +#include + #include #include @@ -14,6 +17,10 @@ namespace ci = common_installer; namespace { +const char kSignatureAuthor[] = "author-signature.xml"; +const char kRegexDistributorSignature[] = "^(signature)([1-9][0-9]*)(\\.xml)"; + + bool SetAuthorCertificate(ValidationCore::SignatureData data, common_installer::CertificateInfo* cert_info) { ValidationCore::CertificateList cert_list = data.getCertList(); @@ -155,6 +162,15 @@ bool ValidateSignatureFile( return true; } +bool CheckAuthorSignature(const ValidationCore::SignatureFileInfo& file_info) { + return file_info.getFileName().find(kSignatureAuthor) != std::string::npos; +} + +bool CheckDistSignature(const ValidationCore::SignatureFileInfo& file_info) { + std::regex distributor_regex(kRegexDistributorSignature); + return std::regex_search(file_info.getFileName(), distributor_regex); +} + bool ValidateSignatures(const bf::path& base_path, PrivilegeLevel* level, common_installer::CertificateInfo* cert_info, bool check_reference, std::string* error_message) { @@ -168,6 +184,17 @@ bool ValidateSignatures(const bf::path& base_path, } LOG(INFO) << "Number of signature files: " << signature_files.size(); + bool author_signatures = std::any_of( + signature_files.begin(), signature_files.end(), CheckAuthorSignature); + + bool distributor_signatures = std::any_of( + signature_files.begin(), signature_files.end(), CheckDistSignature); + + if (!author_signatures || !distributor_signatures) { + LOG(ERROR) << "Author or distribuor signature is missing."; + return false; + } + // Read xml schema for signatures for (auto& file_info : signature_files) { std::string error; diff --git a/src/common/step/security/step_check_signature.cc b/src/common/step/security/step_check_signature.cc index e39d464..9ec9e0a 100644 --- a/src/common/step/security/step_check_signature.cc +++ b/src/common/step/security/step_check_signature.cc @@ -118,6 +118,13 @@ Step::Status StepCheckSignature::process() { if (context_->is_preload_request.get()) level = PrivilegeLevel::PLATFORM; + if (level == PrivilegeLevel::UNTRUSTED) { + std::string error_message = + "Unsigned applications can not be installed"; + on_error(Status::CERT_ERROR, error_message); + return Status::SIGNATURE_ERROR; + } + LOG(INFO) << "Privilege level: " << PrivilegeLevelToString(level); context_->privilege_level.set(level); -- 2.7.4