因为在本机代码中提供代码路径的任何托管代码都是恶意代码的潜在目标,因此确定可以安全地使用什么非托管代码以及必须如何使用它就需要非常小心。通常,所有非托管代码都不应当直接公开给部分信任的调用方(请参阅下一部分)。在对可由部分信任代码调用的库中的非托管代码使用情况的安全性进行评估时,有两个主要注意事项:
•功能。非托管 API 是否提供了安全的功能,即,不允许通过调用它来执行潜在危险的操作?代码访问安全性使用权限来实施对资源的访问,所以请考虑 API 是否使用文件、用户界面、线程,或者是否公开受保护的信息。如果是这样,则包装它的托管代码必须请求所需的权限,然后才允许输入它。此外,虽然不受权限保护,但安全性要求将内存访问限制在严格的类型安全范围内。
•参数检查。常见攻击在试图使被公开的非托管代码 API 方法进行脱离规范的操作时,会将意外的参数传递给它们。缓冲溢出是此类攻击的一个常见示例(使用范围外的索引或偏移量值),另一个示例是可能利用基础代码中的错误的任何参数。因此,即使非托管代码 API 在功能上对于部分受信任的调用方是安全的(在必要的请求之后),但托管代码仍必须彻底地检查参数的有效性,以使用托管代码包装程序层来确保恶意代码不会发出非预期的调用。
使用 SuppressUnmanagedCodeSecurity断言然后调用非托管代码有性能方面因素。对每个这样的调用来说,安全系统会自动请求非托管代码权限,这会导致每次都进行堆栈审核。如果您断言并直接调用非托管代码,则堆栈审核没有任何意义:它由断言和非托管代码调用组成。
可以将一个名为 SuppressUnmanagedCodeSecurity 的自定义属性应用于非托管代码入口点,以禁用请求 SecurityPermission.UnmanagedCode 的正常安全检查。这样做时必须始终保持谨慎,这是因为该操作会为在没有运行时安全检查的情况下进入非托管代码创建一扇打开的门。应当注意到,即使应用了 SuppressUnmanagedCodeSecurity,在 JIT 时也会发生一次性安全检查,以确保直接调用方拥有调用非托管代码的权限。
如果您使用 SuppressUnmanagedCodeSecurity 属性,请检查以下几点:
•使非托管代码入口点在代码外部不可访问(例如,“internal”)。
•调用非托管代码的任何位置都是潜在的安全漏洞。确保您的代码不是恶意代码间接调用非托管代码并避开安全检查的门户。在适当的情况下请求权限。
•在创建到非托管代码的危险路径时,使用命名约定使它成为显式的,下一部分将对此进行描述。
非托管代码方法的命名约定人们已经为命名非托管代码方法建立了有用和高度推荐的约定。所有非托管代码方法都可以划分到三个类别中:safe、native 和 unsafe。这些关键字可用作在其中定义各种非托管代码入口点的类名称。在源代码中,这些关键字应添加到类名称中;例如,Safe.GetTimeOfDay、Native.Xyz 或 Unsafe.DangerousAPI。这些类别中的每一个都应向使用它们的开发人员发送强消息,如下表所述。
关键字安全注意事项
文章来源于领测软件测试网 https://www.ltesting.net/