【问题标题】:How to mark a .net assembly as safe?如何将.net 程序集标记为安全?
【发布时间】:2012-01-09 21:33:25
【问题描述】:

如何将程序集标记为“安全”?

或者,当我的程序集中的某些东西不“安全”时,我如何让 Visual Studio 告诉我?


有时你不能使用一个程序集,除非它是“安全的”(例如from SQL Server)。

我希望我的程序集被标记为安全。如果我的程序集因为不安全而无法被标记为安全,我想知道如何知道我的程序集不安全。


Visual Studio 中有一些似乎与安全性相关的概念,它们可能与“安全”的程序集有关,也可能无关:

  1. 允许不安全代码汇编选项:

    • 如果我选中允许不安全代码选项,允许什么?
    • 如果我取消选中允许不安全代码选项,什么是不允许的?
    • “不安全代码”与“安全”程序集有什么关系(如果有)?

      (我问是因为我的程序集不“允许不安全代码”,但允许 P/Invoke 调用 - 我认为这是“不安全”的定义)

  2. ClsCompliant 组装选项:

    [assembly: CLSCompliant(true)]
    namespace MyApplication
    
    • “符合 cls”的代码与“安全”的程序集有什么关系(如果有)?
  3. 不安全代码块:

    int error;
    unsafe
    {
        error = 0x80004005;
    }    
    

    unsafe 块内的代码是“不安全的”

  4. UnsafeNativeMathods

    Microsoft 建议创建一个名为 UnsafeNativeMethods 的类,其中包含不安全的托管代码:

    [SuppressUnmanagedCodeSecurity]
    internal static class UnsafeNativeMethods
    {
       ...          
    }
    

    这与SafeNativeMethods形成鲜明对比:

    [SuppressUnmanagedCodeSecurity]
    internal static class SafeNativeMethods
    {
       ...          
    }
    

    包含安全的本机方法,以及NativeMethods:

    internal static class SafeNativeMethods
    {
       ...          
    }
    

    包含本机方法。

如何将程序集标记为“安全”?

SQL 如何知道汇编是“不安全的”?

【问题讨论】:

  • SAFE 在这种情况下是关于程序集 CAS 级别的。 MSDN 上有一篇非常好的文章,其中谈到了 designing assemblies for SQL Server 并详细说明了您的程序集的 SAFEness。

标签: c# assemblies


【解决方案1】:

如何将程序集标记为“安全”?

你想错了。

你认为可能想杀了你的人递给你一瓶,然后说“喝这个”。你说“喝起来安全吗?”那家伙说“读瓶子”。你做。上面写着“可以安全饮用”。

你喝吗?

液体是否可以安全饮用与瓶子上的标签内容无关!完全可以将汽油放入标有“安全饮用”的瓶子中。

你是将装满可疑液体的瓶子分发给 SQL Server 的人,SQL Server 说“我不相信你要在这个程序集上贴的任何标签”。相反,它将通过限制程序集可以执行的操作来使程序集“安全”。它锁定了对该事物的权限,因此您的程序集利用 SQL Server 进行的任何尝试都将导致其通过异常终止。

我如何知道我的程序集中的某些内容何时不“安全”?

尝试以低信任度运行它。它是否因安全异常而崩溃并死亡?如果答案是肯定的,那么根据该信任级别是不安全的。不同的信任级别授予不同级别的权限。您安装在自己机器上的代码通常是完全受信任的,您从公司网络运行的代码不太受信任,您从 Internet 运行的代码几乎完全不受信任。您在 SQL Server 中运行的代码获得的信任级别最低;它认为几乎所有东西都不安全。

如果我选中允许不安全代码选项,允许什么?

然后,您可以编写代码,以选择的方式直接操作指向内存的原始指针。这需要完全的信任;如果您希望使用不安全的代码,则必须对您的程序集施加no 限制。不安全的代码可以改变进程中用户模式内存的每一点。

“符合 cls”的代码与“安全”的程序集有什么关系(如果有的话)?

除了符合 CLS 的代码不允许 API 采用原始指针类型之外,其他都没有。

CLS 是公共语言子集——所有兼容的 .NET 语言中都需要具备的一组功能。这样你就不必问自己“嘿,如果我用 C# 编写这个接受 int 并返回字符串的方法,我可以从 F# 调用它吗?”如果您限制自己遵守 CLS 的规则,那么您知道任何 CLS 语言都可以使用您的库,并且您可以使用符合 CLS 的库,无论它们是用什么语言编写的。这与安全无关。

