C#源代码安全缺陷与提高源代码质量解决方案-WCF服务配置安全
C#源代码安全缺陷与提高源代码质量解决方案-WCF服务配置安全
WCF的安全体系
WCF的安全体系主要包括三个方面:
1. 传输安全(Transfer Security)
2. 授权或者访问控制(Authorization OR Access Control)
3. 审核(Auditing)。
而传输安全又包括两个方面:认证(Authentication)和消息保护(Message Protection)。
认证帮助客户端或者服务确认对方的真实身份,而消息保护则通过签名和加密实现消息的一致性和机密性。
WCF采用两种不同的机制来解决这三个涉及到传输安全的问题,我们一般将它们称为不同的安全模式,即Transport安全模式和Message安全模式。
(1) 配置管理:WCF错误配置:匿名的消息客户端
匿名身份认证可能导致一系列的问题,包括信息泄露,拒绝服务和任意代码执行。
XML Code:
<binding name="basicBinding">
<security mode="Message">
<transport clientCredentialType="None" /> //不安全的配置
</security>
</binding>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
<security mode="Message">
<transport clientCredentialType="None" /> //不安全的配置
</security>
</binding>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
如何防止:
服务应该对客户端进行身份认证,限制匿名用户访问所有功能。
(2) 配置管理:WCF错误配置:匿名的传输客户端
匿名身份认证可能导致一系列的问题,包括信息泄露,拒绝服务和任意代码执行。
XML Code:
<binding name="basicBinding">
<security mode="Transport">
<transport clientCredentialType="None" /> //不安全的配置
</security>
</binding>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
<security mode="Transport">
<transport clientCredentialType="None" /> //不安全的配置
</security>
</binding>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
如何防止:
服务应该对客户端进行身份认证,限制匿名用户访问所有功能。
(3) 配置管理:WCF错误配置:调试信息
将IncludeExceptionDetailInFaults设置为true,可以使异常信息传入客户端,以便进行调试。
攻击者可以利用从调试输出中获得的附加信息,对应用程序所用的框架、数据库或其他资源发起攻击。
XML Code:
<serviceBehaviors>
<behavior name="metadataAndDebugEnabled">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
<behavior name="metadataAndDebugEnabled">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
如何防止:
程序发布或部署时应该配置为不显示调试信息,以免造成信息泄露。
设置<serviceDebug>标签的includeExceptionDetailInFaults值为False,从而避免应用程序输出调试信息可能导致的安全隐患。
(4) 配置管理:WCF错误配置:未启用安全模式
应用程序中没有对传输安全性或消息安全性进行严格控制,无法保证消息的完整性或保密性。将WCF安全绑定设为None时,将会禁用传输安全性和消息安全性。
下列配置可将安全绑定模式设为None,该做法是不安全的。
XML Code:
<system.serviceModel>
<bindings>
<binding name="MyBinding">
<security mode="None"/>
</binding>
</bindings>
</system.serviceModel>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
<bindings>
<binding name="MyBinding">
<security mode="None"/>
</binding>
</bindings>
</system.serviceModel>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
如何防止:
将安全模式设置为Transport,Message或者TransportWithMessageCredential,来定义程序的传输安全性或消息安全性。
(5) 配置管理:WCF错误配置:启用安全传输
应用程序使用依赖传输模式传输安全的WCF终结点。传输模式是最不安全的选项,应避免使用。传输安全指定的保密性、完整性和认证由传输层机制(如HTTPS)提供。使用HTTPS之类的传输协议时,此模式具有明显优势,其性能高效。此安全模式的不足在于这种安全机制分别应用在通信路径中的每一个跃点上,导致通信容易受到中间人攻击。WCF还提供另外两种传输安全模式,可优先采用这两种模式:消息安全模式和带消息凭据的传输安全模式。消息安全模式使用WS-Security规范,可在消息级别确保保密性、完整性和认证。这实现了端到端的安全性以及传输方法的灵活性。然而,这会降低性能。最终解决方案是将传输和方法结合起来使用,这也就是带消息凭据的传输安全模式。消息安全模式用于验证客户端;传输安全模式用于验证服务器并确保保密性和完整性。其效率和纯传输安全模式相当。
如何防止:
应用程序使用依赖传输模式传输安全的WCF终结点。传输模式是最不安全的选项,应避免使用(避免设置模式为Transport)。
XML Code:
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"/>
<message clientCredentialType="Windows" establishSecurityContext="false" negotiateServiceCredential="true"/>
</security>
</binding>
</wsHttpBinding>
<!--wsHttpBindings配置 -->
<wsHttpBinding>
<binding name="WSHttpBindings" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<wsHttpBinding>
<binding name="WSHttpBindings" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"/>
<message clientCredentialType="Windows" establishSecurityContext="false" negotiateServiceCredential="true"/>
</security>
</binding>
</wsHttpBinding>
(6) 配置管理:WCF错误配置:缺少审计跟踪
在发生安全事件后没有进行适当的审计跟踪,可能会影响合法的操作执行。WCF可以记录成功或失败的认证尝试。通过记录失败的认证尝试,可以知道非法的恶意攻击。同样,记录成功的认证事件可以在合法帐户受到侵害时提供有用的审计跟踪。
如何防止:
通过配置文件开启审计安全事件的服务。
XML Code:
<serviceSecurityAudit
auditLogLocation="Application"
suppressAuditFailure="False"
serviceAuthorizationAuditLevel="SuccessOrFailure"
messageAuthenticationAuditLevel="SuccessOrFailure" />
其中,auditLogLocation确定了应该用什么事件日志来审计;可以是默认,应用或者安全。messageAuthenticationAuditLevel和serviceAuthorizationAuditLevel属性可以是None,Success,Failure或者SuccessOrFailure。最后,suppressAuditFailure属性可以设置为true来阻止当系统失败并记录一条审计消息时抛出的一个异常。使用上述ServiceSecurityAuditBehavior选项来运行一个服务将导致MessageAuthentication和ServiceAuthorization事件(失败和成功的认证/授权)被写到系统应用日志中。每个入口将包含诸如调用者身份,时间,目标服务URI和协议。任何消息失败都应该被写入事件日志中,然后抛出一个异常。
(7) 配置管理:WCF错误配置:服务枚举
公开泄露服务相关的信息,可让攻击者了解如何利用这些重要信息对系统发起攻击。服务的元数据可能包含不应该公开访问的敏感信息,如果<serviceMetadata>标签启用元数据发布功能,将导致相关敏感信息的泄露。
如何防止:
应设置<serviceMetadata>标签的HttpGetEnabled为false,禁用元数据发布功能,从而避免敏感信息泄露。
XML Code:
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
(8) 配置管理:WCF错误配置:客户端验证
WCF客户端有不同的验证方式:None、UserName、Windows、Certificate、IssuedToken。如果在未经加密的通道上使用Username及明文密码,则攻击者可以通过截取SOAP消息的方式获取密码。
下列WCF服务提供程序配置使用了此UsernameToken:
XML Code:
<security mode="Message">
<message clientCredentialType="UserName" />
//来源:C/S框架网 | www.csframework.com | QQ:23404761
//来源:C/S框架网 | www.csframework.com | QQ:23404761
如何防止:
1. 传输数据时采取加密形式传输;
2. 使用X.509证书验证方式进行验证,要求客户端提供有效的证书凭证。或者使用指纹,基因等技术来代替现有的WCF客户端验证方式。
(9) 配置管理:未禁用MIME嗅探
Web服务器的每一个文件都有对应的MIME类型(也称为content-type),描述文件内容的属性,比如图片、文件、应用等。有些资源的Content-Type错误或者未定义时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。
如何防止:
配置X-Content-Type-Options值为nosniff。
XML Code:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
//来源:C/S框架网 | www.csframework.com | QQ:23404761
C#源代码安全缺陷与提高源代码质量解决方案
扫一扫加作者微信
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网