diff options
author | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
---|---|---|
committer | Jiyoung Yun <jy910.yun@samsung.com> | 2016-11-23 19:09:09 +0900 |
commit | 4b4aad7217d3292650e77eec2cf4c198ea9c3b4b (patch) | |
tree | 98110734c91668dfdbb126fcc0e15ddbd93738ca /src/vm/securitymeta.h | |
parent | fa45f57ed55137c75ac870356a1b8f76c84b229c (diff) | |
download | coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.gz coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.tar.bz2 coreclr-4b4aad7217d3292650e77eec2cf4c198ea9c3b4b.zip |
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to 'src/vm/securitymeta.h')
-rw-r--r-- | src/vm/securitymeta.h | 668 |
1 files changed, 668 insertions, 0 deletions
diff --git a/src/vm/securitymeta.h b/src/vm/securitymeta.h new file mode 100644 index 0000000000..d78b7bde54 --- /dev/null +++ b/src/vm/securitymeta.h @@ -0,0 +1,668 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +//-------------------------------------------------------------------------- +// securitymeta.h +// +// pre-computes various security information, declarative and runtime meta-info +// + + +// +//-------------------------------------------------------------------------- + + +#ifndef __SECURITYMETA_H__ +#define __SECURITYMETA_H__ + +class SecurityStackWalk; +class AssertStackWalk; +class PsetCacheEntry; +class SecurityTransparencyBehavior; +struct DeclActionInfo; + +#define INVALID_SET_INDEX ((DWORD)~0) + +// The enum that describes the value of the SecurityCriticalFlags in SecurityCritical attribute. +enum SecurityCriticalFlags +{ + SecurityCriticalFlags_None = 0, + SecurityCriticalFlags_All = 0x1 +}; + +// Security rule sets that can be used - this enum should match the BCL SecurityRuleSet enum +enum SecurityRuleSet +{ + SecurityRuleSet_Level1 = 1, // v2.0 rules + SecurityRuleSet_Level2 = 2, // v4.0 rules + + SecurityRuleSet_Min = SecurityRuleSet_Level1, // Smallest rule set we understand + SecurityRuleSet_Max = SecurityRuleSet_Level2, // Largest rule set we understand + SecurityRuleSet_Default = SecurityRuleSet_Level2 // Rule set to use if unspecified +}; + +// Partial trust visibility level for APTCA assemblies - this enum should match the BCL +// PartialTrustVisibilityLevel enum +enum PartialTrustVisibilityLevel +{ + PartialTrustVisibilityLevel_VisibleToAllHosts = 0, + PartialTrustVisibilityLevel_NotVisibleByDefault = 1 +}; + +SELECTANY const DWORD DCL_FLAG_MAP[] = +{ + 0, // dclActionNil = 0 + DECLSEC_REQUESTS, // dclRequest = 1 + DECLSEC_DEMANDS, // dclDemand = 2 + DECLSEC_ASSERTIONS, // dclAssert = 3 + DECLSEC_DENIALS, // dclDeny = 4 + DECLSEC_PERMITONLY, // dclPermitOnly = 5 + DECLSEC_LINK_CHECKS, // dclLinktimeCheck = 6 + DECLSEC_INHERIT_CHECKS, // dclInheritanceCheck = 7 + DECLSEC_REQUESTS, // dclRequestMinimum = 8 + DECLSEC_REQUESTS, // dclRequestOptional = 9 + DECLSEC_REQUESTS, // dclRequestRefuse = 10 + 0, // dclPrejitGrant = 11 + 0, // dclPrejitDenied = 12 + DECLSEC_NONCAS_DEMANDS, // dclNonCasDemand = 13 + DECLSEC_NONCAS_LINK_DEMANDS, // dclNonCasLinkDemand = 14 + DECLSEC_NONCAS_INHERITANCE, // dclNonCasInheritance = 15 +}; +#define DCL_FLAG_MAP_SIZE (sizeof(DCL_FLAG_MAP)/sizeof(DWORD)) +#define DclToFlag(dcl) (((size_t)dcl < DCL_FLAG_MAP_SIZE) ? DCL_FLAG_MAP[dcl] : 0) + + +struct TokenDeclActionInfo +{ + DWORD dwDeclAction; // This'll tell InvokeDeclarativeSecurity whats the action needed + PsetCacheEntry *pPCE; // The cached permissionset on which to demand/assert/deny/etc + TokenDeclActionInfo* pNext; // pointer to next action link in chain + + static TokenDeclActionInfo *Init(DWORD dwAction, PsetCacheEntry *pPCE); + static void LinkNewDeclAction(TokenDeclActionInfo** ppActionList, CorDeclSecurity action, PsetCacheEntry *pPCE); + + + HRESULT GetDeclaredPermissionsWithCache(IN CorDeclSecurity action, + OUT OBJECTREF *pDeclaredPermissions, + OUT PsetCacheEntry **pPCE); + + OBJECTREF GetLinktimePermissions(OBJECTREF *prefNonCasDemands); + void InvokeLinktimeChecks(Assembly* pCaller); +}; + +// Flags about the raw security attributes found on a metadata token, as well as semantic interpretations of +// them in some cases (see code:TokenSecurityDescriptor#TokenSecurityDescriptorSemanticLookup). These flags +// are split into several sections: +// +// 32 28 16 12 4 0 +// | Rules version | Rules Bits | Semantic data | Raw attributes | Metabits | +// +// Rules version - the SecurityRuleSet selected by a SecurityRules attribute +// Rules bits - extra flags set on a SecurityRules attribute +// Semantic data - Flags indicating the security state of the item represented by the token taking into +// account parent types and modules - giving the true semantic security state +// (see code:TokenSecurityDescriptor#TokenSecurityDescriptorSemanticLookup) +// Raw attributes - Flags for data we read directly out of metadata; these only indicate that the attributes +// are set, and do not indicate the actual security state of the token until they have been +// interpreted by the assembly they are applied within. +// Metabits - Flags about the state of the token security descriptor itself +enum TokenSecurityDescriptorFlags +{ + // Metabits + TokenSecurityDescriptorFlags_None = 0x00000000, + TokenSecurityDescriptorFlags_IsComputed = 0x00000001, + + // Raw attributes + TokenSecurityDescriptorFlags_RawAttributeMask = 0x00000FF0, + TokenSecurityDescriptorFlags_AllCritical = 0x00000010, // [SecurityCritical(SecurityCriticalScope.All)] + TokenSecurityDescriptorFlags_APTCA = 0x00000020, // [AllowPartiallyTrustedCallers] (VisibleByDefault) + TokenSecurityDescriptorFlags_ConditionalAPTCA = 0x00000040, // [AllowPartiallyTrustedCallers] (NotVisibleByDefault) + TokenSecurityDescriptorFlags_Critical = 0x00000080, // [SecurityCritical] (regardless of scope) + TokenSecurityDescriptorFlags_SecurityRules = 0x00000100, // [SecurityRules] + TokenSecurityDescriptorFlags_SafeCritical = 0x00000200, // [SecuritySafeCritical] + TokenSecurityDescriptorFlags_Transparent = 0x00000400, // [SecurityTransparent] + TokenSecurityDescriptorFlags_TreatAsSafe = 0x00000800, // [SecurityTreatAsSafe] + + // Semantic data + TokenSecurityDescriptorFlags_SemanticMask = 0x000FF000, + TokenSecurityDescriptorFlags_IsSemanticComputed = 0x00001000, + TokenSecurityDescriptorFlags_IsSemanticCritical = 0x00002000, + TokenSecurityDescriptorFlags_IsSemanticTreatAsSafe = 0x00004000, + TokenSecurityDescriptorFlags_IsSemanticExternallyVisible= 0x00008000, + + // Rules bits + TokenSecurityDescriptorFlags_RulesMask = 0x0FFF0000, + TokenSecurityDescriptorFlags_SkipFullTrustVerification = 0x00010000, // In full trust do not do IL verificaiton for transparent code + + // Rules version + TokenSecurityDescriptorFlags_RulesVersionMask = 0xF0000000 +}; + +inline TokenSecurityDescriptorFlags operator|(TokenSecurityDescriptorFlags lhs, + TokenSecurityDescriptorFlags rhs); + +inline TokenSecurityDescriptorFlags operator|=(TokenSecurityDescriptorFlags& lhs, + TokenSecurityDescriptorFlags rhs); + +inline TokenSecurityDescriptorFlags operator&(TokenSecurityDescriptorFlags lhs, + TokenSecurityDescriptorFlags rhs); + +inline TokenSecurityDescriptorFlags operator&=(TokenSecurityDescriptorFlags& lhs, + TokenSecurityDescriptorFlags rhs); + +inline TokenSecurityDescriptorFlags operator~(TokenSecurityDescriptorFlags flags); + +// Get the version of the security rules that token security descriptor flags are requesting +inline SecurityRuleSet GetSecurityRuleSet(TokenSecurityDescriptorFlags flags); + +// Encode a security rule set into token flags - this reverses GetSecurityRuleSet +inline TokenSecurityDescriptorFlags EncodeSecurityRuleSet(SecurityRuleSet ruleSet); + +#ifdef FEATURE_APTCA +TokenSecurityDescriptorFlags ParseAptcaAttribute(const BYTE *pbAptcaBlob, + DWORD cbAptcaBlob); +#endif // FEATURE_APTCA + +TokenSecurityDescriptorFlags ParseSecurityRulesAttribute(const BYTE *pbSecurityRulesBlob, + DWORD cbSecurityRulesBlob); + +// +// #TokenSecurityDescriptorSemanticLookup +// +// Token security descriptors are used to get information on the security state of a specific metadata +// token. They have two types of lookup - standard and semantic. Standard lookup is cheaper and only looks at +// the specific metadata token. Semantic lookup will follow the token to its parents, figuring out if the +// token is semanticaly critical or transparent due to a containing item. For instance: +// +// [SecurityCritical] +// class A +// { +// class B { } +// } +// +// A TokenSecurityDescriptor's standard lookup for B will say that it is transparent because B does not +// directly have a critical attribute. However, a semantic lookup will notice that A is critical and +// contains B, therefore B is also critical. +// + +class TokenSecurityDescriptor +{ +private: + PTR_Module m_pModule; + mdToken m_token; + TokenSecurityDescriptorFlags m_flags; + +public: + inline TokenSecurityDescriptor(PTR_Module pModule, mdToken token); + + void VerifyDataComputed(); + void VerifySemanticDataComputed(); + + // Get the raw flags for the token + inline TokenSecurityDescriptorFlags GetFlags(); + + // + // Critical / transparent checks for the specific metadata token only - these methods do not take into + // account the containment of the token and therefore only include information about the token itself + // and cannot be used to determine if the item represented by the token is semantically critical. + // + // See code:TokenSecurityDescriptor#TokenSecurityDescriptorSemanticLookup + // + + // Get the attributes that were set on the token + inline TokenSecurityDescriptorFlags GetMetadataFlags(); + + // + // Semantic critical / transparent checks for the metadata token - these methods take into account + // containers of the token to get a true semantic security status for the token. + // + // See code:TokenSecurityDescriptor#TokenSecurityDescriptorSemanticLookup + // + + inline BOOL IsSemanticCritical(); + + inline BOOL IsSemanticTreatAsSafe(); + + inline BOOL IsSemanticExternallyVisible(); + + // static helper to find cached security descriptors based on token + static HashDatum LookupSecurityDescriptor(void* pKey); + + static HashDatum LookupSecurityDescriptor_Slow(AppDomain* pDomain, + void* pKey, + EEPtrHashTable &rCachedMethodPermissionsHash ); + + // static helper to insert a security descriptor for a token, dupes not allowed, returns previous entry in hash table + static HashDatum InsertSecurityDescriptor(void* pKey, HashDatum pHashDatum); + + // static helper to parse the security attributes for a token from a given metadata importer + static TokenSecurityDescriptorFlags ReadSecurityAttributes(IMDInternalImport *pmdImport, mdToken token); + +private: + // does the type represented by this TokenSecurityDescriptor particpate in type equivalence + inline BOOL IsTypeEquivalent(); + +private: + // Helper class which fires transparency calculation begin/end ETW events + class TokenSecurityDescriptorTransparencyEtwEvents + { + private: + const TokenSecurityDescriptor *m_pTSD; + + public: + inline TokenSecurityDescriptorTransparencyEtwEvents(const TokenSecurityDescriptor *pTSD); + inline ~TokenSecurityDescriptorTransparencyEtwEvents(); + }; +}; + +enum MethodSecurityDescriptorFlags +{ + MethodSecurityDescriptorFlags_None = 0x0000, + MethodSecurityDescriptorFlags_IsComputed = 0x0001, + + // Method transparency info is cached directly on MethodDesc for performance reasons + // These flags are used only during calculation of transparency information; runtime data + // should be read from the method desc + MethodSecurityDescriptorFlags_IsCritical = 0x0002, + MethodSecurityDescriptorFlags_IsTreatAsSafe = 0x0004, + + MethodSecurityDescriptorFlags_IsBuiltInCASPermsOnly = 0x0008, + MethodSecurityDescriptorFlags_IsDemandsOnly = 0x0010, + MethodSecurityDescriptorFlags_AssertAllowed = 0x0020, + MethodSecurityDescriptorFlags_CanCache = 0x0040, +}; + +inline MethodSecurityDescriptorFlags operator|(MethodSecurityDescriptorFlags lhs, + MethodSecurityDescriptorFlags rhs); + +inline MethodSecurityDescriptorFlags operator|=(MethodSecurityDescriptorFlags& lhs, + MethodSecurityDescriptorFlags rhs); + +inline MethodSecurityDescriptorFlags operator&(MethodSecurityDescriptorFlags lhs, + MethodSecurityDescriptorFlags rhs); + +inline MethodSecurityDescriptorFlags operator&=(MethodSecurityDescriptorFlags& lhs, + MethodSecurityDescriptorFlags rhs); + +class MethodSecurityDescriptor +{ +private: + MethodDesc *m_pMD; + DeclActionInfo *m_pRuntimeDeclActionInfo; // run-time declarative actions list + TokenDeclActionInfo *m_pTokenDeclActionInfo; // link-time declarative actions list + MethodSecurityDescriptorFlags m_flags; + DWORD m_declFlagsDuringPreStub; // declarative run-time security flags, + +public: + explicit inline MethodSecurityDescriptor(MethodDesc* pMD, BOOL fCanCache = TRUE); + + inline BOOL CanAssert(); + inline void SetCanAssert(); + + inline BOOL CanCache(); + inline void SetCanCache(); + + inline BOOL HasRuntimeDeclarativeSecurity(); + inline BOOL HasLinkOrInheritanceDeclarativeSecurity(); + inline BOOL HasLinktimeDeclarativeSecurity(); + inline BOOL HasInheritanceDeclarativeSecurity(); + + inline mdToken GetToken(); + inline MethodDesc *GetMethod(); + inline IMDInternalImport *GetIMDInternalImport(); + + inline BOOL ContainsBuiltInCASDemandsOnly(); + inline DeclActionInfo* GetRuntimeDeclActionInfo(); + inline DWORD GetDeclFlagsDuringPreStub(); + inline TokenDeclActionInfo* GetTokenDeclActionInfo(); + + inline BOOL IsCritical(); + inline BOOL IsTreatAsSafe(); + + inline BOOL IsOpportunisticallyCritical(); + + inline HRESULT GetDeclaredPermissionsWithCache(IN CorDeclSecurity action, + OUT OBJECTREF *pDeclaredPermissions, + OUT PsetCacheEntry **pPCE); + + static HRESULT GetDeclaredPermissionsWithCache(MethodDesc* pMD, + IN CorDeclSecurity action, + OUT OBJECTREF *pDeclaredPermissions, + OUT PsetCacheEntry **pPCE); + + static OBJECTREF GetLinktimePermissions(MethodDesc* pMD, OBJECTREF *prefNonCasDemands); + + inline void InvokeLinktimeChecks(Assembly* pCaller); + static inline void InvokeLinktimeChecks(MethodDesc* pMD, Assembly* pCaller); + + void InvokeInheritanceChecks(MethodDesc *pMethod); + + // This method will look for the cached copy of the MethodSecurityDescriptor corresponding to ret_methSecDesc->_pMD + // If the cache lookup succeeds, we get back the cached copy in ret_methSecDesc + // If the cache lookup fails, then the data is computed in ret_methSecDesc. If we find that this is a cache-able MSD, + // a copy is made in AppDomain heap and inserted into the hash table for future lookups. + static void LookupOrCreateMethodSecurityDescriptor(MethodSecurityDescriptor* ret_methSecDesc); + static BOOL IsDeclSecurityCASDemandsOnly(DWORD dwMethDeclFlags, + mdToken _mdToken, + IMDInternalImport *pInternalImport); + +private: + void ComputeRuntimeDeclarativeSecurityInfo(); + void ComputeMethodDeclarativeSecurityInfo(); + + inline void VerifyDataComputed(); + void VerifyDataComputedInternal(); + + // Force the type to figure out if it is transparent or critial. + // NOTE: Generally this is not needed, as the data is cached on the MethodDesc for you. This method should + // only be called if the MethodDesc is returning FALSE from HasCriticalTransparentInfo + void ComputeCriticalTransparentInfo(); + + static BOOL CanMethodSecurityDescriptorBeCached(MethodDesc* pMD); + +private: + // Helper class which fires transparency calculation begin/end ETW events + class MethodSecurityDescriptorTransparencyEtwEvents + { + private: + const MethodSecurityDescriptor *m_pMSD; + + public: + inline MethodSecurityDescriptorTransparencyEtwEvents(const MethodSecurityDescriptor *pMSD); + inline ~MethodSecurityDescriptorTransparencyEtwEvents(); + }; + + // Helper class to iterater over methods that the MethodSecurityDescriptor's MethodDesc may be + // implementing. This type iterates over interface implementations followed by MethodImpls for virtuals + // that the input MethodDesc implements. + class MethodImplementationIterator + { + private: + DispatchMap::Iterator m_interfaceIterator; + MethodDesc *m_pMD; + DWORD m_iMethodImplIndex; + bool m_fInterfaceIterationBegun; + bool m_fMethodImplIterationBegun; + + public: + MethodImplementationIterator(MethodDesc *pMD); + + MethodDesc *Current(); + bool IsValid(); + void Next(); + }; +}; + +enum FieldSecurityDescriptorFlags +{ + FieldSecurityDescriptorFlags_None = 0x0000, + FieldSecurityDescriptorFlags_IsComputed = 0x0001, + FieldSecurityDescriptorFlags_IsCritical = 0x0002, + FieldSecurityDescriptorFlags_IsTreatAsSafe = 0x0004, +}; + +inline FieldSecurityDescriptorFlags operator|(FieldSecurityDescriptorFlags lhs, + FieldSecurityDescriptorFlags rhs); + +inline FieldSecurityDescriptorFlags operator|=(FieldSecurityDescriptorFlags& lhs, + FieldSecurityDescriptorFlags rhs); + +inline FieldSecurityDescriptorFlags operator&(FieldSecurityDescriptorFlags lhs, + FieldSecurityDescriptorFlags rhs); + +inline FieldSecurityDescriptorFlags operator&=(FieldSecurityDescriptorFlags& lhs, + FieldSecurityDescriptorFlags rhs); + +class FieldSecurityDescriptor +{ +private: + FieldDesc *m_pFD; + FieldSecurityDescriptorFlags m_flags; + +public: + explicit inline FieldSecurityDescriptor(FieldDesc* pFD); + + void VerifyDataComputed(); + + inline BOOL IsCritical(); + inline BOOL IsTreatAsSafe(); + +private: + // Helper class which fires transparency calculation begin/end ETW events + class FieldSecurityDescriptorTransparencyEtwEvents + { + private: + const FieldSecurityDescriptor *m_pFSD; + + public: + inline FieldSecurityDescriptorTransparencyEtwEvents(const FieldSecurityDescriptor *pFSD); + inline ~FieldSecurityDescriptorTransparencyEtwEvents(); + }; +}; + +enum TypeSecurityDescriptorFlags +{ + TypeSecurityDescriptorFlags_None = 0x0000, + + // Type transparency info is cached directly on EEClass for performance reasons; these bits are used only + // as intermediate state while calculating the final set of bits to cache on the EEClass + TypeSecurityDescriptorFlags_IsAllCritical = 0x0001, // Everything introduced by this type is critical + TypeSecurityDescriptorFlags_IsAllTransparent = 0x0002, // All code in the type is transparent + TypeSecurityDescriptorFlags_IsCritical = 0x0004, // The type is critical, but its introduced methods may not be + TypeSecurityDescriptorFlags_IsTreatAsSafe = 0x0008, // Combined with IsAllCritical or IsCritical makes the type SafeCritical +}; + +inline TypeSecurityDescriptorFlags operator|(TypeSecurityDescriptorFlags lhs, + TypeSecurityDescriptorFlags rhs); + +inline TypeSecurityDescriptorFlags operator|=(TypeSecurityDescriptorFlags& lhs, + TypeSecurityDescriptorFlags rhs); + +inline TypeSecurityDescriptorFlags operator&(TypeSecurityDescriptorFlags lhs, + TypeSecurityDescriptorFlags rhs); + +inline TypeSecurityDescriptorFlags operator&=(TypeSecurityDescriptorFlags& lhs, + TypeSecurityDescriptorFlags rhs); + +class TypeSecurityDescriptor +{ +private: + MethodTable *m_pMT; + TokenDeclActionInfo *m_pTokenDeclActionInfo; + BOOL m_fIsComputed; + +public: + explicit inline TypeSecurityDescriptor(MethodTable *pMT); + + inline BOOL HasLinkOrInheritanceDeclarativeSecurity(); + inline BOOL HasLinktimeDeclarativeSecurity(); + inline BOOL HasInheritanceDeclarativeSecurity(); + + // Is everything introduced by the type critical + inline BOOL IsAllCritical(); + + // Does the type contain only transparent code + inline BOOL IsAllTransparent(); + + // Combined with IsCritical/IsAllCritical is the type safe critical + inline BOOL IsTreatAsSafe(); + + // Is the type critical, but not necessarially its conatined methods + inline BOOL IsCritical(); + + // Is the type in an assembly that doesn't care about transparency, and therefore wants the CLR to make + // sure that all annotations are correct for it. + inline BOOL IsOpportunisticallyCritical(); + + // Should this type be considered externally visible when calculating the transpraency of the type + // and its members. (For instance, when seeing if public implies treat as safe) + BOOL IsTypeExternallyVisibleForTransparency(); + + inline mdToken GetToken(); + inline IMDInternalImport *GetIMDInternalImport(); + + inline TokenDeclActionInfo* GetTokenDeclActionInfo(); + + inline HRESULT GetDeclaredPermissionsWithCache(IN CorDeclSecurity action, + OUT OBJECTREF *pDeclaredPermissions, + OUT PsetCacheEntry **pPCE); + + static HRESULT GetDeclaredPermissionsWithCache(MethodTable* pTargetMT, + IN CorDeclSecurity action, + OUT OBJECTREF *pDeclaredPermissions, + OUT PsetCacheEntry **pPCE); + + static OBJECTREF GetLinktimePermissions(MethodTable* pMT, OBJECTREF *prefNonCasDemands); + + // Is the type represented by this TypeSecurityDescripter participating in type equivalence + inline BOOL IsTypeEquivalent(); + + void InvokeInheritanceChecks(MethodTable* pMT); + inline void InvokeLinktimeChecks(Assembly* pCaller); + static inline void InvokeLinktimeChecks(MethodTable* pMT, Assembly* pCaller); + +private: + inline TypeSecurityDescriptor& operator=(const TypeSecurityDescriptor &tsd); + void ComputeTypeDeclarativeSecurityInfo(); + static TypeSecurityDescriptor* GetTypeSecurityDescriptor(MethodTable* pMT); + void VerifyDataComputedInternal(); + inline void VerifyDataComputed(); + // Force the type to figure out if it is transparent or critial. + // NOTE: Generally this is not needed, as the data is cached on the EEClass for you. This method should + // only be called if the EEClass is returning FALSE from HasCriticalTransparentInfo + void ComputeCriticalTransparentInfo(); + static BOOL CanTypeSecurityDescriptorBeCached(MethodTable* pMT); + +private: + // Helper class which fires transparency calculation begin/end ETW events + class TypeSecurityDescriptorTransparencyEtwEvents + { + private: + const TypeSecurityDescriptor *m_pTSD; + + public: + inline TypeSecurityDescriptorTransparencyEtwEvents(const TypeSecurityDescriptor *pTSD); + inline ~TypeSecurityDescriptorTransparencyEtwEvents(); + }; +}; + + +enum ModuleSecurityDescriptorFlags +{ + ModuleSecurityDescriptorFlags_None = 0x0000, + ModuleSecurityDescriptorFlags_IsComputed = 0x0001, + + ModuleSecurityDescriptorFlags_IsAPTCA = 0x0002, // The assembly allows partially trusted callers + ModuleSecurityDescriptorFlags_IsAllCritical = 0x0004, // Every type and method introduced by the assembly is critical + ModuleSecurityDescriptorFlags_IsAllTransparent = 0x0008, // Every type and method in the assembly is transparent + ModuleSecurityDescriptorFlags_IsTreatAsSafe = 0x0010, // Combined with IsAllCritical - every type and method introduced by the assembly is safe critical + ModuleSecurityDescriptorFlags_IsOpportunisticallyCritical = 0x0020, // Ensure that the assembly follows all transparency rules by making all methods critical or safe critical as needed + ModuleSecurityDescriptorFlags_SkipFullTrustVerification = 0x0040, // Fully trusted transparent code does not require verification + ModuleSecurityDescriptorFlags_TransparentDueToPartialTrust = 0x0080, // Whether we made the assembly all transparent because it was partially-trusted +}; + +inline ModuleSecurityDescriptorFlags operator|(ModuleSecurityDescriptorFlags lhs, + ModuleSecurityDescriptorFlags rhs); + +inline ModuleSecurityDescriptorFlags operator|=(ModuleSecurityDescriptorFlags& lhs, + ModuleSecurityDescriptorFlags rhs); + +inline ModuleSecurityDescriptorFlags operator&(ModuleSecurityDescriptorFlags lhs, + ModuleSecurityDescriptorFlags rhs); + +inline ModuleSecurityDescriptorFlags operator&=(ModuleSecurityDescriptorFlags& lhs, + ModuleSecurityDescriptorFlags rhs); + +inline ModuleSecurityDescriptorFlags operator~(ModuleSecurityDescriptorFlags flags); + +#ifdef FEATURE_APTCA +BOOL CheckAssemblyHasBeenKillBitted(LPASSEMBLYNAME pAssemblyName, ULARGE_INTEGER uliFileVersion); +#endif + +// Module security descriptor, this class contains static security information about the module +// this information will get persisted in the NGen image +class ModuleSecurityDescriptor +{ + friend class Module; + +private: + PTR_Module m_pModule; + ModuleSecurityDescriptorFlags m_flags; + TokenSecurityDescriptorFlags m_tokenFlags; + +private: + explicit inline ModuleSecurityDescriptor(PTR_Module pModule); + +public: + static inline BOOL IsMarkedTransparent(Assembly* pAssembly); + + static ModuleSecurityDescriptor* GetModuleSecurityDescriptor(Assembly* pAssembly); + + void Save(DataImage *image); + void Fixup(DataImage *image); + + void VerifyDataComputed(); + + inline void OverrideTokenFlags(TokenSecurityDescriptorFlags tokenFlags); + inline TokenSecurityDescriptorFlags GetTokenFlags(); + + inline Module *GetModule(); + +#ifdef DACCESS_COMPILE + // Get the value of the module security descriptor flags without forcing them to be computed + inline ModuleSecurityDescriptorFlags GetRawFlags(); +#endif // DACCESS_COMPILE + + // Is every method and type in the assembly transparent + inline BOOL IsAllTransparent(); + + // Is every method and type introduced by the assembly critical + inline BOOL IsAllCritical(); + + // Combined with IsAllCritical - is every method and type introduced by the assembly safe critical + inline BOOL IsTreatAsSafe(); + + // Does the assembly not care about transparency, and wants the CLR to take care of making sure everything + // is annotated properly in the assembly. + inline BOOL IsOpportunisticallyCritical(); + + // Does the assembly contain a mix of critical and transparent code + inline BOOL IsMixedTransparency(); + + // Partial trust assemblies are forced all-transparent under some conditions. This + // tells us whether that is true for this particular assembly. + inline BOOL IsAllTransparentDueToPartialTrust(); + + // Get the rule set the assembly uses + inline SecurityRuleSet GetSecurityRuleSet(); + +#ifndef FEATURE_CORECLR + // Can fully trusted transparent code bypass verification + inline BOOL CanTransparentCodeSkipVerification(); +#endif // !FEATURE_CORECLR + +#if defined(FEATURE_APTCA) || defined(FEATURE_CORESYSTEM) + // Does the assembly allow partially trusted callers + inline BOOL IsAPTCA(); +#endif // defined(FEATURE_APTCA) || defined(FEATURE_CORESYSTEM) + +#ifndef FEATURE_CORECLR + BOOL AssemblyVersionRequiresLegacyTransparency(); +#endif // !FEATURE_CORECLR + +private: + // Helper class which fires transparency calculation begin/end ETW events + class ModuleSecurityDescriptorTransparencyEtwEvents + { + private: + ModuleSecurityDescriptor *m_pMSD; + + public: + inline ModuleSecurityDescriptorTransparencyEtwEvents(ModuleSecurityDescriptor *pMSD); + inline ~ModuleSecurityDescriptorTransparencyEtwEvents(); + }; +}; + +#include "securitymeta.inl" + +#endif // __SECURITYMETA_H__ |