.NET 程序集上的 AppLocker DLL 规则

AppLocker DLL rules on .NET assemblies

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

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

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

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

如果是这样,确保 dll 不被篡改的唯一方法似乎是进行程序集签名,为每个程序集指定一个强名称,这将确保 exe 只获取和 运行s 这些特定的 dll。这是正确的吗?

有什么方法可以使 AppLocker dll 规则阻止由 CLR 编译并 运行 的 dll(程序集)?如果没有,那么签署程序集 dll 有什么意义吗?

更新:

多亏 for finding the cause of this issue, which is that Microsoft most likely just broke AppLocker for .NET 4.0, since dll rules work fine on .NET 3.5. He contacted Microsoft, who just recommended using WDAC 而不是 AppLocker...Microsoft 如此不负责任地悄悄破坏人们的安全政策。

我们也看到了这种行为。 根据我的测试,它仅在加载 DLL 的 EXE 是使用 .NET 3.5 编译的情况下按预期工作。

这是我的测试:

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

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

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