首页 > 解决方案 > 为什么不安全的代码上下文[与指针操作相关]是 C# 中的安全风险?

问题描述

我需要调用 C 库函数,该函数将指针作为来自一个 C# 程序的参数。在 C# 中,我们需要使用#unsafe关键字来保护指针操作。Microsoft C# 文档说使用指针会导致稳定性和安全性问题。

在公共语言运行时 (CLR) 中,不安全的代码被称为无法验证的代码。C# 中的不安全代码不一定是危险的;它只是 CLR 无法验证其安全性的代码。因此,如果 CLR 位于完全受信任的程序集中,则 CLR 只会执行不安全的代码。如果您使用不安全的代码,您有责任确保您的代码不会引入安全风险或指针错误。

文档说

使用不安全的代码会带来安全和稳定性风险。

我是 C# 语言的新手。在 UNIX 环境之前,我只使用 C 语言工作。我了解不正确的指针存在稳定性问题。它可能会使程序/操作系统崩溃或可能导致意外结果。

这些是我的问题:

1)我不明白指针操作如何导致安全问题。我唯一能想到的是调用一个包含恶意代码的函数指针,但是这个堆栈溢出链接调用函数指针不需要不安全的上下文(如果我的理解有误,请纠正我)。那么禁用指针操作将如何提高安全性呢?

2)我们可以从C#程序中调用C函数,这些C函数可能包含恶意代码。CLR 可以检测到这个安全漏洞吗?

标签: c#pointersunsafe

解决方案


滥用指针的安全风险的一个例子是use after free。这个问题的一个例子是最近在 Chrome 中发现的一个安全问题

我对 C# 不是很熟悉,但我猜 CLR 并不“理解”C 代码,而是直接执行它。因此,我认为 CLR 无法分析/检测您要使用的 C 代码的问题。


推荐阅读