不安全块内的代码是“不安全的”

不安全块内的代码如果写得不好,可以在整个进程中任意破坏内存。我们让您将代码标记为“不安全”,以便您知道将代码审查工作集中在哪里。在不安全块中,,而不是C# 语言,负责确保类型和内存安全。

一个你没有问的问题:

将程序集标记为“对部分受信任的调用者安全”是什么意思?

这是一种您确实将程序集标记为“安全”的情况。通过使用 AllowPartiallyTrustedCallerAttribute (APTCA) 标记程序集,您(程序集的作者)断言,如果程序集中的代码由试图攻击用户的低信任恶意代码调用,则程序集中没有任何内容低信任的恶意代码可以用来对付用户。简而言之,您是在说“即使用户完全信任我的代码,我的代码也不是邪恶代码可以用来对付用户的武器”。

我们发明 APTCA 是因为早先,Peter Torr 和我发现有一种方法可以让信任度低的敌对调用者以这种方式欺骗 JScript.NET 代码(默认情况下是高度信任的)低信任代码可能会导致 JScript.NET 代码代表它攻击用户。 (这通常被称为“引诱攻击”,因为低信任代码“引诱”高信任代码为它做脏活。)

作为确保此类错误不再发生的巨大努力的一小部分,CLR 团队引入了 APTCA。通过将 APTCA 放在程序集上,您就是在告诉您的用户,您正在声明他们对您的工作的信任不会被恶意的第三方代码滥用。不要将 APTCA 放在程序集上,除非 (1) 您打算让程序集被用户认为可能具有恶意的代码调用,并且 (2) 您实际上已经进行了彻底的安全审查。

幸运的是,新的基于透明度的安全模型消除了对 APTCA 的大部分需求。

如果 APTCA 不存在于程序集中,则“链接请求”将确保调用程序集的代码完全受信任。请注意,它是链接需求,而不是完整需求

【讨论】:

  • 我如何知道程序集中的某些内容何时不“安全”? SQL Server 无需执行所有包含的代码即可知道程序集是否不安全。如果不执行所有包含代码,我如何知道程序集是否不安全?如果 SQL Server 可以在不运行代码的情况下确定程序集是否不安全,则大概 Visual Studio 也可以通过运行代码来确定程序集是否不安全。如何确定我的程序集是否不安全(不运行所有代码(使用所有可能的参数(使用所有可能的代码路径)))
【解决方案2】:
  • this 读取,SQL Server 的“安全”是:

SAFE 是最严格的权限集。 由具有 SAFE 权限的程序集执行的代码无法访问 外部系统资源,如文件、网络、环境 变量或注册表

所以它是关于 在 SQL Server 代码域内设置的代码执行权限

  • Unsafe 来自 VS 的标志基本上与代码执行安全无关,但启用了非托管代码执行。所以这是关于将非托管代码集成到托管代码库中

  • CLS Compilant 定义的属性 here 是关于定义标记有该属性的程序集的代码,就像遵循 CSL(通用语言规范)准则的代码一样。所以这是关于编译和代码架构

如何将程序集标记为“安全”?

它在此答案的第一个链接中定义,并且与 SQL Server 集成有关。

SQL 如何知道汇编是“不安全的”?

考虑到提供的描述:“创建一个托管应用程序模块,其中包含类元数据和托管代码作为 SQL Server 实例中的对象”,SQL Server 中继 metadata,在某些字段中提供了有关以下事实的信息:如果是否“安全”。

【讨论】:

  • 还需要注意的是,您可以在创建程序集时设置程序集的Permission_Set。来自CREATE ASSEMBLYdocumentation:PERMISSION_SET { SAFE |外部访问 |不安全}
【解决方案3】:

在这种情况下,SQL 正在寻找您已包装在“不安全”块中的代码。这是一个指向 unsafe 关键字的 MSDN 指针

http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

【讨论】:

    【解决方案4】:

    取决于您的意思,但如果您导入程序集(即 .dll),则该 .dll 文件的属性中有一个“取消阻止”选项。这将允许您使用 dll 作为参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2018-09-08
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多