标签: code-access-security

如何在不违反继承安全规则的情况下在.NET 4+中实现ISerializable?

背景:Noda Time包含许多可序列化的结构.虽然我不喜欢二进制序列化,但我们收到了许多支持它的请求,回到1.x时间线.我们通过实现ISerializable接口来支持它.

我们收到了最近一份关于Noda Time 2.x 在.NET Fiddle中失败的问题报告.使用Noda Time 1.x的相同代码工作正常.抛出的异常是这样的:

重写成员时违反了继承安全规则:'NodaTime.Duration.System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)'.覆盖方法的安全性可访问性必须与被覆盖的方法的安全性可访问性相匹配.

我把它缩小到了目标框架:1.x目标.NET 3.5(客户端配置文件); 2.x的目标是.NET 4.5.它们在支持PCL与.NET Core和项目文件结构方面存在很大差异,但看起来这是无关紧要的.

我已经设法在本地项目中重现了这一点,但我还没有找到解决方案.

在VS2017中重现的步骤:

  • 创建新的解决方案
  • 创建一个面向.NET 4.5.1的新的经典Windows控制台应用程序.我称之为"CodeRunner".
  • 在项目属性中,转到签名并使用新密钥对程序集进行签名.取消密码要求,并使用任何密钥文件名.
  • 粘贴以下代码进行替换Program.cs.这是此Microsoft示例中代码的缩写版本.我保持所有路径相同,所以如果你想回到更完整的代码,你不应该改变其他任何东西.

码:

using System;
using System.Security;
using System.Security.Permissions;

class Sandboxer : MarshalByRefObject  
{  
    static void Main()  
    {  
        var adSetup = new AppDomainSetup();  
        adSetup.ApplicationBase = System.IO.Path.GetFullPath(@"..\..\..\UntrustedCode\bin\Debug");  
        var permSet = new PermissionSet(PermissionState.None);  
        permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));  
        var fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<System.Security.Policy.StrongName>();  
        var newDomain = AppDomain.CreateDomain("Sandbox", null, adSetup, permSet, fullTrustAssembly);  
        var handle = …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization appdomain code-access-security

96
推荐指数
2
解决办法
6278
查看次数

任何现实世界都使用"代码访问安全性"吗?

警告:

自问这个问题以来,较新版本的.Net和.Net核心已经删除和/或更改了"代码访问安全性"(CAS).

原始问题:

我正在学习70-536 .NET Framework - 应用程序开发基础考试,因为我已编程.net多年,这应该不难!

但是我不得不学习"代码访问安全性"(CAS),因为我从来没有需要使用或配置它,我想知道是否有其他人找到了它的真实生活用途?

请提供您何时使用CAS的示例,它已成为解决方案的一部分,而不是问题.

(到目前为止,其他一切都与我在.NET编程中必须完成的任务有一些关系)


相关问题:


结果到目前为止.

  • 当您托管第三方代码时,CAS非常有用.例如,网络托管公司可以使用它来阻止客户的Asp.net代码对服务器造成损害.(当.NET用作VBA的替代品时,Office也会使用它)

  • 到目前为止,它在Microsoft应用程序之外使用的唯一详细示例是:

    我最近的一个项目有类似的东西:允许用户上传一个库,并测试它的性能("谁制作最好的算法").不用说,我们在那里需要CAS.

  • CAS似乎对获得JITDC认证很有用,就像美国国防部一样,但是我不知道CAS是否具有任何实际价值,或者它是否只是盒子滴答作响.

(如果您需要绕过使用CAS的主机并且您拥有对它们的管理员权限,则可以将程序集放在GAC中.)

展望未来,CAS在.net 4中有点复杂.


至少看起来新的Microsoft考试不会有包含CAS的"基础"考试.我不知道它是否会进入新的Winforms/WPF考试.

.net security code-access-security

68
推荐指数
3
解决办法
3409
查看次数

寻找沙盒.NET插件的实用方法

我正在寻找一种从.NET应用程序访问插件的简单而安全的方法.虽然我认为这是一个非常普遍的要求,但我很难找到满足我所有需求的东西:

  • 宿主应用程序将在运行时发现并加载其插件程序集
  • 插件将由未知的第三方创建,因此必须对它们进行沙盒处理,以防止它们执行恶意代码
  • 常见的互操作程序集将包含主机及其插件引用的类型
  • 每个插件程序集将包含一个或多个实现公共插件接口的类
  • 初始化插件实例时,主机将以主机接口的形式向其传递对自身的引用
  • 主机将通过其公共接口调用插件,插件也可以同样调用主机
  • 主机和插件将以互操作程序集中定义的类型的形式交换数据(包括泛型类型)

