如何检测正在加载的. net程序集是否包含不安全的代码?
本文关键字:程序集 net 是否 不安全 代码 包含 加载 何检测 检测 | 更新日期: 2023-09-27 18:17:13
我正在编写一个插件系统,它需要我将。net dll加载到环境中。我需要知道它们是否包含任何指针使用或"不安全"关键字的任何其他用法。我有一个很好的反射浏览器运行,这样我就可以查找程序集中的所有类型,所有方法,所有外部引用,甚至DLL中的所有CIL指令。然而,据我所知,不安全关键字在被用来确定DLL是否可以编译后并没有被保留。
在元数据中存在不安全标签的地方吗?是否有不安全的特定CIL指令?是否有另一种方法来确定一个随机DLL有不安全的代码?
当然,不安全代码不是唯一的安全问题,但它是我现在正试图处理的问题。
我会使用这种启发式方法来检测不安全的代码:检查固定块中的对象是否固定以获取其地址。
要做到这一点,反映程序集中的方法并获取它们的localvariableinfo。如果它们的任何一个IsPinned属性为真,则该方法是不安全的。
这样做唯一会错过的不安全操作是stackalloc,因为它不需要固定。您可以通过检查方法体是否存在用于在堆栈上分配空间的Localloc操作码来捕获此错误。
执行这两项检查,您应该错过的唯一不安全方法是通过指向局部变量的指针操作堆栈上的值类型的方法。不幸的是,获取局部变量的地址是用于许多普通任务的普通编译器操作,您无法将其过滤掉。
请注意,c#以外的编译器可以自由地使用这些方法作为安全方法的正常编译的一部分,然而,对于c#,这种启发式应该可以完美地工作。