软件安全策略
@author:alkaid
生命以负熵为食 —— 《生命是什么》薛定谔
前文
见 软件安全策略-上
正文
对抗中间人
背景
- 在前文中提到的三大基石策略——身份认证、访问控制和会话管理,在通信过程都涉及到与远程服务器交换秘密信息,同时在实际的业务过程中,也包含了大量的个人隐私信息。
如果这些信息被窃取,可能会对社会、个人造成巨大的影响。
概念
- 在具体讨论怎么对抗中间人之前,我们首先来看看中间人到底是什么?
- 从名字来看,中间——那肯定是在什么之间。
信息系统常见几个重要的主体,应用、操作系统、网络链路、客户端、服务端,通信过程如下:

- 一般而言,我们所考虑的中间人攻击的情况是图中虚线的框框——网络设备,攻击者可能控制了相关的路由器或者交换机,进而对应用的相关数据包进行监听、篡改。
- 一般不考虑应用与操作系统、操作系统与网卡之间拦截,一方面由于这些操作都需要对客户端/服务端的操作系统进行控制,如果能进行控制,那么有其他更加丰富的方式获
取相关的数据,包括但不仅限于hook相关的技术、屏幕录像。 另一方面,由于需要获取操作系统的控制权,一般而言是个例,不具有普遍性,在资源有限的情况,不会进行考虑。同时在这类场景下,更关键是需要解决恶意攻击者获得操作系统控制权的问题。
- 当然,如果有特殊的要求确实需要纳入到考虑范围的情况,那肯定需要在应用层面去完成,自然是最方便的途径,从数据的源头进行防护,设计的要求同针对网络设备的中间人一致。
- 对抗中间人攻击,不可能去解决掉中间人,而不可能去保证每个人一个人的链路的安全。
需要解决如何在不可性的链路上去构建一个可信或者相对可信的链路。
风险与处理
- 风险其实在背景里已经提到了就是信息被窃取、篡改,而处理的解决方式就是需要去构建可信信道。
- 具体的风险可以细化成以下四种:
- 虚拟身份或者临时身份被窃取
- 重放
- 监听(隐私信息采集等)
- 业务数据包被篡改
- 从风险可知,构建的可信信道需要满足
- 数据被加密,防止被窃取身份,被采集信息
- 加密应该保证每个对象与对象之间不同(如果是现代密码学算法应该保证每组通信采用不同的密钥)。
- 需要支持完整性的校验
- 需要支持对抗重放数据——即每个数据包有自己的标识
已有技术
- 提到中间人,不得不提到的一定是SSL、TLS,以及结合http协议形成的https,一般情况其代码实现已经集成在操作系统中。
- 理想情况下,TLS或者SSL协议能够打成我们的目标,但是它们在构建可信信道的过程中,依赖于数字证书技术。如果不当使用数字证书,例如自签证书、不可信CA滥发证书,那么可信信道就无法构建。
- 无共享信息的可信信道,基本上无法建立,除了量子。
- 那么为了部分解决SSL/TLS的数字证书问题,只能采取增加部分预置信息的方式,例如HSTS——浏览器缓存证书,SSL Pinning——内置证书进行比较
注意事项
- 由于SSL/TLS是对抗中间人的完整性校验和对抗重放,重放的另一个威胁源来自客户端自身在应用层发起的请求,这类情况无法适用SSL/TLS。
- 一般建议在应用层面的核心业务,再次实现完整性校验和对抗重放的技术。例如交易。
异常处理
- 渗透测试的小伙伴应该会这样的体会——只有当输入信息与我们预期的正常情况存在出入的时候,才会引起注意,例如页面500报错、异常的业务流程、预计之外数据输出。
- 所以异常可以算是一切攻击的源头,如果所有的情况都能符合预期,那么我想攻击者的途径应该会少很多吧。
- 可惜的是人非圣贤,异常难以避免。
- 对研发而言,我们希望异常越清晰越好,查看异常越简单越好,能够协助我们尽快的定位bug,分析业务。
- 在攻击者在挖掘漏洞的过程,同样希望异常越清晰越好,与开发者们的预期一致,在频繁的上线和更新代码的过程中,经常会遗忘掉这些暗门,从而使攻击者能够从研发留下的痕迹中收获不少敏感信息。
- 所幸的是目前部分框架已经支持对全局异常的统一处理。
- 剩下的需要解决的是配置问题,在下文中也会单独的讲这个问题,不过在这个篇章里索性就先提一点。
- 异常处理的手段其实在本质上并不能解决信息泄露的问题,只是通过对异常处理的控制,尽可能地降低从异常中获取的信息量,提高攻击者的攻击成本和利用难度,从而降低风险。
- (没有任何回显,本身就是一种异常。只是造成这类异常的情况丰富且复杂,从而降低从异常中获取得信息量)
- PS:信息量/信息熵等概念,可自行搜索了解,本质上是为了量化信息。
配置管理
对于应用系统而言,经常需要部署在不同的运行环境,我们引入了配置从而避免了因为环境的变动就需要对应用进行重新编码,重新测试的情况,同时各种各样的配置项可以支持各式各样的组件和程序不同的运行方式,极大的提高了效率。
场景一 不同的运行环境
- 跨平台的编程语言解决了应用需要在不同操作系统部署的问题,优化了大量的时间投入。但是它们没办法解决不同抽象的运行环境,例如开发环境、测试环境、准生产、生产环境,不同的抽象运行环境对应着不同的组件、网络以及信息安全的要求。
- 在从开发环境切换到准生产/生产环境,难免需要更新具体的配置,一般而言会考虑引入编译的配置选项来解决,实现一键切换,例如maven的profile属性,不同的属性值对应了不同的策略,包括不同的打包策略、不同的配置文件。
- 这类方式是提高系统可靠性的重要方式,但是也存在一些副作用,需要使用者进行控制。
- 如果管理不当,开发者有可能接触到生产环境的具体配置信息,对生产经营产生影响
- 如果打包策略/配置文件未进行检查和校验,导致多个环境信息被一起打包。
- 如果缺少对具体配置项的检查,导致生产环境采用了测试环境的配置,进而可能产生信息泄露事件。
各个组件(中间件、容器等)的配置。虽然目前有docker一类的容器技术,用于实现运行环境的标准化配置,但是标准化配置不是一个不再需要关注的点而是一个更加需要关注的点,试想如果某个标准化上配置存在弱口令账号或者所有的标准化环境共享一个账号,会带来什么样的风险。
场景二 日志管理
- 日志功能相关的组件越来越成熟,大多通过配置进行实现,索性就纳入到了配置管理模块。
- 日志是目前所有系统审计的重要依据,同时也是发现攻击者和内鬼的重要手段,但是随着SSL/TLS等相关加密方式普及,位于通信链路上的相关设备越来越难以捕获到明文信息,应用系统自身的日志显得越来越重要。 我想随着云相关技术的进一步推广,应用系统的日志会更加重要。
如何管理这些日志,采集哪些日志就是需要进行考虑的。
风险与处理
- 日志最好也能有全局的日志控制。
- 当然,如果需要最大发挥日志的价值,一般是需要汇集到统一的日志平台,用于支持搜索。而日志往往包含了最详尽的业务信息,从某种意义上而言,这些日志可能是在诱导犯罪。(不知道是不是对前文中关于临时身份有印象,拿到这些临时身份的令牌,就可以完成身份窃取)
- 一类风险是正式这些日志信息造成,我们需要有明确的规定有指导数据记录,例如敏感信息、个人隐私信息、令牌、身份等信息,不要存储全文,需要进行部分的模糊化。
- 另一类风险正是引入日志平台其本身带入的风险。
日志的具体配置不当,例如本地的日志文件存放到了web的相关目录,从而能直接访问,造成大量信息泄露。(相关实例可自行搜索)
场景三 权限配置
- 目前越来越来多的应用支持复杂的权限配置和资源配置,有效维护这类信息,能够大幅度降低安全风险。
具体涉及的权限内容,可查看访问控制策略章节了解
软件技术栈
概念
敏感数据
- 个人隐私
- CISSP ALL in One 在隐私章节里给出部分属于隐私的数据类型,如下:

