feat: add support for validating asar archives on macOS (#30667)
* feat: add support for validating asar archives on macOS * chore: fix lint * chore: update as per feedback * feat: switch implementation to asar integrity hash checks * feat: make ranged requests work with the asar file validator DataSourceFilter * chore: fix lint * chore: fix missing log include on non-darwin * fix: do not pull block size out of missing optional * fix: match ValidateOrDie symbol on non-darwin * chore: fix up asar specs by repacking archives * fix: maintain integrity chain, do not load file integrity if header integrity was not loaded * debug test * Update node-spec.ts * fix: initialize header_validated_ * chore: update PR per feedback * chore: update per feedback * build: use final asar module * Update fuses.json5
This commit is contained in:
parent
fcad531f2e
commit
57d088517c
35 changed files with 705 additions and 43 deletions
|
@ -11,11 +11,16 @@
|
|||
#include "base/files/file_path.h"
|
||||
#include "base/files/file_util.h"
|
||||
#include "base/lazy_instance.h"
|
||||
#include "base/logging.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/stl_util.h"
|
||||
#include "base/strings/string_number_conversions.h"
|
||||
#include "base/strings/string_util.h"
|
||||
#include "base/synchronization/lock.h"
|
||||
#include "base/threading/thread_local.h"
|
||||
#include "base/threading/thread_restrictions.h"
|
||||
#include "crypto/secure_hash.h"
|
||||
#include "crypto/sha2.h"
|
||||
#include "shell/common/asar/archive.h"
|
||||
|
||||
namespace asar {
|
||||
|
@ -130,9 +135,38 @@ bool ReadFileToString(const base::FilePath& path, std::string* contents) {
|
|||
return false;
|
||||
|
||||
contents->resize(info.size);
|
||||
return static_cast<int>(info.size) ==
|
||||
src.Read(info.offset, const_cast<char*>(contents->data()),
|
||||
contents->size());
|
||||
if (static_cast<int>(info.size) !=
|
||||
src.Read(info.offset, const_cast<char*>(contents->data()),
|
||||
contents->size())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (info.integrity.has_value()) {
|
||||
ValidateIntegrityOrDie(contents->data(), contents->size(),
|
||||
info.integrity.value());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ValidateIntegrityOrDie(const char* data,
|
||||
size_t size,
|
||||
const IntegrityPayload& integrity) {
|
||||
if (integrity.algorithm == HashAlgorithm::SHA256) {
|
||||
uint8_t hash[crypto::kSHA256Length];
|
||||
auto hasher = crypto::SecureHash::Create(crypto::SecureHash::SHA256);
|
||||
hasher->Update(data, size);
|
||||
hasher->Finish(hash, sizeof(hash));
|
||||
const std::string hex_hash =
|
||||
base::ToLowerASCII(base::HexEncode(hash, sizeof(hash)));
|
||||
|
||||
if (integrity.hash != hex_hash) {
|
||||
LOG(FATAL) << "Integrity check failed for asar archive ("
|
||||
<< integrity.hash << " vs " << hex_hash << ")";
|
||||
}
|
||||
} else {
|
||||
LOG(FATAL) << "Unsupported hashing algorithm in ValidateIntegrityOrDie";
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace asar
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue