说 .Net 平台更安全是因为 CLR 可以防止缓冲区溢出攻击,这是否正确?
假设在托管操作系统(如Cosmos、SharpOS或Singularity)中运行 Web 浏览器,攻击者在技术上是否可以将 IL 代码注入应用程序?
我是否需要担心在非托管应用程序中不可能发生的攻击?
说 .Net 平台更安全是因为 CLR 可以防止缓冲区溢出攻击,这是否正确?
假设在托管操作系统(如Cosmos、SharpOS或Singularity)中运行 Web 浏览器,攻击者在技术上是否可以将 IL 代码注入应用程序?
我是否需要担心在非托管应用程序中不可能发生的攻击?
在大多数情况下,你是对的。具有安全类型系统(不仅仅是 .NET 或 Java)的应用程序不允许应用程序违反这些约束。
缓冲区溢出和许多其他远程代码漏洞的发生是因为这些语言和运行时中的约束不提供检查,并且不能保证程序不会执行诸如在内存中执行任意代码之类的事情。安全系统验证代码不受这些影响。
(附带说明一下,C# 仍然可以执行不安全的操作并将自己设置为执行任意代码。它相当麻烦,不太可能在实际应用程序中使用。)
您会在托管浏览器中看到的安全漏洞是,如果它允许加载任意代码,使用 CLR 作为安全环境。虽然 CLR 生成的代码(即应用程序的 JIT)是安全的,但加载程序和验证程序本身通常是用低级语言编写的。有一些安全漏洞(我认为 .NET 有 2 个?)恶意形成的程序集可能会迫使实际的 CLR 执行任意代码。然而,这些都是相对罕见的问题,而且表面积远远小于其他情况。
所以,是的,一个完全安全的托管浏览器本身不会成为这些特定漏洞的牺牲品。但这也意味着您必须以类似的方式编写和执行插件(Flash?)。最后,还有其他一些可以作为攻击目标的安全漏洞,但通常它们不会像使用非托管应用程序那样严重。例如,跨站点脚本仍然是一个问题。但至少你不会有“查看文档可以执行任意代码”类型的问题。
CLR(和 JVM)可以防范许多常见的攻击,但这并不能消除所有威胁。CLR 或任何库都可能包含允许漏洞利用的错误。应用程序错误也可能允许漏洞利用。SQL 注入是由于应用程序中缺少输入验证而可能发生的攻击的一个示例。