关于代码访问安全与无法验证代码的混淆

Confusion regarding code access security with unverifiable code

我很困惑我需要做什么才能正确地"set up"我无法验证的方法以使其符合代码访问安全准则。


给出如下方法

[MethodImpl(MethodImplOptions.ForwardRef)]
private extern void DoStuffUnverifiable();

PEVerify 认为无法验证,我绝对需要将哪些属性应用于方法定义?

我该如何在这两者之间做出选择?此外,

是否还有其他属性是我绝对需要应用的?有什么我可以可以申请的吗?

在透明模型中,security-critical 方法用 [SecurityCritical] 属性标记:

[SecurityCritical]
public Key GetTVRoomKey() { ... }

所有“危险”方法(包含 CLR 认为可能破坏安全并允许犯人 escape) 必须用 [SecurityCritical][SecuritySafeCritical] 标记。这包括:

  • 无法验证(不安全)的方法
  • 通过 P/Invoke 或 COM 互操作调用非托管代码的方法

  • 声明权限或调用link-demanding方法的方法

  • 调用 [SecurityCritical] 方法的方法

  • 覆盖虚拟 [SecurityCritical] 方法的方法

[SecurityCritical] 表示“此方法可能允许部分受信任的调用者逃离沙箱”。 [SecuritySafeCritical] 意思是“这个方法做 security-critical 事情——但是有适当的保护措施 因此对于部分信任的呼叫者来说是安全的”。


所以是的,在你的情况下 - [SecurityCritical] 肯定是必需的,如果你想要额外的安全,请使用 [SecuritySafeCritical]