我已经调查了MEF和MAF,但我很难看到如何使它们中的任何一个符合要求.

假设我的理解是正确的,MAF无法支持在其隔离边界上传递泛型类型,这对我的应用程序至关重要.(MAF实现起来也非常复杂,但如果我能解决泛型问题,我会准备好使用它).

MEF几乎是一个完美的解决方案,但似乎无法满足安全性要求,因为它将扩展程序集加载到与主机相同的AppDomain中,因此显然可以防止沙箱化.

我已经看到了这个问题,它讨论了在沙盒模式下运行MEF,但没有描述如何.这篇文章指出"当使用MEF时,你必须信任扩展不运行恶意代码,或通过代码访问安全提供保护",但同样,它没有描述如何.最后,有这篇文章描述了如何防止未知插件被加载,但这不适合我的情况,因为即使是合法的插件也是未知的.

我已经成功地将.NET 4.0安全属性应用于我的程序集,并且MEF正确地尊重它们,但是我没有看到这有助于我锁定恶意代码,因为许多可能是安全威胁的框架方法(例如,方法System.IO.File)标记为SecuritySafeCritical,这意味着它们可以从SecurityTransparent程序集访问.我在这里错过了什么吗?是否有一些额外的步骤我可以告诉MEF它应该为插件程序集提供互联网权限?

最后,我也看了创造我自己的简单的沙盒插件架构,使用单独的AppDomain,描述在这里.但是,据我所知,这种技术只允许我使用后期绑定来调用不受信任的程序集中的类上的静态方法.当我尝试扩展这种方法来创建我的一个插件类的实例时,返回的实例无法转换为公共插件接口,这意味着主机应用程序无法调用它.是否有一些技术可用于跨AppDomain边界获得强类型代理访问?

我为这个问题的长度道歉; 原因是要显示我已经调查过的所有途径,希望有人可以提出新的尝试.

蒂姆,非常感谢你的想法

.net mef sandbox code-access-security maf

59
推荐指数
2
解决办法
6903
查看次数

尝试通过安全透明方法X访问安全关键方法Y失败

我有一个相当稳定的服务器应用程序版本,已经在数十个客户中部署了将近一年.

一位新客户最近设置了该应用程序,并收到以下错误:

System.MethodAccessException:尝试通过安全透明方法[SomeMethod]访问安全性关键方法[SomeOtherMethod]失败.

SomeMethod和SomeOtherMethod都是我编写的程序集中的方法,这些方法是针对.NET 4构建的,并且是在Windows服务中运行的.如果它有所不同,SomeOtherMethod确实引用了针对.NET 2.0构建的第三方程序集(EntLib 4.1)中的类型.查看EntLib 4.1的代码,我确实看到它们同时使用SecurityTransparent和APTC属性,但这从未在其他客户端引起过问题.

这些程序集是从.NET 2.0 CLR升级的,但很久以前.这个确切的代码正好在其他客户上运行,我没有明确使用APTC属性,也没有在任何地方使用SecurityCritical属性.

这使我得出结论,这是一个配置问题或者.NET Framework补丁问题.是否有针对.NET发布的补丁会导致这种突破性变化?是否有一个配置设置在某些地方执行这种类型的检查,默认情况下是关闭但我的客户可能已启用?

最后一点.我的服务使用SSRS RDLC生成PDF.由于.NET 4中的一些更改,我必须通过以下配置强制服务使用旧版安全策略:

  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true" />
  </runtime>
Run Code Online (Sandbox Code Playgroud)

有关我需要执行此操作的详细信息,请参阅此stackoverflow帖子:.NET 4.0中的内存使用率非常高

重要的是,我也在所有其他客户那里做到这一点.只有这一个客户遇到问题.

security cas .net-4.0 code-access-security

21
推荐指数
3
解决办法
2万
查看次数

对象反射的安全风险是什么?

因此,经过几个小时的解决方法,目前在Google App Engine上禁用了Reflection的限制,我想知道是否有人可以帮助我理解为什么对象反射可能构成威胁.是因为我可以检查一个类的私有变量还是有其他更深层次的原因?

java security reflection code-access-security

20
推荐指数
1
解决办法
1万
查看次数

在Windows上禁用应用程序的证书吊销检查

我有一个.NET 3.5桌面应用程序,当它所在的测试机器不在办公室时,它已经显示出功能的周期性减速.
我设法在没有互联网连接的情况下在办公室的机器上复制错误,但只有当我使用ANTS性能分析器时,我才能更清楚地了解正在发生的事情.

