【问题标题】:Any coding security issues specific to C#?任何特定于 C# 的编码安全问题?
【发布时间】:2010-03-03 18:29:06
【问题描述】:

在 C++ 世界中,有多种方法可以制造可利用的漏洞:缓冲区溢出、不安全的字符串处理、各种算术技巧、printf 问题、不以 '\0' 结尾的字符串等等。尽管这些问题大部分都在 java 中解决了,但还是有一些事情要谈。 但是是否有任何典型的 C# 特定编码漏洞列表? (与.NET平台本身无关)

【问题讨论】:

  • 我认为这应该是一个社区维基。这是一个很好的问题,但没有单一的答案。
  • @Frank:为什么?任何“问题”都是正确的答案。
  • 这是一个很好的问题,并且已经写了关于这个主题的书籍。我认为堆栈溢出有点宽泛,到目前为止的大多数答案都过于简单。
  • 你能说出任何关于这个而不是关于一般 .net 安全的书吗?
  • @Henk:您可以说“任何'问题'都是正确答案”这一事实表明它应该是 CW。

标签: c# .net security


【解决方案1】:

以下是您可能会遇到的一些问题:

  1. 如果您有任何类型的语言解释器(HTML、JavaScript 和 SQL 是三大类),那么您仍然可能存在注入或 XSS 漏洞。
  2. P/Invoke 可能会导致问题,尤其是在您进行任何自定义编组时。即使您通过 P/Invoke 调用“安全”API,您的编组代码也可能包含损坏或暴露内存的错误。
  3. 如果您正在进行文件访问,那么您需要确保您的文件始终位于可接受的目录中。请务必对错误的绝对路径和相对路径进行清理。
  4. 密码学。良好的密码编程确实很难,而且 .Net 的各种安全功能对密码攻击毫无帮助。

【讨论】:

  • +1 完全正确,但我敢肯定这不是一个完整的列表。
  • 当我们用蛮力解决停机问题时,我们将提供完整的漏洞列表。此外,第 4 点是一个很大的类别,可以分为大量较小的漏洞。
  • 这些也不是 C# 漏洞 - 只是一般的 .NET 和 ASP.NET 漏洞。
【解决方案2】:

C# 基于 .NET,而 .NET 应该是类型安全的,这意味着您列出的所有问题都不适用于 C# 或任何 .NET 语言。

但话说回来,C# 有一个 unsafe 关键字,之后所有的赌注都被取消了。
它允许真正的指针和它们附带的一切。

【讨论】:

    【解决方案3】:

    不是真的。我要在这里做一个大胆的声明:
    不存在“与 .net 平台无关的特定于 C# 的编码漏洞”。

    用 C++ 编写的程序直接编译成机器可执行文件,因此语言编译器直接负责创建执行代码,因此 C++ 可以很容易地“创建可利用的漏洞”。

    但是,用 C# 编写的程序被编译成 IL,这是 .net 平台使用的唯一语言。 .net 环境基于该 IL 代码创建机器可执行文件。 C# 所能做的一切只是 .net 平台所能做的子集。这就是我可以做出大胆声明的方式。您可以使用 C# 执行的任何创建编码漏洞的操作都可能是以下情况之一:
    1) .net 平台的一个错误

    2)在.net平台之外执行代码

    因此,您的问题目前的表述方式使我相信,要么您没有完全意识到“用 C 编写代码”和“为 .net 平台编写代码”之间的巨大差异,要么我误解了您的问题。也许两者兼而有之! 8)

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      您的问题列表中可能没有,但这是需要注意的问题:void*

      【讨论】:

      • void* 是 C# 特有的编码安全问题吗?
      • @John Saunders: "void*" 在 C# 中有效但不推荐使用,请参见:msdn.microsoft.com/en-us/library/y31yhkeb%28VS.80%29.aspx
      • @Sameh:“在不安全的环境中”。远离不安全的上下文(例如 unsafe 块),您不必担心 void*
      • 上下文被称为不安全的事物。不安全上下文中的所有代码都是不安全的。
      【解决方案5】:

      不要忘记,您可以从 C# 调用任何 C++。我一直都这样做。因此,如果 不直接调用 C++,因为 C# 调用 C++ 来完成它的工作,那么 C++ 的所有缓冲区溢出问题等都与 C# 相关。即使。 想想看。任何 COM 调用和 Marshal 调用都像平常一样容易受到攻击。在 Linux 中,您可以使用 _r 例程,而在 VC++ 的 Ver 8 中,您可以使用 _s 例程来减少缓冲区溢出的机会(需要用户缓冲区和/或最大大小)。阻止漏洞的唯一方法是关闭计算机并阅读纸质书(除非它也有病毒)。

      【讨论】:

      • 您不能只从 C# 调用任何 C++,至少不能直接调用。 C# 和 .Net 通常提供字符串类型和句柄缓冲区;您不需要处理 C 字符串函数,也不必确保使用安全的变体。这实际上根本没有回答问题,没有注意到 C# 特定的安全问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多