Visual Studio 中的攻击面
Visual Studio 中存在许多攻击媒介。所有这些都是设计使然。我们开发人员希望在构建过程中完全控制我们的系统。不幸的是,当我们说“我想在构建时删除缓存目录的内容”,这也意味着恶意项目文件可以从任何地方删除任何内容。或者更糟。妥协的办法是“嘿。我们已经给了你王国的钥匙,但我们不承认这个项目。你确定要打开这个吗?如果它做了一些愚蠢的事情,我们不承担任何责任”您提到的警告消息。
现在考虑许多开发人员以管理员身份运行 Visual Studio。
以下是其中一些攻击媒介:
构建前和构建后事件
在最简单的形式中,不受信任的项目可以执行会删除文件的预构建事件。或者更糟。几乎任何事情都可以在构建事件中执行。这是编译时发生的 101 件事。
项目开放时执行
Visual Studio 项目文件只不过是大型 MSBuild 配置。当您打开项目时,Visual Studio 会执行一些 MSBuild 目标,所有这些都是为了支持该工具。这些目标包括 Compile、ResolveAssemblyReferences、ResolveCOMReferences、GetFrameworkPaths 和 CopyRunEnvironmentFiles。如果这些目标中的任何一个存在,则也会执行其中的任务。删除文件,或更糟。
请参阅:“设计时执行”http://msdn.microsoft.com/en-us/library/ms171468.aspx http://msdn.microsoft.com/en-us/library/ms171468.aspx
智能感知
其中一部分tooling上面提到的包括 IntelliSense,它执行Compile
MSBuild 中的任务;必须执行 CSC/VBC 才能获得所有 IntelliSense 功能。由于 IntelliSense 的性质,此任务会在您工作时重复执行,而不是上面的机会仅在打开时运行一次。
请参阅:“设计时 IntelliSense”http://msdn.microsoft.com/en-us/library/ms171468.aspx http://msdn.microsoft.com/en-us/library/ms171468.aspx
隐藏在 MSBuild 的其他地方
您将在一天中手动执行大量其他常规 MSBuild 目标,包括构建、重建、测试和清理。是的,请记住,即使clean
是构建目标,所以Clean
不仅可以删除旧的内容\bin
目录。
NuGet
恶意项目还可能通过 NuGet 暴露系统。虽然包恢复不会成为问题,packages.config
可以指定不同的存储库源。然后,当您安装新包时,例如install-package jquery
,NuGet 将从不受信任的替代中检索 jQuery 包,而不是从 nuget.org 中检索。这个恶意 jQuery 包中可能包含各种其他“好东西”,这些“好东西”将作为包安装的一部分执行。
这不是 NuGet 的安全漏洞,因为“您”指定了备用包源;这是设计使然,例如拥有自己的内部包存储库的公司。
你可以做什么?
归根结底,你能对此做些什么呢?答案实际上是不要打开来自不受信任来源的项目。该项目的packages.config
文件可以在打开之前进行分析,但最大的暴露是通过 MSBuild。除非您非常擅长阅读 MSBuild 架构,否则我会避开。