假设你在.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的新手)。假设输出只是确定某些日志的某些消息输出所需的一些消息代码。
假设某些公司使用该应用程序进行业务,并且该公司的一些员工编写了退出实现,则将部署方案假设为部署方案。如果该员工想要造成损害,那么将面临风险:
这是我的印象答案是4.不是吗? myClass获得执行的机会,因此基本上可以执行任何应用程序可以执行的操作,该操作由运行原始应用程序的用户启动。有办法防止这种情况吗?
如果是这样的话:它是否有任何区别(如果是,哪个),退出的签名是固定的,并且方法的输入不能在方法中改变? 该意图的方法不允许动态定义类型。
此方法也是出于意图,仅允许不能更改的输入。 假设字符串参数被调用者可以修改的其他类型替换,如StringBuilder。这会增加风险吗?
采用这种方法是否有更复杂(标准)的技术来降低风险?有替代方法吗?
答案 0 :(得分:1)
只要您在没有任何安全预防措施的情况下调用外部不受信任的方法,被调用的方法签名(通常)无关紧要。
您应该尽可能多地撤消SecurityPermissions
,以尽量减少通过从GAC /受信任代码调用不受信任的代码而暴露的攻击面。查看this tutorial以了解.NET Security的工作原理。以下内容应该考虑外部代码可能导致的任何破坏性行为:
NamedPermissionSet ps = new NamedPermissionSet("Nothing");
ps.Deny();
CallYourUnsafeMethodHere();
CodeAccessPermission.RevertAll();