在ANTS中,我看到"等待同步"需要16秒,这与NHibernate尝试加载System.Data.SqlServerCE.dll程序集时在应用程序中看到的延迟相对应.
如果我立即再次尝试动作它会毫无延迟地工作但如果我离开它5分钟,那么下次我尝试它时再次加载会很慢.

到目前为止,我的研究似乎是因为SqlServerCE dll已签名,因此系统正在尝试连接以获取证书吊销列表并超时.
禁用"Internet选项"LAN设置中的"自动检测设置"设置会使问题消失,同时禁用"检查发布者证书吊销".
但是,部署此应用程序的管理员不会对在每台计算机或每个用户上禁用证书检查的想法感到满意,因此我确实需要让应用程序级别禁用CRL检查工作.

.net 2.0中有一个记录良好的错误,它描述了这种行为,并提供了一个配置文件元素的可能修复.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

不是为我工作然而,即使我使用.NET 3.5.
SQLServerCE dll是由NHibernate动态加载的,我想知道它是动态的这个事实可能不知何故设置不起作用的原因,但我不知道如何检查它.

任何人都可以提供有关配置设置可能不起作用的建议吗?
或者是否有另一种方法可以在应用程序级别禁用检查,也许是CAS策略设置,我可以使用它在应用程序安装时为应用程序设置例外?
或者我可以在应用程序中更改信任级别或类似的东西吗?

c# nhibernate certificate code-access-security certificate-revocation

20
推荐指数
2
解决办法
1万
查看次数

保护node-webkit桌面应用程序中的源代码

首先,我见过nwsnapshot.并没有帮助.

我正在使用node-webkit构建库存管理系统作为桌面应用程序.正在构建的项目使用compoundjs(mvc javascript库).它有一个明确的文件夹结构(你知道mvc)和里面的多个javascript文件.

问题是nwsnapshot允许应用程序只有一个快照文件,但应用程序的逻辑分布在不同的javascript文件中的所有文件夹.

那么如何在将源代码发送到客户端之前保护我的源代码呢?或任何其他解决方案或更聪明的方式(是的,我知道混淆).

model-view-controller code-access-security node.js node-webkit compoundjs

16
推荐指数
1
解决办法
6630
查看次数

C#:什么是部分受​​信任的来电者?

我没有在一个页面中看到这个明确定义:部分受信任的呼叫者.

我正在研究APTCA并且总是提到这一点,但是MSDN没有关于它的文章.

我只有一些线索,但我不是百分百肯定.

  • 从网络共享执行的代码是否符合"部分受信任的呼叫者"的条件?即使我们以管理员身份运行它(Windows UAC)?
  • .NET App作为"部分受信任"运行的其他方式有哪些?
  • 什么是ASP.net环境中的"部分受信任的呼叫者"?

我遇到过许多文章,提到有关部分可信赖的呼叫者的业务,但没有直接定义它们本身的内容.

.net security uac code-access-security

16
推荐指数
1
解决办法
1936
查看次数

如何保护我的插件,以便付费用户只能使用它?

我正在开发一些(wordpress)插件,我打算为想要使用它的人获得许可费.

因此,我需要一种方法来确保此插件不会上传到任何人都可以下载并免费使用的服务器.

所以我在考虑使用API​​密钥.有效的API密钥=用户可以使用该插件.无效=插件不起作用.

我已经看过这篇文章的PHP API密钥生成器,但我并没有那么明智.

我也知道,因为它是PHP,任何人都可以进入代码并禁用API检查(我只是在猜测)

保护插件的最佳方法是什么?API密钥?其他方法?有没有人有关于这个主题的任何好的教程的链接?

php wordpress code-access-security api-key

15
推荐指数
3
解决办法
1万
查看次数

.NET代码访问安全性:有用还是过于复杂?

另请参阅任何现实世界的"代码访问安全性"吗?

我想就此得到一些其他意见......

我喜欢桌面应用程序的代码访问安全性的想法.但是在.NET的生命周期中,我不得不承认我从来没有真正遇到CAS实际上阻止某些东西给我带来好处的情况.

但是,我曾多次在映射驱动器上共享快速.NET应用程序这样简单的事情成为企业代码访问的噩梦.必须打破caspol.exe以创建可信路径规则并且没有明确的方法来了解为什么出现故障会使CAS看起来像开发和部署过程中的安慰一样.

我想听听一些CAS实际上帮助不仅仅是伤害的情况,或者是否有其他人对其当前的实施和默认情况感到沮丧.

.net security code-access-security

14
推荐指数
1
解决办法
1642
查看次数