允许执行extern接口实现:有哪些风险?

时间:2011-11-25 18:36:59

标签: .net interface dynamic-linking assembly.load

从编写ABAP程序开始,我将以下方法称为程序的“退出”,因此我选择了相应的名称。

假设你在.Net,

1)定义一个接口

namespace Exits {
    public interface Exit {
       int exitMethod(string s); // signature serves as example only
    }
}

2)为应用程序的用户提供一些传递写入用户名称的方法 程序集ExitImplementation.dll和类的名称,比如实现接口退出,myClass : exit到您的应用程序。例如。作为命令行参数或以某种形式。

您将用户程序集的名称存储在string assemblyName中,并在string theImplementation中存储该类的名称(包括名称空间),然后将其加载为执行它:

3)

    Assembly assembly = Assembly.LoadFrom(assemblyName); 
         // assuming assembly is deployed by user into folder where application resides
    Exit theExitImplementation = assembly.CreateInstance(theImplementation) as Exit;

    int k = theExitImplementation.exitMethod("whatever");  

(第一个问题,不太重要:这项技术是否在ABAP世界之外有一个名称,它叫做什么?:-))

我想知道的是,让您的应用程序执行此用户代码会带来哪些风险(请原谅我这是一个天真的问题,我还是.Net的新手)。假设输出只是确定某些日志的某些消息输出所需的一些消息代码。

假设某些公司使用该应用程序进行业务,并且该公司的一些员工编写了退出实现,则将部署方案假设为部署方案。如果该员工想要造成损害,那么将面临风险:

  1. 只是日志中的错误消息?
  2. 应用程序的类实例的内容?
  3. 运行应用程序的PC的资源?
  4. 坏?
  5. 这是我的印象答案是4.不是吗? myClass获得执行的机会,因此基本上可以执行任何应用程序可以执行的操作,该操作由运行原始应用程序的用户启动。有办法防止这种情况吗?

    如果是这样的话:它是否有任何区别(如果是,哪个),退出的签名是固定的,并且方法的输入不能在方法中改变? 该意图的方法不允许动态定义类型。

    此方法也是出于意图,仅允许不能更改的输入。 假设字符串参数被调用者可以修改的其他类型替换,如StringBuilder。这会增加风险吗?

    采用这种方法是否有更复杂(标准)的技术来降低风险?有替代方法吗?

1 个答案:

答案 0 :(得分:1)

只要您在没有任何安全预防措施的情况下调用外部不受信任的方法,被调用的方法签名(通常)无关紧要。

您应该尽可能多地撤消SecurityPermissions,以尽量减少通过从GAC /受信任代码调用不受信任的代码而暴露的攻击面。查看this tutorial以了解.NET Security的工作原理。以下内容应该考虑外部代码可能导致的任何破坏性行为:

NamedPermissionSet ps = new NamedPermissionSet("Nothing");
ps.Deny();
CallYourUnsafeMethodHere();
CodeAccessPermission.RevertAll();