【问题标题】:AppLocker DLL rules on .NET assemblies.NET 程序集上的 AppLocker DLL 规则
【发布时间】:2020-02-04 16:44:00
【问题描述】:

我正在使用 AppLocker 来防止标准用户执行除我们签名的应用程序和一些必要的 Windows 文件以外的任何内容。

exe 和 dll 文件使用我们的证书使用signtool.exe 进行签名,然后在 AppLocker 中我有发布者规则来阻止用户运行任何未经我们签名的东西。

这行得通,但它不会阻止已签名的可执行文件加载未签名的 dll 文件,这似乎存在安全风险。我通过用未签名版本替换所有 dll 进行测试,只留下签名的 exe,打开阻止任何未经我们签名的内容的 dll 规则,并且应用程序运行得很好。 EventLog 没有显示任何潜在的块(我在审核模式下打开了 dll 规则)。

我做了一些阅读,据我了解,造成这种情况的原因可能是这些不是“正常”(Win32)dll,而是在 CLR 中编译和执行的程序集,它绕过了 AppLocker dll 规则?

如果是这种情况,确保 dll 不被篡改的唯一方法似乎是进行程序集签名,给每个程序集一个强名称,这样可以确保 exe 只获取和运行这些特定的 dll .这是正确的吗?

有没有办法让 AppLocker dll 规则阻止由 CLR 编译和运行的 dll(程序集)?如果没有,那么签署程序集 dll 是否有任何意义?

更新:

感谢Maurizio 找到导致此问题的原因,因为 .NET 3.5 上的 dll 规则工作正常,微软很可能刚刚破坏了 .NET 4.0 的 AppLocker。他联系了微软,后者只是 recommended using WDAC 而不是 AppLocker……微软如此不负责任地悄悄破坏人们的安全政策。

【问题讨论】:

  • 是的,使用强名称对程序集进行签名可以帮助解决您的问题。另外,看看这个article它可能对你有帮助
  • @PavelAnikhouski 谢谢你的链接!我实际上想知道在阅读程序集签名时是否可以禁用绕过功能。

标签: .net dll clr signing applocker


【解决方案1】:

我们也看到了这种行为。 根据我的测试,只有在加载 DLL 的 EXE 使用 .NET 3.5 编译时,它才能按预期工作。

这是我的测试:

  1. 我编写了一个简单的 C# 应用程序,它动态加载一个 C# 库/dll,它只计算两个数字之间的和。
  2. 针对 .NET 3.5 和 .NET 4.0+ 编译此应用 (LoadDLL.exe),并通过添加新的 AppLocker 规则来允许它。
  3. Adder.dll(执行添加的库)NOT 添加到 applocker 规则中,因此我预计它在被 LoadDLL 加载时会被阻止.exe

结果是使用 .NET3.5 编译的 LoadDLL.exe 按预期工作 - 即阻止加载 Adder.dll,而使用 .NET4.0+ 编译的 LoadDLL.exe 就像一个魅力。

我认为在引入 .NET4.0 时发生了一些变化,这使得 DLL 集合变得无用

【讨论】:

  • 非常有趣!我什至从未想过它可能与正在使用的 .NET Framework 版本有关。微软绝对应该对此做点什么,因为这似乎是一个相当严重的安全风险?也可能是这种方法已经过时,我对此表示怀疑,但在这种情况下,他们应该清楚地传达推荐的方法是什么。很好的发现!
  • @ShahinDohan - 事实上,这是一个非常严重的安全问题。那时我已经向他们开了一张票,但你猜怎么着?他们拒绝通过声称 AppLocker 必须被视为“纵深防御”措施来解决此问题。这根本没有意义,因为 .NET 3.5 按预期工作。但是他们建议转移到 WDAC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多