可以将 LinkDemands 放在接口上,以有选择地挑出某些接口,使其不能由部分信任的代码使用(例如,在使用 AllowPartiallyTrustedCallers 属性时)。
•如果在不包含 AllowPartiallyTrustedCallers 属性的程序集中定义接口,则可以在部分信任的类上实现该接口。
•如果将 LinkDemand 放在一个实现接口方法的类的公共方法上,在随后强制转换到该接口并调用该方法时,将不会执行 LinkDemand。在这种情况下,因为是对接口进行链接,所以只考虑接口上的 LinkDemand。
应当审阅以下各项是否有安全问题:
•接口方法上的显式链接请求。确保这些链接请求提供了预期的保护。确定恶意代码是否可以使用强制转换来避开前面描述的链接请求。
•具有链接请求的虚拟方法。
•它们实现的类型和接口应当一致地使用 LinkDemands。
虚拟内部重写在确认代码对其他程序集不可用时,需要了解类型系统可访问性的细微差别。声明 virtual 和 internal 的方法可以重写超类的 vtable 条目,并且只能在同一个程序集的内部使用,因为它是内部的。但是,重写的可访问性是由 virtual 关键字决定的,并且只要代码能够访问类本身,就可以从另一个程序集对该可访问性进行重写。如果重写的可能性比较小,请使用声明性安全解决它,或者删除 virtual 关键字(如果它不是必需的)。
包装程序代码包装程序代码(特别是在包装程序比使用它的代码具有更高可信度时)可以显露一组独特的安全漏洞。如果没有将调用方的受限制权限包括在适当的安全检查中,则代表调用方所执行的任何操作都是可能被利用的潜在漏洞。
不要通过包装程序来启用调用方本身无法执行的某些操作。在执行某些涉及受限制安全检查的操作时(与完整的堆栈审核请求相反),会有特殊的危险性。涉及到单一级别的检查时,在实际调用方与可疑 API 元素之间插入包装程序代码,可以很容易地使安全检查在不应当成功时成功通过,从而降低了安全性。
委托无论何时,如果您的代码从可能调用它、但信任度较低的代码那里取得委托权,请确保您不会让信任度较低的代码提升它的权限。如果您取得委托权并随后使用它,那么,如果委托中或委托下面的代码试图执行受保护的操作,则创建委托的代码将不会在调用堆栈中,并且不会测试它的权限。如果您的代码和委托代码具有比调用方更高的特权,这将使调用方能够在不成为调用堆栈一部分的情况下改变调用路径。
文章来源于领测软件测试网 https://www.ltesting.net/