summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/coreclr/hosts/coreconsole/coreconsole.cpp3
-rw-r--r--src/coreclr/hosts/corerun/corerun.cpp5
-rw-r--r--src/dlls/mscoree/unixinterface.cpp3
-rw-r--r--src/inc/MSCOREE.IDL2
-rw-r--r--src/pal/prebuilt/inc/mscoree.h5
-rw-r--r--src/vm/appdomain.hpp17
-rw-r--r--src/vm/clsload.cpp16
-rw-r--r--src/vm/corhost.cpp5
-rw-r--r--src/vm/invokeutil.cpp38
-rw-r--r--src/vm/methodtablebuilder.cpp3
-rw-r--r--src/vm/security.cpp17
-rw-r--r--src/vm/security.h2
-rw-r--r--src/vm/securitydeclarative.cpp9
-rw-r--r--src/vm/securitymeta.cpp43
-rw-r--r--src/vm/securitytransparentassembly.cpp61
15 files changed, 128 insertions, 101 deletions
diff --git a/src/coreclr/hosts/coreconsole/coreconsole.cpp b/src/coreclr/hosts/coreconsole/coreconsole.cpp
index 7523bb61ee..5e436ed7a1 100644
--- a/src/coreclr/hosts/coreconsole/coreconsole.cpp
+++ b/src/coreclr/hosts/coreconsole/coreconsole.cpp
@@ -496,7 +496,8 @@ bool TryRun(const int argc, const wchar_t* argv[], Logger &log, const bool verbo
// - Prevents the application from being torn down if a managed exception is unhandled
//
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS |
- APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP,
+ APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP |
+ APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT,
NULL, // Name of the assembly that contains the AppDomainManager implementation
NULL, // The AppDomainManager implementation type name
sizeof(property_keys)/sizeof(wchar_t*), // The number of properties
diff --git a/src/coreclr/hosts/corerun/corerun.cpp b/src/coreclr/hosts/corerun/corerun.cpp
index fdcb140607..6766b6ba17 100644
--- a/src/coreclr/hosts/corerun/corerun.cpp
+++ b/src/coreclr/hosts/corerun/corerun.cpp
@@ -537,8 +537,9 @@ bool TryRun(const int argc, const wchar_t* argv[], Logger &log, const bool verbo
// APPDOMAIN_IGNORE_UNHANDLED_EXCEPTION
// - Prevents the application from being torn down if a managed exception is unhandled
//
- APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS |
- APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP,
+ APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS |
+ APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP |
+ APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT,
NULL, // Name of the assembly that contains the AppDomainManager implementation
NULL, // The AppDomainManager implementation type name
sizeof(property_keys)/sizeof(wchar_t*), // The number of properties
diff --git a/src/dlls/mscoree/unixinterface.cpp b/src/dlls/mscoree/unixinterface.cpp
index 265e99539e..2eaa1b81cb 100644
--- a/src/dlls/mscoree/unixinterface.cpp
+++ b/src/dlls/mscoree/unixinterface.cpp
@@ -176,7 +176,8 @@ HRESULT ExecuteAssembly(
// - Prevents the application from being torn down if a managed exception is unhandled
//
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS |
- APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP,
+ APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP |
+ APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT,
NULL, // Name of the assembly that contains the AppDomainManager implementation
NULL, // The AppDomainManager implementation type name
propertyCount,
diff --git a/src/inc/MSCOREE.IDL b/src/inc/MSCOREE.IDL
index 957b02f44a..ddb326b8ce 100644
--- a/src/inc/MSCOREE.IDL
+++ b/src/inc/MSCOREE.IDL
@@ -368,6 +368,8 @@ typedef enum
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS = 0x40,
APPDOMAIN_ENABLE_ASSEMBLY_LOADFILE = 0x80,
+
+ APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT = 0x100,
#endif //FEATURE_CORECLR
} APPDOMAIN_SECURITY_FLAGS;
diff --git a/src/pal/prebuilt/inc/mscoree.h b/src/pal/prebuilt/inc/mscoree.h
index 9ec3e6409c..a526da58b6 100644
--- a/src/pal/prebuilt/inc/mscoree.h
+++ b/src/pal/prebuilt/inc/mscoree.h
@@ -236,7 +236,7 @@ struct IActivationFactory;
#define CLR_MINOR_VERSION ( 0 )
-#define CLR_BUILD_VERSION ( 22220 )
+#define CLR_BUILD_VERSION ( 22719 )
#define CLR_ASSEMBLY_MAJOR_VERSION ( 4 )
@@ -351,7 +351,8 @@ enum __MIDL___MIDL_itf_mscoree_0000_0000_0005
APPDOMAIN_ENABLE_PINVOKE_AND_CLASSIC_COMINTEROP = 0x10,
APPDOMAIN_SET_TEST_KEY = 0x20,
APPDOMAIN_ENABLE_PLATFORM_SPECIFIC_APPS = 0x40,
- APPDOMAIN_ENABLE_ASSEMBLY_LOADFILE = 0x80
+ APPDOMAIN_ENABLE_ASSEMBLY_LOADFILE = 0x80,
+ APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT = 0x100
} APPDOMAIN_SECURITY_FLAGS;
STDAPI GetRequestedRuntimeVersionForCLSID(REFCLSID rclsid, _Out_writes_opt_(cchBuffer) LPWSTR pVersion, DWORD cchBuffer, _Out_opt_ DWORD* dwLength, CLSID_RESOLUTION_FLAGS dwResolutionFlags);
diff --git a/src/vm/appdomain.hpp b/src/vm/appdomain.hpp
index 0e966659bb..4840b904df 100644
--- a/src/vm/appdomain.hpp
+++ b/src/vm/appdomain.hpp
@@ -2936,7 +2936,21 @@ public:
LIMITED_METHOD_CONTRACT;
return (m_dwFlags & ENABLE_ASSEMBLY_LOADFILE);
- }
+ }
+
+ void DisableTransparencyEnforcement()
+ {
+ LIMITED_METHOD_CONTRACT;
+
+ m_dwFlags |= DISABLE_TRANSPARENCY_ENFORCEMENT;
+ }
+
+ BOOL IsTransparencyEnforcementDisabled()
+ {
+ LIMITED_METHOD_CONTRACT;
+
+ return (m_dwFlags & DISABLE_TRANSPARENCY_ENFORCEMENT);
+ }
#endif // defined(FEATURE_CORECLR)
void SetPassiveDomain()
@@ -3997,6 +4011,7 @@ public:
#ifdef FEATURE_CORECLR
ENABLE_SKIP_PLAT_CHECKS = 0x200000, // Skip various assembly checks (like platform check)
ENABLE_ASSEMBLY_LOADFILE = 0x400000, // Allow Assembly.LoadFile in CoreCLR
+ DISABLE_TRANSPARENCY_ENFORCEMENT= 0x800000, // Disable enforcement of security transparency rules
#endif
};
diff --git a/src/vm/clsload.cpp b/src/vm/clsload.cpp
index 8d5fae5c2d..f80041cf38 100644
--- a/src/vm/clsload.cpp
+++ b/src/vm/clsload.cpp
@@ -5,12 +5,6 @@
//
// File: clsload.cpp
//
-
-
-
-//
-
-//
// ============================================================================
#include "common.h"
@@ -4880,7 +4874,7 @@ BOOL AccessCheckOptions::DemandMemberAccess(AccessCheckContext *pContext, Method
_ASSERTE(GetAppDomain()->GetSecurityDescriptor()->IsFullyTrusted() ||
m_accessCheckType == kRestrictedMemberAccess);
- if (visibilityCheck)
+ if (visibilityCheck && Security::IsTransparencyEnforcementEnabled())
{
// In CoreCLR RMA means visibility checks always succeed if the target is user code.
if ((m_accessCheckType == kRestrictedMemberAccess || m_accessCheckType == kRestrictedMemberAccessNoTransparency) &&
@@ -5530,6 +5524,9 @@ static BOOL CheckTransparentAccessToCriticalCode(
}
CONTRACTL_END;
+ if (!Security::IsTransparencyEnforcementEnabled())
+ return TRUE;
+
// At most one of these should be non-NULL
_ASSERTE(1 >= ((pOptionalTargetMethod ? 1 : 0) +
(pOptionalTargetField ? 1 : 0) +
@@ -5561,11 +5558,8 @@ static BOOL CheckTransparentAccessToCriticalCode(
{
SecurityTransparent::LogTransparencyError(pContext->GetCallerMethod(), "Transparent code accessing a critical type, method, or field", pOptionalTargetMethod);
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- return accessCheckOptions.DemandMemberAccessOrFail(pContext, pTargetMT, FALSE /*visibilityCheck*/);
- }
+ return accessCheckOptions.DemandMemberAccessOrFail(pContext, pTargetMT, FALSE /*visibilityCheck*/);
}
return TRUE;
diff --git a/src/vm/corhost.cpp b/src/vm/corhost.cpp
index 8f4769d0fe..6e26ceb7d1 100644
--- a/src/vm/corhost.cpp
+++ b/src/vm/corhost.cpp
@@ -1593,6 +1593,11 @@ HRESULT CorHost2::_CreateAppDomain(
{
pDomain->SetAllowLoadFile();
}
+
+ if (dwFlags & APPDOMAIN_DISABLE_TRANSPARENCY_ENFORCEMENT)
+ {
+ pDomain->DisableTransparencyEnforcement();
+ }
#endif // FEATURE_CORECLR
if (dwFlags & APPDOMAIN_SECURITY_FORBID_CROSSAD_REVERSE_PINVOKE)
diff --git a/src/vm/invokeutil.cpp b/src/vm/invokeutil.cpp
index 4c623f6981..60ee90630f 100644
--- a/src/vm/invokeutil.cpp
+++ b/src/vm/invokeutil.cpp
@@ -1667,14 +1667,16 @@ void InvokeUtil::CanAccessMethod(MethodDesc* pMeth,
if (pMeth->IsNDirect() ||
(pMeth->IsComPlusCall() && !pMeth->IsInterface()))
{
- MethodDesc* pmdCaller = pSCtx->GetCallerMethod();
-
- if (pmdCaller != NULL &&
- Security::IsMethodTransparent(pmdCaller))
+ if (Security::IsTransparencyEnforcementEnabled())
{
- ThrowMethodAccessException(pSCtx, pMeth, IDS_E_TRANSPARENT_CALL_NATIVE);
- }
+ MethodDesc* pmdCaller = pSCtx->GetCallerMethod();
+ if (pmdCaller != NULL &&
+ Security::IsMethodTransparent(pmdCaller))
+ {
+ ThrowMethodAccessException(pSCtx, pMeth, IDS_E_TRANSPARENT_CALL_NATIVE);
+ }
+ }
}
#else // FEATURE_CORECLR
@@ -1706,21 +1708,21 @@ void InvokeUtil::CanAccessMethod(MethodDesc* pMeth,
//checkSkipVer is set only when the user tries to invoke a constructor on a existing object.
if (checkSkipVer)
{
- MethodDesc *pCallerMD = pSCtx->GetCallerMethod();
-
- // Interop (NULL) caller should be able to skip verification
- if (pCallerMD != NULL &&
- Security::IsMethodTransparent(pCallerMD) &&
- !pCallerMD->GetAssembly()->GetSecurityTransparencyBehavior()->CanTransparentCodeSkipVerification())
+ if (Security::IsTransparencyEnforcementEnabled())
{
-#ifdef _DEBUG
- if (g_pConfig->LogTransparencyErrors())
+ MethodDesc *pCallerMD = pSCtx->GetCallerMethod();
+
+ // Interop (NULL) caller should be able to skip verification
+ if (pCallerMD != NULL &&
+ Security::IsMethodTransparent(pCallerMD) &&
+ !pCallerMD->GetAssembly()->GetSecurityTransparencyBehavior()->CanTransparentCodeSkipVerification())
{
- SecurityTransparent::LogTransparencyError(pMeth, "Attempt by a transparent method to use unverifiable code");
- }
- if (!g_pConfig->DisableTransparencyEnforcement())
+#ifdef _DEBUG
+ if (g_pConfig->LogTransparencyErrors())
+ {
+ SecurityTransparent::LogTransparencyError(pMeth, "Attempt by a transparent method to use unverifiable code");
+ }
#endif // _DEBUG
- {
ThrowMethodAccessException(pCallerMD, pMeth, FALSE, IDS_E_TRANSPARENT_REFLECTION);
}
}
diff --git a/src/vm/methodtablebuilder.cpp b/src/vm/methodtablebuilder.cpp
index b64772eb40..db099e2996 100644
--- a/src/vm/methodtablebuilder.cpp
+++ b/src/vm/methodtablebuilder.cpp
@@ -12441,6 +12441,9 @@ void MethodTableBuilder::VerifyInheritanceSecurity()
if (IsInterface())
return;
+ if (!Security::IsTransparencyEnforcementEnabled())
+ return;
+
// If we have a non-interface class, then do inheritance security
// checks on it. The check starts by checking for inheritance
// permission demands on the current class. If these first checks
diff --git a/src/vm/security.cpp b/src/vm/security.cpp
index f30ecd799c..e263c326f4 100644
--- a/src/vm/security.cpp
+++ b/src/vm/security.cpp
@@ -44,6 +44,23 @@ IPEFileSecurityDescriptor* Security::CreatePEFileSecurityDescriptor(AppDomain* p
}
#endif
+BOOL Security::IsTransparencyEnforcementEnabled()
+{
+ LIMITED_METHOD_CONTRACT;
+
+#ifdef FEATURE_CORECLR
+ if (GetAppDomain()->IsTransparencyEnforcementDisabled())
+ return FALSE;
+#endif
+
+#ifdef _DEBUG
+ if (g_pConfig->DisableTransparencyEnforcement())
+ return FALSE;
+#endif
+
+ return TRUE;
+}
+
//---------------------------------------------------------------------------------------
//
// Determine if security checks should be bypassed for a method because the method is
diff --git a/src/vm/security.h b/src/vm/security.h
index 9331a6820a..f549b1045b 100644
--- a/src/vm/security.h
+++ b/src/vm/security.h
@@ -78,6 +78,8 @@ namespace Security
inline bool CanLoadFromRemoteSources();
#endif // FEATURE_CAS_POLICY
+ BOOL IsTransparencyEnforcementEnabled();
+
BOOL BypassSecurityChecksForProfiler(MethodDesc *pMD);
inline BOOL CanCallUnmanagedCode(Module *pModule);
inline BOOL CanAssert(Module *pModule);
diff --git a/src/vm/securitydeclarative.cpp b/src/vm/securitydeclarative.cpp
index d302a6c208..b2e07974fd 100644
--- a/src/vm/securitydeclarative.cpp
+++ b/src/vm/securitydeclarative.cpp
@@ -1423,19 +1423,16 @@ void SecurityDeclarative::EnsureAssertAllowed(MethodDesc *pMeth, MethodSecurityD
}
// Check if the Method is allowed to assert based on transparent/critical classification
- if (!SecurityTransparent::IsAllowedToAssert(pMeth))
+ if (!SecurityTransparent::IsAllowedToAssert(pMeth) && Security::IsTransparencyEnforcementEnabled())
{
#ifdef _DEBUG
if (g_pConfig->LogTransparencyErrors())
{
SecurityTransparent::LogTransparencyError(pMeth, "Transparent method using a security assert");
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- // if assembly is transparent fail the ASSERT operations
- COMPlusThrow(kInvalidOperationException, W("InvalidOperation_AssertTransparentCode"));
- }
+ // if assembly is transparent fail the ASSERT operations
+ COMPlusThrow(kInvalidOperationException, W("InvalidOperation_AssertTransparentCode"));
}
return;
diff --git a/src/vm/securitymeta.cpp b/src/vm/securitymeta.cpp
index 1d50c76a76..f631cc17d1 100644
--- a/src/vm/securitymeta.cpp
+++ b/src/vm/securitymeta.cpp
@@ -644,9 +644,9 @@ void MethodSecurityDescriptor::InvokeInheritanceChecks(MethodDesc *pChildMD)
PRECONDITION(CheckPointer(pChildMD));
}
CONTRACTL_END;
-
+
const SecurityTransparencyBehavior *pTransparencyBehavior = pChildMD->GetAssembly()->GetSecurityTransparencyBehavior();
- if (pTransparencyBehavior->AreInheritanceRulesEnforced())
+ if (pTransparencyBehavior->AreInheritanceRulesEnforced() && Security::IsTransparencyEnforcementEnabled())
{
// The profiler may want to suppress these checks if it's currently running on the child type
if (Security::BypassSecurityChecksForProfiler(pChildMD))
@@ -692,11 +692,8 @@ void MethodSecurityDescriptor::InvokeInheritanceChecks(MethodDesc *pChildMD)
{
SecurityTransparent::LogTransparencyError(pChildMD, "Critical method overriding a SafeCritical base method", m_pMD);
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- SecurityTransparent::ThrowTypeLoadException(pChildMD);
- }
+ SecurityTransparent::ThrowTypeLoadException(pChildMD);
}
}
else
@@ -711,11 +708,8 @@ void MethodSecurityDescriptor::InvokeInheritanceChecks(MethodDesc *pChildMD)
{
SecurityTransparent::LogTransparencyError(pChildMD, "Transparent method overriding a critical base method", m_pMD);
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- SecurityTransparent::ThrowTypeLoadException(pChildMD);
- }
+ SecurityTransparent::ThrowTypeLoadException(pChildMD);
}
else if (methSecurityDescriptor.IsTreatAsSafe() && !methSecurityDescriptor.IsOpportunisticallyCritical())
{
@@ -726,11 +720,8 @@ void MethodSecurityDescriptor::InvokeInheritanceChecks(MethodDesc *pChildMD)
{
SecurityTransparent::LogTransparencyError(pChildMD, "Safe critical method overriding a SafeCritical base method", m_pMD);
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- SecurityTransparent::ThrowTypeLoadException(pChildMD);
- }
+ SecurityTransparent::ThrowTypeLoadException(pChildMD);
}
}
}
@@ -744,14 +735,12 @@ void MethodSecurityDescriptor::InvokeInheritanceChecks(MethodDesc *pChildMD)
{
SecurityTransparent::LogTransparencyError(pChildMD, "Critical method overriding a transparent base method", m_pMD);
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- SecurityTransparent::ThrowTypeLoadException(pChildMD);
- }
+ SecurityTransparent::ThrowTypeLoadException(pChildMD);
}
}
}
+
#ifndef FEATURE_CORECLR
// Check CAS Inheritance
@@ -1395,7 +1384,7 @@ void TypeSecurityDescriptor::InvokeInheritanceChecks(MethodTable* pChildMT)
CONTRACTL_END;
const SecurityTransparencyBehavior *pChildTransparencyBehavior = pChildMT->GetAssembly()->GetSecurityTransparencyBehavior();
- if (pChildTransparencyBehavior->AreInheritanceRulesEnforced())
+ if (pChildTransparencyBehavior->AreInheritanceRulesEnforced() && Security::IsTransparencyEnforcementEnabled())
{
// We compare the child class with the most critical base class in the type hierarchy.
//
@@ -1476,12 +1465,9 @@ void TypeSecurityDescriptor::InvokeInheritanceChecks(MethodTable* pChildMT)
{
SecurityTransparent::LogTransparencyError(pChildMT, "Transparent or safe critical type deriving from a critical base type");
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- // The parent class is critical, but the child class is not
- SecurityTransparent::ThrowTypeLoadException(pChildMT);
- }
+ // The parent class is critical, but the child class is not
+ SecurityTransparent::ThrowTypeLoadException(pChildMT);
}
}
else if (fFoundSafeCriticalParent)
@@ -1493,17 +1479,14 @@ void TypeSecurityDescriptor::InvokeInheritanceChecks(MethodTable* pChildMT)
{
SecurityTransparent::LogTransparencyError(pChildMT, "Transparent type deriving from a safe critical base type");
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- // The parent class is safe critical, but the child class is transparent
- SecurityTransparent::ThrowTypeLoadException(pChildMT);
- }
+ // The parent class is safe critical, but the child class is transparent
+ SecurityTransparent::ThrowTypeLoadException(pChildMT);
}
}
}
-#ifndef FEATURE_CORECLR
+#ifndef FEATURE_CORECLR
// Fast path check
if (SecurityDeclarative::FullTrustCheckForLinkOrInheritanceDemand(pChildMT->GetAssembly()))
{
diff --git a/src/vm/securitytransparentassembly.cpp b/src/vm/securitytransparentassembly.cpp
index 2a3ac4e493..d9b2401110 100644
--- a/src/vm/securitytransparentassembly.cpp
+++ b/src/vm/securitytransparentassembly.cpp
@@ -7,8 +7,6 @@
//
// Implementation for transparent code feature
//
-
-
//--------------------------------------------------------------------------
@@ -703,7 +701,7 @@ CorInfoIsAccessAllowedResult SecurityTransparent::RequiresTransparentCodeChecks(
// check if the caller assembly is transparent and NOT an interception stub (e.g. marshalling)
bool doChecks = !pCallerMD->IsILStub() && IsMethodTransparent(pCallerMD);
- if (doChecks)
+ if (doChecks && Security::IsTransparencyEnforcementEnabled())
{
if (!IsTransparentCallerAllowed(pCallerMD, pCalleeMD, pError))
{
@@ -812,6 +810,11 @@ static void ConvertLinkDemandToFullDemand(MethodDesc* pCallerMD, MethodDesc* pCa
return;
}
+ if (!Security::IsTransparencyEnforcementEnabled())
+ {
+ return;
+ }
+
// Profilers may wish to suppress linktime checks for methods they're profiling
if (Security::BypassSecurityChecksForProfiler(pCallerMD))
{
@@ -925,34 +928,32 @@ static void ConvertLinkDemandToFullDemand(MethodDesc* pCallerMD, MethodDesc* pCa
{
SecurityTransparent::LogTransparencyError(pCallerMD, "Transparent method calling unmanaged code");
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
+
+ if (pCallerMD->GetAssembly()->GetSecurityTransparencyBehavior()->CanTransparentCodeCallUnmanagedCode())
{
- if (pCallerMD->GetAssembly()->GetSecurityTransparencyBehavior()->CanTransparentCodeCallUnmanagedCode())
- {
#ifdef FEATURE_APTCA
- if (fCallerIsAPTCA)
- {
- // if the caller assembly is APTCA, then only inject this demand, for NON-APTCA we will allow
- // calls to native code
- // NOTE: the JIT would have already performed the LinkDemand for this anyways
- Security::SpecialDemand(SSWT_LATEBOUND_LINKDEMAND, SECURITY_UNMANAGED_CODE);
- }
-#endif // FEATURE_APTCA
- }
- else
+ if (fCallerIsAPTCA)
{
+ // if the caller assembly is APTCA, then only inject this demand, for NON-APTCA we will allow
+ // calls to native code
+ // NOTE: the JIT would have already performed the LinkDemand for this anyways
+ Security::SpecialDemand(SSWT_LATEBOUND_LINKDEMAND, SECURITY_UNMANAGED_CODE);
+ }
+#endif // FEATURE_APTCA
+ }
+ else
+ {
#if defined(FEATURE_CORECLR_COVERAGE_BUILD) && defined(FEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED)
- // For code coverage builds we have an issue where the inserted types/methods are not annotated.
- // In patricular, there may be p/invokes from transparent code. Allow that on cov builds for platform assemblies.
- // Paranoia: allow this only on non shp builds - all builds except the SHP type will have
- // FEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED defined. So we can use that to figure out if this is a SHP build
- // type that someone is trying to relax that constraint on and not allow that.
- if (!pCalleeMD->GetModule()->GetFile()->GetAssembly()->IsProfileAssembly())
+ // For code coverage builds we have an issue where the inserted types/methods are not annotated.
+ // In patricular, there may be p/invokes from transparent code. Allow that on cov builds for platform assemblies.
+ // Paranoia: allow this only on non shp builds - all builds except the SHP type will have
+ // FEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED defined. So we can use that to figure out if this is a SHP build
+ // type that someone is trying to relax that constraint on and not allow that.
+ if (!pCalleeMD->GetModule()->GetFile()->GetAssembly()->IsProfileAssembly())
#endif // defined(FEATURE_CORECLR_COVERAGE_BUILD) && defined(FEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED)
- {
- ::ThrowMethodAccessException(pCallerMD, pCalleeMD, FALSE, IDS_E_TRANSPARENT_CALL_NATIVE);
- }
+ {
+ ::ThrowMethodAccessException(pCallerMD, pCalleeMD, FALSE, IDS_E_TRANSPARENT_CALL_NATIVE);
}
}
}
@@ -975,6 +976,11 @@ VOID SecurityTransparent::EnforceTransparentAssemblyChecks(MethodDesc* pCallerMD
}
CONTRACTL_END;
+ if (!Security::IsTransparencyEnforcementEnabled())
+ {
+ return;
+ }
+
// Profilers may wish to suppress transparency checks for methods they're profiling
if (Security::BypassSecurityChecksForProfiler(pCallerMD))
{
@@ -1005,11 +1011,8 @@ VOID SecurityTransparent::EnforceTransparentAssemblyChecks(MethodDesc* pCallerMD
{
LogTransparencyError(pCallerMD, "Transparent method accessing a critical method", pCalleeMD);
}
- if (!g_pConfig->DisableTransparencyEnforcement())
#endif // _DEBUG
- {
- ::ThrowMethodAccessException(pCallerMD, pCalleeMD, TRUE, IDS_E_CRITICAL_METHOD_ACCESS_DENIED);
- }
+ ::ThrowMethodAccessException(pCallerMD, pCalleeMD, TRUE, IDS_E_CRITICAL_METHOD_ACCESS_DENIED);
}
}