华为云DevOps系列之 —— 持续安全与审计(四)漏洞防护策略与工具
什么是漏洞
- 漏洞或脆弱性(Vulnerability),是指计算机系统安全方面的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁
- 在《GB/T 25069-2010 信息安全技术术语》,将脆弱性定义为 “资产中能被威胁所利用的弱点”
常见漏洞
- 主机漏洞
- 内存破坏类漏洞、CGI类漏洞、输入验证类漏洞、配置错误类漏洞、系统本地补丁、常见协议弱口令、木马病毒
- Web 漏洞
- SQL注入攻击、跨站脚本、文件包含、远程代码执行、主流CMS漏洞
- 数据库漏洞
- 常见类型数据库漏洞,如Oracle、MySQL、SQL Server、DB2、Informix、Sybase
- 我们经常听到的比如SQL注入漏洞、XSS漏洞,是2种web应用上的漏洞
- 永恒之蓝漏洞,发生在Windows系统上的越权漏洞
- 0-day漏洞,是已经被发现(有可能未被公开),而官方还没有相关补丁的漏洞
- 镜像漏洞:是指Docker这类容器化技术中镜像所包含的漏洞
漏洞分类
- 基于利用位置分类
- 远程漏洞
- 本地漏洞
- 基于威胁类型分类
- 获取控制:劫持执行程序流程,使程序执行指定任意指令或命令,控制应用系统或操作系统
- 获取信息:劫持程序访问预期外的资源并被攻击者获取,影响系统的机密性
- 拒绝服务:导致目标应用或系统暂时或永久性失去相应服务的能力
- 基于技术类型分类
- 内存破坏类:栈缓冲区溢出,堆缓冲区溢出,静态数据区溢出
- 错误逻辑类:安全检查的实现逻辑上有问题
- 设计错误类:系统设计上对安全机制的考虑不足导致在设计阶段引入安全漏洞
- 配置错误类:系统运维过程中默认不安全的配置状态
- 输入验证类:对用户输入没有做充分的检查过滤就用于后续操作导致的漏洞
近年来关于Web 漏洞排名
- 下图展示了 OWASP 在 2013 年版与 2017 年版中统计的 Top 10 Web 安全风险变化
SQL 注入
- SQL 注入是指将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据
- SQL 注入能导致数据丢失、破坏或泄露给无授权方,缺乏可审计性或是拒绝服务。注入有时甚至能导致主机被完全接管
- SQL 注入的危害很大,常见的防御措施有:
- 净化用户输入
- SQL 语句使用参数化查询
- 利用存储过程动态拼接查询语句
- 对 SQL 语句采用预编译等
跨站脚本(XSS)
- 跨站脚本(XSS)是近年来最为流行的网络攻击方式之一,已经占到了网络攻击相当大的比例,众多网站,如著名的 Facebook 等都遭遇过此类攻击。国内知名的新浪微博遭遇的网络病毒实际上也是跨站脚本漏洞所导致的
- 跨站脚本简称为 Cross Site Scripting,因为容易和另一个名词“层叠样式表”(Cascading Style Sheets,CSS)混淆,为了区别,网络安全人士习惯将其简称为 XSS 攻击
- 从本质上看,跨站脚本实际上是一种恶意代码执行的方式。主要原因在于网站对于用户提交的数据过滤不严格,导致问题产生
- XSS 起初的危害主要是盗取用户的 Cookie 信息。Cookie 信息中包含了浏览者和网站服务器之间的常用记录,包括登录记录、浏览记录等。如果攻击者得到了用户的 Cookie 信息,可以模仿用户和网站进行交互,得到更多想要的数据
- 例如,攻击者在某论坛上发布一个URL链接,当用户点击该链接后,用户的浏览器就会将 Cookie 信息发送到攻击者的网站。攻击者收集到 Cookie 信息后可以以浏览者身份访问网站、进入邮箱等,继续窃取私人信息。
- 它常见的危害包括发生钓鱼攻击、会话劫持或者被植入 Web 蠕虫
- 常见的 XSS 攻击
- 反射型:跨站代码一般存在于链接中,请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码一般不存储到服务端
- 存储型:这是利用起来最方便的跨站类型,跨站代码存储于服务端(比如数据库中)
- DOM 型:DOM XSS 是基于 DOM 文档对象模型,前端脚本通过 DOM 动态修改页面,由于不与服务端进行交互,而且代码是可见的,从前端获取 DOM 中的数据在本地执行。常见的可以操纵 DOM 的对象:URL,localtion,referrer 等
- 还有一个常见的攻击叫跨站伪造请求 CSRF,从攻击方式上分,它并不属于 XSS 攻击
反射型 XSS 攻击
- 用户正常登陆 Web 服务器,会得到一个包含 session 的 cookie,现在很多网站会把识别用户身份的 session 放在 cookie 内,后续客户的访问携带该 session,即可不需要再次登陆
- 攻击者通过某种方式让客户打开一个包含攻击信息的页面,比如发送广告邮件
- 用户打开该 URL 之后会发现与 Web 服务器的一个正常页面的一致的
- 但是该正常页面的 htm l标签内包含了攻击者构造的 JS 脚本,通过 JS 脚本可以读取用户的 cookie 的值,并发送到攻击者
- JS 脚本可能是包含在图片标签内,该JS脚本执行的行为:去第三方站点加载一个图片链接,该链接地址指向攻击者,并在链接后加上类似 document.cookie 的方法,这样用户执行 JS 脚本就会向攻击者请求图片并携带 Web 服务器的 cookie
- 攻击者收到针对图片的请求,并获取到 cookie,响应图片请求之后,用户侧图片正常显示,但是此时 cookie 已经被传递给了攻击者
- 攻击者获取 cookie 之后,利用其中的 session 信息,就可以进行会话劫持,仿冒用户登陆站点,并进行后续攻击行为
Docker 镜像漏洞
-
镜像是现在流行的虚拟化技术之一,也是 DevOps 开发中应用较多的技术
-
Docker Hub 上最流行的 10 个镜像都包含已知的安全漏洞
-
选用最小化基础镜像,即只包含项目确实需要的系统工具和库的镜像,就能最小化系统的攻击面,确保所用操作系统是安全的
漏洞扫描基本理念
- 安全测试阶段的安全漏洞扫描主要包括主机漏洞扫描、Web 漏洞扫描、端口扫描、安全配置合规检查等内容
- 主机漏洞扫描
- 针对目标主机系统,对系统上运行的操作系统、数据库、web 等组件进行漏洞扫描,通过识别组件版本,与已有漏洞库进行匹配,检测目标系统是否包含已知漏洞,或者通过对漏洞进行验证,检测目标系统是否存在漏洞
- Web 漏洞扫描
- 针对运行的 web 应用进行扫描,他往往会先获取 Web 应用的所有 URL,并对 URL 进行漏洞检查,检测是否存在 SQL 注入、XSS 攻击等问题
- 开放端口扫描
- 往往会和主机漏洞扫描集成在一起,主要是检测整个系统对外开发的端口,所有开发端口都可能存在潜在的安全风险,开发及运维人员需要明确哪些端口是必须的,哪些是可以关闭的
- 安全配置检查
- 安全配置漏洞不是指软硬件或者协议本身设计或实现上的问题,而是由于软硬件不正确的配置和部署所造成的。安全配置检查基于业界已有的安全配置最佳实践进行扫描,提前发现安全配置漏洞并进行安全加固
- 主机漏洞扫描
- 漏洞扫描通常的执行流程
- 分析被测对象
- 系统组网信息
- 系统/组件类型
- 默认开启服务
- 默认监听端口
- 选择对应服务
- 已知漏洞扫描
- Web 漏洞扫描
- 开放端口扫描
- 安全配置扫描
- 配置工具参数
- 选择策略文件
- 配置认证参数
- 配置扫描文件
- 确认扫描报告
- 扫描完整性确认
- 告警分析
- 漏洞验证
- 修复已知漏洞
- 代码修改
- 补丁安装
- 配置加固
- 有效规避/风险提示
- 分析被测对象
我们需要进行很多轮的扫描,直到已知的风险都已消减或者遗留的风险可控
为什么要进行漏洞扫描
- 产品上线后遭到黑客攻击,影响产品可用性,大量用户投诉
- 产品数据库被入侵,导致大规模数据泄露,面临法律风险
- 产品漏洞被利用,导致业务瘫痪并波及内网,引发灾难性事故
- 产品无法通过政府信息安全等级标准,项目竞标失败
- 产品不满足行业、地区软件准入要求,无法进入目标市场
- 软件交付项目漏洞多,客户不认可,项目款回收难
- 产品在维保期内安全问题投诉不断,售后服务成本超支
- 产品安全问题引发舆论广泛关注,企业声誉受损
- …
漏洞扫描案例
主机漏洞扫描案例 - 使用有漏洞的三方件
- 业界安全研究人员发现开源漏洞并生成漏洞 CVE 编号
- 系统厂商分析各自产品是否受影响,如果受影响,则会发布漏洞补丁及安全公告
- 安全工具基于业界系统厂商的安全公告制定检查规则,比对被测目标的组件版本是否受漏洞影响
- 测试人员基于报告信息,验证存在漏洞,并按要求打补丁升级组件修复该漏洞
- 如下图,操作系统上的 BASH 命令,有 shellshock 漏洞,允许用户执行任意代码,从而在未授权的情况下任意访问系统
使用第三方组件,需要跟踪第三方组件的官方安全公告信息,及时联系厂商获取最新安全补丁,修复漏洞
主机漏洞扫描案例 - 协议使用不安全算法
- 业界安全研究人员发现并论证曾经广泛使用的某些密码算法不再安全,比如 TLS1.0、SSL2.0/SSL3.0 等。同时,针对这类协议中使用的算法套,随着技术的进步,很多算法也已不安全,比如 MD5、SHA1 等
- 安全工具基于业界共识对此类不安全的密码算法制定检查规则,探测被测目标相关服务所使用的是否为不安全算法
- 测试人员基于报告信息,验证存在漏洞,修改服务配置或业务代码进行修复
- 针对协议的扫描,除了不安全算法,还有协议本身已经不安全,比如安装 tftp 提供 ftp 服务、开启 telnet 服务
对于端口矩阵上的各 TCP/UDP 服务,均需覆盖扫描,验证工具探测得到的服务类别、服务版本、服务使用的算法与系统设计一致,不应使用已知的不安全密码算法或开启不需要提供服务的端口
安全配置扫描案例 - Linux 口令复杂度不合规
- 简单的口令容易被暴力破解工具猜测出来,在系统设置的时候,应强制用户使用健壮口令
- 口令必须包含大写和小写字母、数字、特殊字符,业界规范有要求密码长度至少14个字符
- 根据客户需求和使用场景,设计符合业界标准要求的口令复杂度规则
加固方案
- 对使用 PAM 模块的 Linux 系统,可以修改 PAM 规则,使用支持口令复杂度检查的插件(如 pam_cracklib.so)实现口令复杂度检查(password requisite pam_cracklib.so try_first_pass retry=3 minlen=14 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1)
- 对口令的保护,除了配置复杂度,口令本身也要做保护,如口令要进行加密存储
- 除了配置密码复杂度,要实现防暴力破解,还可以实施下列措施:登陆延迟、锁定账号、验证码、IP白名单+告警或日志
Web 漏洞扫描案例 - 跨站点脚本攻击XSS
- 对存在 XSS 攻击漏洞的靶场进行访问,在访问的URL后添加额外的内容,一般是一段JS脚本,当用户点击ClickMe按钮提交GET请求后,如果响应的页面出现的弹窗提示,这就表明添加的JS脚本已经执行
- 基于这样的工作原理,Web漏洞工具扫描时,在获取URL后,会自动构建并添加 playload 后发起请求,然后通过检测响应是否包含特定内容的方式来检测 xss 漏洞
XSS 本质上是一种 html 注入,也就是将 html 代码注入到网页中。其防御的根本就是在将用户提交的代码显示到页面上时做好一系列的过滤与转义
Web 漏洞扫描案例 - SQL 注入
- SQL注入,同样我们对具备SQL注入漏洞的靶场进行访问,可以看到这里的请求是反馈
id=1
的账号,我们猜测这里的1会直接传递给数据库进行查询,因此我们再URL后构造额外的 sql 语句,比如select * from
某个表,再请求发出后,我们查看响应,发现这里回复的是 SQL 语句语法错误,说明,目标系统存在 SQL 注入,只要我们不停的尝试后面追加的内容,是可以实现数据库信息的直接读取的 - 基于这样的工作原理,Web 漏洞工具扫描时,在获取 URL 后,会自动构建并添加 playload 后发起请求,当然这里的 playload 一般是一段语法错误的 SQL 语句,然后通过检测响应是否包含特殊错误信息来检查是否存在 SQL 注入漏洞
对 SQL 语句采用预编译是防御 SQL 注入的最佳方法
漏洞管理
-
Archery:开源漏洞评估和管理工具
-
开源漏洞评估工具 - OpenVAS
-
开源镜像扫描工具 - DockerScan
-
开源 Web 防护工具 - OWASP
DevCloud:集成一站式漏洞扫描服务
华为云租户业务防护方案
漏洞扫描服务 VSS
- 漏洞扫描服务VSS是基于远程的扫描方式,用户无需额外部署 agent
- 漏洞扫描服务帮您快速检测出您的网站和主机存在的漏洞,提供详细的漏洞分析报告,并针对不同类型的漏洞提供专业可靠的修复建议
- 主机漏洞扫描
- 支持深入扫描
- 通过配置验证信息,可连接到服务器进行 OS 检测,进行多维度的漏洞、配置检测
- 支持内网扫描
- 可以通过密钥的方式访问业务所在的服务器,适配不同企业网络管理场景
- 支持弱密码扫描
- 多场景可用
- 全方位的OS连接,涵盖90%的中间件,支持标准Web业务弱密码检测、操作系统、数据库等弱口令检测
- 丰富的弱密码库
- 丰富的弱密码匹配库,模拟黑客对各场景进行弱口令探测,同时支持自定义字典进行密码检测
- 多场景可用
- 支持深入扫描
企业主机安全 HSS
- 企业主机安全服务(Host Security Service,HSS)是一个用于保障主机整体安全的安全服务。企业主机安全服务通过资产管理、漏洞管理、入侵检测及基线检查功能,可全面识别并管理主机中的信息资产,实时监测主机中的风险并阻止非法入侵行为,帮助您管理主机的安全状态,使您的主机顺利通过网络安全等级保护测评
- 在主机中安装客户端后,您的主机将受到HSS云端防护中心全方位的安全保障,在安全控制台可视化界面上,您可以统一查看并管理同一区域内所有主机的安装状态和安全风险
容器安全服务 CGS
- 容器安全服务通过配置安全策略,帮助企业制定容器进程白名单和文件保护列表,从而提高容器运行时系统和应用的安全性
- 容器安全服务扫描所有正在运行的容器,发现容器中的异常(包括逃逸漏洞攻击、逃逸文件访问等)并给出解决方案
- 漏洞管理
- 扫描节点中所有正在运行的容器镜像,发现镜像中的漏洞并给出修复建议,帮助用户得到一个安全的镜像
- 安全策略
- 通过配置安全策略,帮助企业制定容器进程白名单和文件保护列表,确保容器以最小权限运行,从而提高系统和应用的安全性
- 运行时监控
- 监控节点中容器运行状态,发现违反容器安全策略的进程运行和文件修改,以及容器逃逸行为
Web 应用防火墙 WAF
- Web 应用防火墙(Web Application Firewall,WAF),通过对 HTTP(S) 请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包含、敏感文件访问、第三方应用漏洞攻击、CC 攻击、恶意爬虫扫描、跨站请求伪造等攻击,保护 Web 服务安全稳定
思考题
1.(单选)下列关于字符串操作的说法,正确的是():
- A. strncpy、strncat 等带 n 版本的字符串操作函数使用可以有效地防止 ‘\0’ 结束符丢失
- B. 来自 fgets(),getenv() 的字符串在复制之前,应该获取并检查其数据长度
- C. 环境变量来自计算机内部,其安全性是可预测的,因此可以不加检查的作为字符串处理函数的输入
- D. 当源内存和目标内存存在重叠时,strcpy 会出现错误,而 memcpy_s 能正确地实施拷贝,但这也增加了一点点开销
答案:B
解析:
- A:带 n 版本函数,容易产生结束符丢失问题
- B:fgets()/getenv() 获取的内容都是不可信的,因此需要添加校验
- C:环境变量是不可预测的,所以应该添加校验
- D:memcpy_s 不能操作重叠内存,memmove_s 可以
2. (多选)SQL 注入是 Web 应用中常见的安全问题,下列哪些操作可以有效的缓解该类问题?()
- A. SQL 语句使用参数化查询
- B. 利用存储过程动态拼接查询语句
- C. 利用正则表达式对传入参数做白名单检测
- D. 对 SQL 语句采用预编译
答案:ACD
解析:
- A:参数化查询是一种简单有效的防止SQL注入的查询方式
- B:存储过程使用参数化查询时,也应该使用参数化查询,如果通过拼接的SQL也存在被注入的风险
- C:对输入进行合法性校验,只接受在白名单中的字符,可有效降低风险
- D:对 SQL 语句采用预编译是防御 SQL 注入的最佳方法
最后,欢迎大家关注我的个人微信公众号 『小小猿若尘』,获取更多IT技术、干货知识、热点资讯。同时,我在公众号中分享了精心整理的一些视频资料(包括 Python全栈教程、AI教程、前端、数据库等),大家回复相应关键词即可获取网盘视频链接,感谢大家的关注😊
- 点赞
- 收藏
- 关注作者
评论(0)