【问题标题】:How to prevent access to local file system如何防止访问本地文件系统
【发布时间】:2011-12-21 14:00:57
【问题描述】:

我的 (C#) 应用程序可以加载外部 DLL(不是我编写的)并执行这些库中的代码。库可以是 C# 或 CPP。

我需要确保这个外部代码不会访问我本地文件系统中的任何文件(读取和写入),除非来自特定文件夹。

我该怎么做?

【问题讨论】:

  • 您不能以其他方式对直接使用 winapi 的原生 C++ 代码进行沙箱处理,除非使用限制文件系统访问的用户帐户运行进程。
  • 你说 c# 或 CPP..他们总是托管库吗?
  • 不可能将对非托管代码的调用包装在具有受限访问权限的模拟调用(登录用户 API)中,这样就不必以受限权限运行整个应用程序,而只需限制外部调用?
  • @Hans 并非如此。有用于沙盒通用代码的工具。

标签: c# security acl


【解决方案1】:

我见过这样做的第三方代码;例如,Jint 允许您编写操作 CLR 对象的 JavaScript 脚本,但它通过使用权限阻止任何源自 JavaScript 的代码路径访问文件系统、反射等。

您可以阅读 Jint 的文档并查看其源代码以了解更多详细信息,但其本质似乎是这样的:

PermissionSet myPermissionSet = new PermissionSet(PermissionState.None);
// or some other permission set, depending on your requirements

try {
    myPermissionSet.PermitOnly();
    // run untrusted code
} finally {
    CodeAccessSecurity.RevertPermitOnly();
}

我读过的很多东西都说您需要创建一个沙盒应用程序域(我从未在这方面取得过很大成功),但 Jint 的方法似乎运作良好。不过,您可能需要注意第三方代码挂钩的静态事件,这些事件稍后会触发 - 然后它们可能会逃脱 PermitOnly 范围。

【讨论】:

    【解决方案2】:

    以受限用户帐户的身份运行应用程序,并仅授予用户对该特定文件夹的访问权限。

    【讨论】:

    • 这是一个很好的解决方案,但现在我遇到了另一个问题 - 我必须能够从管理员用户连接到由 java 进程创建的管道。我收到拒绝访问错误。
    • 让管理员用户进程创建具有允许受限用户访问它的权限的管道
    【解决方案3】:

    通过操作系统工具(文件系统权限)保护文件,创建一个只能访问这些文件的帐户并使用该帐户运行应用程序

    【讨论】:

      【解决方案4】:

      这取决于您的框架,但您可以使用 Caspol(代码访问安全策略)直到 .Net 3.5(我也认为 C++ DLL)来指定包括 IO 访问在内的安全权限。

      希望有帮助:)

      【讨论】:

        【解决方案5】:

        看看 Molebox,也许它会满足您的需求。 Molebox 允许您将模块包装到沙箱中。

        【讨论】:

          猜你喜欢
          • 2016-11-22
          • 2019-08-08
          • 2016-01-01
          • 2016-09-18
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多