Adds back the ability to allow just querying of file attributes to the config. We currently use this for shader cache rules. diff --git a/sandbox/win/src/filesystem_policy.cc b/sandbox/win/src/filesystem_policy.cc --- a/sandbox/win/src/filesystem_policy.cc +++ b/sandbox/win/src/filesystem_policy.cc @@ -114,24 +114,27 @@ bool FileSystemPolicy::GenerateRules(con GENERIC_EXECUTE | READ_CONTROL; DWORD restricted_flags = ~allowed_flags; open.AddNumberMatch(IF_NOT, OpenFile::ACCESS, restricted_flags, AND); open.AddNumberMatch(IF, OpenFile::OPENONLY, true, EQUAL); create.AddNumberMatch(IF_NOT, OpenFile::ACCESS, restricted_flags, AND); create.AddNumberMatch(IF, OpenFile::OPENONLY, true, EQUAL); } - if (!create.AddStringMatch(IF, OpenFile::NAME, name, CASE_INSENSITIVE) || - !policy->AddRule(IpcTag::NTCREATEFILE, &create)) { - return false; - } + // Create and open are not allowed for query. + if (semantics != FileSemantics::kAllowQuery) { + if (!create.AddStringMatch(IF, OpenFile::NAME, name, CASE_INSENSITIVE) || + !policy->AddRule(IpcTag::NTCREATEFILE, &create)) { + return false; + } - if (!open.AddStringMatch(IF, OpenFile::NAME, name, CASE_INSENSITIVE) || - !policy->AddRule(IpcTag::NTOPENFILE, &open)) { - return false; + if (!open.AddStringMatch(IF, OpenFile::NAME, name, CASE_INSENSITIVE) || + !policy->AddRule(IpcTag::NTOPENFILE, &open)) { + return false; + } } if (!query.AddStringMatch(IF, OpenFile::NAME, name, CASE_INSENSITIVE) || !policy->AddRule(IpcTag::NTQUERYATTRIBUTESFILE, &query)) { return false; } if (!query_full.AddStringMatch(IF, OpenFile::NAME, name, CASE_INSENSITIVE) || diff --git a/sandbox/win/src/sandbox_policy.h b/sandbox/win/src/sandbox_policy.h --- a/sandbox/win/src/sandbox_policy.h +++ b/sandbox/win/src/sandbox_policy.h @@ -28,16 +28,17 @@ enum class Desktop { }; // Allowable semantics when an AllowFileAccess() rule is matched. enum class FileSemantics { kAllowAny, // Allows open or create for any kind of access that // the file system supports. kAllowReadonly, // Allows open or create with read access only // (includes access to query the attributes of a file). + kAllowQuery, // Allows access to query the attributes of a file. }; // Policy configuration that can be shared over multiple targets of the same tag // (see BrokerServicesBase::CreatePolicy(tag)). Methods in TargetConfig will // only need to be called the first time a TargetPolicy object with a given tag // is configured. // // We need [[clang::lto_visibility_public]] because instances of this class are