如何防止MSIL运行时注入?

时间:2016-07-04 21:06:25

标签: c# security cil

如此处Programmatic MSIL injection或此处http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time所示,您可以使用一些棘手的注入在运行时修改IL代码。

我的问题是:如何预防?例如,如果有人使用它来绕过安全功能,我该如何避免安全漏洞?

1 个答案:

答案 0 :(得分:1)

  

如何预防?

你不能,据我所知。但你可以做到这一点并不容易。

在简单的情况下,您甚至不需要注入IL。您可以进行IL编织以修改装配。例如,您可以找到登录方法ant删除原始IL代码并只返回true,或者您可以跳转到您自己的登录方法。

public bool Login(string userName)
{
    // original method did security checks 
    // and return true if the user is authorized
    // your implementation can return true or jump to other method
}

为此,您必须在应用程序未运行时执行此操作,您需要修改程序集本身。您可以使用mono.cecil执行此操作,例如,您可以查看StaticProxy.Fody

另一种情况是为运行程序集注入代码。这分为两种情况:

  1. 当代码未被jitted \ ngen'd
  2. 当代码被jitted \ ngen'd
  3. 对于第一种情况更容易,您仍然拥有每种方法的IL并且您注入了自己的IL指令。

    第二种情况更复杂,因为Jitter将IL指针重定向到机器代码。

    对于其中两个你可以看到一堆文章\ libraris来使注入工作。

    但即使你无法注射,你仍然没有受到保护。因为你可以修改字节本身。有关详细信息,请参阅this article

    对于上述所有方法,有些情况下工作更复杂。例如,Generics,DynamicMethods会阻止加载程序集(在某些情况下需要)。

    总而言之,您很难注入代码但不能阻止它。