【问题标题】:Are buffer overflow exploits possible in C#?C# 中是否可能存在缓冲区溢出漏洞?
【发布时间】:2012-02-18 17:57:48
【问题描述】:

假设 C# 程序仅使用托管的 .NET 代码,那么该程序中是否可能存在缓冲区溢出安全漏洞?如果是这样,这种漏洞怎么可能存在?

【问题讨论】:

  • 经典意义上的缓冲区溢出,还是任何类型的缓冲区溢出漏洞?
  • 查看 uncheckedunsafe 关键字。
  • @Dykam:从漏洞利用的意义上说。
  • 虽然 .NET 可能难以创建传统的缓冲区溢出漏洞,即覆盖数据或代码,但它并不能保证正确处理异常。例如,如果用户输入 30 个字符的用户名,应用程序将其交给接受 16 个字符字段的存储过程,则应引发异常。 (没有人会因为静默截断而堕落,对吗?)此时仍由应用程序来做正确的事情,没有一个包罗万象的处理程序消除异常并通过假设用户已通过身份验证的代码。

标签: c# .net security


【解决方案1】:

是的,但它们更难生产。如果您使用某些不安全的构造,而不是使用“普通”C# 代码,则只能获得缓冲区溢出。当您的代码以较低的信任度运行时,内存损坏代码根本不可能发生。

缓冲区溢出的几种可能性:

  1. 使用unsafe 关键字,它允许指针。不安全的代码与 C 或 C++ 中基于指针的代码一样容易出错。
  2. 使用不安全的 API,例如来自 Marshal 类的方法
  3. (仅限单声道)您可以禁用数组范围检查(安全与性能权衡)

除了缓冲区溢出之外,还有其他几种方法可以破坏内存。

  1. StructLayoutKind.Explicit
  2. 错误的本机互操作签名

(运行时本身是用 C++ 编写的,因此运行时中的错误也会损坏内存或溢出缓冲区,但我认为这超出了本问题的范围)

【讨论】:

    【解决方案2】:

    是的,在不安全的环境中:

    unsafe void bufferOverflow(string s)
    {
        char* ptr = stackalloc char[10];
    
        foreach (var c in s)
        {
            *ptr++ = c; // Bufferoverflow if s.Length > 10
        }
    }
    

    必须检查“允许不安全代码”才能编译。

    您不能使用数组进行传统的缓冲区溢出。它会在访问数组之前进行边界检查,除非它(CLR)可以保证它是安全的。

    【讨论】:

    • +1 用于提供示例并提及编译检查。
    • 这有点不正确 - stackalloc 不允许您缓冲溢出。
    【解决方案3】:

    仅当您使用 unsafe 关键字时。

    【讨论】:

      【解决方案4】:

      从绝对意义上说,是的,由于 .NET 运行时中的错误,缓冲区利用是可能的。但是 .NET 可以防止大多数最终用户代码(“不安全”使用除外)出现此类问题,因此在现实生活中风险较小。

      在现实生活中,大多数此类问题都来自托管代码调用的本机调用(COM dll 等)。

      【讨论】:

        猜你喜欢
        • 2016-06-04
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 2011-02-01
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        相关资源
        最近更新 更多