这是给A2OS做的关于 Web 安全的分享内容概要
{% colorquote success %} 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。具体举例来说,比如在Intel Pentium芯片中存在的逻辑错误,在Sendmail早期版本中的编程错误,在NFS协议中认证方式上的弱点,在 Unix 系统管理员设置匿名Ftp服务时配置不当的问题都可能被攻击者使用,威胁到系统的安全。因而这些都可以认为是系统中存在的安全漏洞。 {% endcolorquote %}
{% colorquote success %} In computer security, a vulnerability is a weakness which can be exploited by a threat actor, such as an attacker, to perform unauthorized actions within a computer system. To exploit a vulnerability, an attacker must have at least one applicable tool or technique that can connect to a system weakness. In this frame, vulnerability is also known as the attack surface. {% endcolorquote %}
既然是天生存在的,为什么设计者不去找需要安全工作者去找?被利用的叫漏洞,没被利用的能叫漏洞吗?
在计算机领域,漏洞特指系统的安全方面存在缺陷,一般被定义为信息系统设计、编码和运行当中引起的、可能被外部利用用于影响信息系统机密性、完整性、可用性的缺陷。
统计表明,程序员每写 1000 行代码,就会有 1 个缺陷,一个大型的应用系统,代码行数动辄几十万行,甚至更多。可以说,从世界上第一个操作系统或应用软件诞生的那天开始,缺陷就存在于 IT 系统的各个环节,而且始终会存在。
首先漏洞来自操作缺陷。
程序员编程序时的疏忽、运维人员设置安全配置时的不当操作、用户设置的简单口令和泄露……这些人为的、无意的失误就是操作缺陷。
其次,漏洞来自认知缺陷。
2000年的“千足虫”危机,过去为了节省空间,存储年份用两位十进制数表示,例如1980就是80,1998年出生就是98-80=18,但是在2000就变成了负数,就会引起各种系统紊乱甚至崩溃。
2018年1月的 Meltdown & Spectre 。为了提升 CPU 处理性能,芯片企业用乱序执行和预测执行。通俗来说,CPU 并不完全严格按照指令的顺序来执行,而是会自己预测可能要执行的内容,以及为了更好地利用 CPU 资源将指令顺序打乱,以便能同时执行一些指令。
但设计者没有考虑到,或者没有人为这个问题时重要的,即:由于 CPU 缓存内容没有同步恢复到原始状态,导致缓存中存储的重要信息可以被漏洞利用者获取,可能会造成受保护的密码和敏感信息泄露。
最后,漏洞来自于知识缺陷。
很突出的一个例子就是工控安全。原本的工业控制系统,大多以系统功能作为第一要素,多数系统在设计之初时封闭的“单机系统”,连联网需求都没有考虑过,就更不要提在设计、研发和集成阶段考虑网络安全问题了。物联网时代到来以后,这些工控系统都开始在互联网上“裸奔”,黑客可以轻而易举地利用系统漏洞进行攻击,造成严重后果。
并不是所有的缺陷都是漏洞,只有可以被外部利用的缺陷才被称为漏洞。这句话可以换一个角度来理解,当利用缺陷的方法出现时,漏洞导致的现实威胁就出现了。就像“心脏滴血“漏洞,引发这个漏洞的缺陷在爆发前两年的版本中就已经静悄悄地存在,当黑客利用这个缺陷获取服务器里用户的敏感信息,影响了数据的机密性,就构成了漏洞。(OpenSSL)
参杂了很多因素,上升到政治层面会是比较恐怖的
2016-2017年,NSA 数字武器库遭到泄露,相关人士为了证明自己成功攻入 NSA 开发网络武器的“方程式组织”的系统,在网络披露了几批工具。2017年肆虐全球的 WannaCry 病毒就是从这几批泄露武器中泄露出去的。
希拉里邮件门等。
基于技术类型的分类
基于漏洞成因技术的分类相比上述的两种维度要复杂得多,对于目前我所见过的漏洞大致归纳为以下几类:
指的是在网站程序上的漏洞。
根据严重程度,以教育行业漏洞报告平台为例
存在以下情况我们将酌情将漏洞等级降低:
如下漏洞将被忽略:
技术漏洞与非技术漏洞,即技术漏洞与业务漏洞
OWASP – Open Web Application Security Project,即开放式Web应用程序安全项目是一个在线社区,在Web应用程序安全性领域提供免费的文章,方法,文档,工具和技术
将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
一些常见的注入,包括:SQL、OS命令、ORM、LDAP和表达式语言(EL)或OGNL注入。所有解释器的概念都是相同的。代码评审是最有效的检测应用程序的注入风险的办法之一,紧随其后的是对所有参数、字段、头、cookie、JSON和XML数据输入的彻底的 DAST 扫描,即 Dynamic Application Security Testing。
通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。
未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的HTTP标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建HTML或JavaScript的浏览器API更新现有的网页时,就会出现XSS缺陷。XSS让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。
不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。