- 敏感的业务数据
- 财务相关交易记录
…… 需要根据具体内容去决定
敏感数据的生命周期
- 一般而言,生命周期至少包括数据的产生、存储、使用、销毁,该过程映射到实际的应用系统中可能还需要进行更加细节的处理。
- 传输
- 应用系统涉及到信息交互,那么首先要新增的一个过程就是传输,在传输过程中的敏感信息要如何进行处理是需要进行明确。明文传输肯定是不行的。
- 产生
- 我觉得更明确的词,应该是采集。
- 采集就涉及到到底是采用完整的数据,还是部分关键即可,如果是部分关键,那么将采集出的数据直接转成Hash摘要可作为一种参考方式。
- 存储
- 避免明文存储
- 如果不需要明文的敏感数据,建议采用hash算法等方式转化数据,仅用于对比
- 如果需要明文的敏感数据进行操作,建议采用加密算法保障
- 其他情况
- 使用
- 使用可能涉及到多个场景,例如客户端页面的展示、业务操作的需要,如不必要进行展示,尽量不进行展示。
- 销毁
- 一般这类敏感数据是需要提供销毁数据的功能的,是真正从数据库清空相关信息,而不是通过标志位实现的假删除方式
- 注意: 这里的说明,仅仅是提供敏感数据相关策略的参考,具体内容以相关的法律法规以及业务自行设计。
输入输出
概念
引用
软件安全策略-下
原文:https://www.cnblogs.com/alka1d/p/12096164.html