SerializationFormatter。使用序列化可以规避可访问性(前面已讨论)。
•ControlPrincipal。设置当前用户的能力可以欺骗基于角色的安全性。
•ControlThread。由于安全状态与线程相关联,因此操纵线程是危险的。
•ReflectionPermission
•MemberAccess。挫败可访问性机制(可以使用私有成员)。
安全性和争用条件另一个关注区域涉及由争用条件利用安全漏洞的可能性。这在几种方式下很明显。下面的子节概括了开发人员必须避免的某些主要缺陷。
dispose 方法中的争用条件
如果某个类的 Dispose 方法未同步化,则 Dispose 内部的清除代码可能会运行多次。请考虑使用以下代码:
void Dispose() { if( _myObj != null ) { Cleanup(_myObj); _myObj = null; } }因为该 Dispose 实现未同步化,所以Cleanup 可能在被第一个线程调用之后又被第二个线程调用,之后才将_myObj 设置为null。这是否是需要关注的安全问题取决于在 Cleanup 代码运行时所发生的事情。未同步化的 Dispose 实现的主要问题涉及对资源句柄(文件等)的使用。不正确的处理可能会导致使用错误的句柄,而这通常会导致安全漏洞。
构造函数中的争用条件
在某些应用程序中,其他线程有可能在类成员的类构造函数完全运行之前访问这些类成员。您应当检查所有类构造函数,以确保在发生这种情况时不会出现安全问题,或者在需要时同步化线程。
缓存对象的争用条件
如果类的其他部分未适当地进行同步化,则缓存安全信息或 Asserts 的代码也可能很容易受到争用条件的侵害。请考虑使用以下代码:
void SomeSecureFunction() { if(SomeDemandPasses()) { _fCallersOk = true; DoOtherWork(); _fCallersOk = false(); } } void DoOtherWork() { if( _fCallersOK ) { DoSomethingTrusted(); } else { DemandSomething(); DoSomethingTrusted(); } }如果可以使用同一对象从另一个线程调用的 DoOtherWork 有其他路径,则不受信任的调用方可以略过某个请求。
如果您的代码缓存了安全信息,请确保检查它是否有该漏洞。
完成器中的争用条件
争用条件的另一个来源是那些引用了它们在完成器中释放的静态或非托管资源的对象。如果多个对象共享在类的完成器中操作的资源,则这些对象必须同步化对该资源的所有访问。
其他安全技术本部分列出了其他一些可能适用于您代码的安全技术,但这里无法充分讨论它们。
On-the-Fly 代码生成某些库的操作方式是,生成代码并运行它以执行调用方的某些操作。基本问题是,代表信任度较低的代码生成代码,并以较高的信任度运行它。如果调用方可以影响代码生成,那么问题将恶化,因此您必须确保只生成安全代码。
您始终需要确切了解要生成什么代码。这意味着,您必须严格控制从用户那里得到的任何值,注意他们括起来的字符串(它们应当被转义,这样就无法包含意外的代码元素)、标识符(应当检查这些标识符,以验证它们的有效性)或其他任何内容。标识符可能是危险的,因为您可以修改经过编译的程序集,使它的标识符中包含陌生字符,而这些字符将有可能破坏程序集(尽管这通常不是安全漏洞)。
建议您使用 Reflection.Emit 生成代码,这样做通常可以帮助您避免很多这类问题。
编译代码时,请考虑恶意程序是否可以用某种方式修改它。在编译器读取磁盘上的源代码之前或在您的代码加载 DLL 之前,恶意代码是否有机会更改源代码?如果有,则必须根据情况使用代码访问安全性或文件系统中的访问控制列表来保护包含这些文件的目录。
如果调用方可以用使编译器出错的方式影响被生成的代码,则这里也可能存在安全漏洞。
以最低的可能权限设置运行生成的代码(使用 PermitOnly 或 Deny)。
基于角色的安全性:身份验证和授权除了确保代码的安全以外,某些应用程序还需要实现将使用者范围限制在某些用户或用户组的安全保护。基于角色的安全性(不在本文的讨论范围内)旨在处理这些需要。
处理机密数据在内存中时可以相当有效地保密,但持久地保存它并保密则很难做到。第一版的 .NET 框架没有为保密处理提供托管代码支持。如果您有专门技术,则加密库可提供许多基本的必需功能。
加密和签名System.Security.Cryptography 命名空间包含一组丰富的加密算法。安全地实施加密需要某些专门技术,并且不应当以特殊方式尝试。处理所涉及的数据和密钥的每个方面都必须经过仔细设计和检查。加密的细节不在本文的讨论范围内。有关详细信息,请参阅标准的参考资料。
随机数应当使用 System.Security.Cryptography.RandomNumberGenerator 来生成可能在需要真实随机性的安全操作中使用的任意随机数。使用虚拟随机数生成器会产生能够被利用的可预知性。
安装问题本部分描述了测试应用程序或组件的安装以确保最佳安全做法并保护已安装代码的注意事项。建议在安装托管代码或非托管代码时采用以下步骤,以确保安装本身的安全。应对所有支持 NTFS 的平台执行这些步骤:
•将系统设置为两个分区。
•重新格式化第二个分区;不要更改根驱动器上的默认 ACL。
•安装产品,将安装目录更改为第二个分区上的新目录。
验证以下各项:
•是否有任何代码作为服务执行,或者通常由具有全局可写权的管理员级别的用户运行?
•代码是否安装在处于应用程序服务器模式下的终端服务器系统上?您的用户现在是否可以写入其他用户可能运行的二进制代码?
•在非管理员可能写入的系统区域或系统区域的子目录中,是否有任何内容最终出现在这里?
此外,如果产品需要与 Web 进行交互,则应当知道偶尔使用 Web 服务器将允许用户运行通常在 IUSR_MACHINE 帐户的上下文中执行的命令。某些全局可写的文件或配置项可以在这些条件下被来访者帐户利用,请验证不存在这样的文件或配置项。
文章来源于领测软件测试网 https://www.ltesting.net/