## 供应链攻击

Supply Chain Attack

### 软件源安全

软件源安全是指在开发过程中或工作过程中使用的软件应该是安全的,需保证不会对开发或工作的环境造成破坏,不会对项目的开发造成风险。

解决方案:
成立软件管理委员会统一负责软件(包括开发软件)的评估、评级与分发。 软件管理委员会提供统一安装渠道(白名单机制),对待安装软件分级,分为“安全,警告,禁止”三个级别,对安全的软件提供统一获取渠道和标准化安装步骤(安全的商业软件提供授权获取通道),警告的软件由安装者自行保证(通常为暂未进行评估的软件或者竞品软件),对禁止的软件禁止安装并说明原因且提供推荐替代方案。如果同一个软件的不同版本安全级别可能不同,则当成两个软件对待。
如果使用者对未列在软件列表中的软件有需求可提供工单,由专人(软件管理委员会)对待安装软件进行评估和评级。 对已安装软件进行定期扫描,对不符合要求的软件进行告警提示,责令限期卸载。



### 服务器安全

服务器安全是指运行项目或代码的环境应保证是安全的。

解决方案:

使用经过验证的服务器与服务器配套组件:

Web服务器类:Nginx、Apache、Tomcat、Resin、Nodejs 数据库类:MySQL(MariaDB)、Memcached、Mongodb、Redis
代理类:LVS/LB、Apache、Nginx、Varnish、Squid、HAProxy、Lighttpd 云计算&大数据:Hadoop、Spark、Storm、Docker
其它:各种编程语言及配套CGI、OpenSSL、OpenSSH、Rsync

### 框架/库安全

框架/库安全是指项目或代码依赖的框架库应保证是安全的。

解决方案:
自建内部软件源,对框架/库强制要求从内部源下载与更新,在必要时(例如某组件报安全问题后)可从源上禁止对框架/库的下载。
项目使用的框架和库需要采用正确的合适的授权协议。(BSD、MIT、Apache License) 提供黑名单机制,项目构建时强制要求扫描是否引入了黑名单中的框架/库,如果有引入,不能发布。(禁止 Struts、phpMyAdmin)
禁止框架/库的自动更新,固定版本号,确定开发与生产环境编译依赖一致。 定时更新项目依赖的框架/库,尤其是安全性更新。
* 生产环境关闭框架/库提供的报错和调试功能。

MitM中间人攻击

Man in the Middle

MitM中间人攻击会在消息发出方和接收方之间拦截双方通讯。

DNS欺骗

DNS Spoofing

DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。

会话劫持

Session Hijacking

当攻击者接管两台计算机之间的有效会话时,就会发生会话劫持。攻击者窃取有效的会话ID,以便侵入系统和窥探数据。

解决方案:

  1. 使用 SSH 创建安全通信通道
  2. 通过 HTTPS 连接传递身份验证 Cookies
  3. 实现注销功能,以便用户可以结束会话
  4. 成功登录后生成会话ID
  5. 在用户和 web 服务器之间传递加密数据
  6. 使用字符串或长随机数作为会话密钥

会话固定

Session fixation

会话固定攻击是指攻击者能够通过读取或设置用户的会话标识符,并使用该会话标志符仿冒该用户与服务器交互的一种行为。窃取用户的 Cookie 即是一种会话固定攻击。

DDoS分布式拒绝服务

Distributed Denial of Service

分布式拒绝服务攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发起请求,从而使受攻击方网络瘫痪的一种攻击方式。

详见 DDos

代码注入

通过将恶意代码作为应用程序的输入参数注入到应用程序中,从而达到控制目标主机或数据库的行为。

SQL注入

SQL Injection

如果程序根据用户输入的参数动态生成SQL语句并执行,黑客可通过传入恶意参数值注入自己定义的语句,使数据库执行任意自己需要的指令,实现数据窃取或入侵破坏。

命令注入(任意命令执行)

Command Injection

如果程序根据用户输入的参数动态生成系统命令并执行,黑客可通过传入恶意参数值注入自己定义的命令,从而控制服务器。

XSS跨站脚本

Cross Site Scripting

XSS是发生在目标用户的浏览器层面上的攻击方式,当浏览器渲染页面的过程中发生了不在预期内执行的JS代码时,就发生了XSS攻击。

详见 XSS

存储型XSS

存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器并存储在服务器中(不管是数据库、内存还是文件系统等),在用户下次请求页面的时候服务器返回XSS代码并在浏览器中运行。

反射型XSS

反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。

DOM XSS

DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端解析用户输入数据并执行导致。

CSRF跨站请求伪造

Cross Site Request Forgery

CSRF跨站请求伪造,也被称为 One Click Attack 或者 Session Riding ,通常缩写为 CSRF 或者 XSRF ,是一种通过伪造用户请求破坏网站的攻击方式。

详见 CSRF

SSRF服务器请求伪造

Server Side Request Forgery

SSRF服务端请求伪造。在服务器访问网页或者HTTP服务的场景,如果接收到的目标URL是解析到内网的,则服务器会尝试访问内网。因此黑客通过提交解析到内网的URL,服务器会帮黑客对内网进行攻击、扫描。

点击劫持

Click Hijacking

攻击者在恶意站点实现了一个和信任站点极其相似的恶意页面,然后在恶意页面的上层覆盖了一个信任站点的合法页面(通常采用 iframe 的方式),并将合法页面设置成透明态,诱导用户点击页面,这时实际触发的是合法页面上的事件。用户的操作被劫持到攻击者事先设计好的恶意按钮或链接上,从而导致用户敏感信息泄露、实施转账、添加权限或者删除记录等敏感操作。

文件上传下载读取漏洞

任意文件上传

Unrestricted File Upload

任意文件上传漏洞是由于 Web 应用程序在实现文件上传功能时对上传的文件缺少必要的检查,使得攻击者可上传任意文件。利用该漏洞,攻击者可以直接上传 webshell (WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门)、病毒、恶意脚本等各种危险文件,可能导致服务器权限被直接获取,从而危及整个系统的安全运行。

解决方案:

  • 对用户上传的文件后缀采用白名单进行限制,且重命名文件名
  • 限定文件上传目录,且该目录不允许解析动态脚本文件
  • 更新 Web 服务器版本,防止解析漏洞
  • 上传接口严格控制权限和认证,文件上传前必须验证用户身份
  • 服务器端对 HTTP 包头的 MIME Type 和上传文件的大小也需要进行检查,文件上传校验不但要验证文件包头信息是否匹配,而且要验证文件后缀名,最后还要限制合适的文件大小
  • 使用对象存储存放用户上传的文件,与Web容器隔离

任意文件读取

Unrestricted File Read

因 Web 程序提供的文件查看下载、附件下载等功能存在安全缺陷,导致通过修改文件路径就能够查看和下载任意文件,这些文件包括:源代码文件、系统文件( /etc/passwdC:/boot.ini 等)、配置文件( config.php/WEB-INF/web.xmlweb.config 等),造成网站敏感信息泄露,严重危害网站安全。

解决方案:

  • 服务端过滤特殊字符,如:“.”、“/”、“\”
  • 判断用户输入的参数的格式是否合法
  • 指定文件类型白名单(如:jpg、gif、png、rar、zip、pdf、doc、xls、ppt等),禁止用户读取、下载白名单以外的文件
  • 指定下载路径,禁止用户读取、下载指定目录以外的文件

任意文件包含

Unrestricted File Inclusion

Web 程序在引入文件时,由于传入的文件名没有经过合理的校验,或者检验被绕过,从而操作了预想之外的文件,导致意外的敏感信息泄露,甚至恶意的代码注入,使攻击者获取到网站服务器权限。

解决方案:

  • 关闭危险的文件打开函数
  • 过滤特殊字符,如:“.”、“/”、“\”
  • 检测文件内容

任意URL跳转

某些业务场景(例如登录跳转、导航前进后退)会接受不信任的用户输入,并返回一个 302 响应或者 URL 重定向。因此攻击者通过操控输入的 URL ,可以欺骗用户跳转到不安全的页面,造成钓鱼攻击。

缓冲区溢出

Buffer Overflow

缓冲区溢出是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、并获取程序乃至系统的控制权的一种攻击行为。

钓鱼攻击

Phishing

攻击者伪装成受信任的实体欺骗受害者,通过发送邮件或者文件的方式,诱骗受害者暴露密码或者执行恶意代码。



## 逻辑漏洞

### 用户认证

### 权限控制

安全加固手段

HTTPS

HTTPS

在用户请求资源时,如果请求的是 http 资源,则 302 重定向到 https 资源,并添加 Strict-Transport-Security 要求强制使用 HTTPS 协议。

输入验证

Validation

前端与后端均需进行输入验证,对用户的输入表单参数、URL参数、HTTP头进行校验。
需要校验参数类型,长度,范围,字符集合是否符合要求,同时需要根据业务类型校验参数。
常见的业务类型包括:日期、域名、ip、邮箱地址、用户名、手机号(带国际区号)、用户ID等。
对SQL注入、XSS、命令注入中常见的危险字符 <>'"%|;&/\ 进行过滤或实体编码。
拼接URL时需要进行实体编码。
保证前后端校验方法一致。

数据脱敏

Data Mask

API 接口或 HTTP 服务如果没有对敏感信息进行脱敏输出,可能会被嗅探收集、批量爬取,泄漏业务核心数据。

需要脱敏的数据包括姓名、手机号、身份证号、银行卡号、邮箱、营业执照号等。

接口频率限制

Frequency Limiting

接口需要限制请求频率,防止对接口数据进行爬取或者对登录接口进行暴力破解。

核心数据接口要求权限认证。

加密

Encryption

  1. 密码在设定时要求二次输入验证,防止用户手动输入错误,二次输入禁止复制粘贴
  2. 在传输过程中可以进行 base-64 编码,防止在传输之前(例如devtools中)被查看
  3. 在存储时需要加盐加密,知名的不安全算法包括 MD5、SHA-1

多因子认证

Multi Factor Authentication

多因子认证是用两种及两种以上的条件对用户进行认证的方法。通常将口令和实物(如U盾、密码器、手机短信、指纹等)结合起来,以有效提升安全性。

验证码

Verification Code(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart,全自动区分计算机和人类的图灵测试)

验证码是一种区分用户是计算机还是人的公共全自动程序,主要为了防止机器的暴力破解和批量提交。常见的人机识别方法包括文本识别验证、图片点选验证、滑块拼图验证、用户行为验证等。

Cookie安全

详见 Cookie

解决方案:

  1. 添加 HttpOnly 标志只允许服务器进行读取,防止xss攻击
  2. 添加 Secure 标志,采用 HTTPS 请求,防止被中间人获取
  3. 为了防止 Cookie 被篡改,服务器通常可以将 会话标志符 存储在 Cookie 中,而不是直接存储会话信息。这样,即使攻击者获取到了 Cookie 内容,如果不知道会话标志符编码解码规则,就无法进行修改。
  4. 如果站点使用 Cookie 对用户进行身份验证,则每当用户进行身份验证时,它都应重新生成并重新发送会话 Cookie,即使会话 Cookie 已经存在。
  5. 服务器不应该在同一主机的不同端口上运行互不信任的服务。
  6. 服务器不应该在同一主机的不同路径上运行互不信任的服务。

HTTP header 设置

解决方案:

  1. 通过设置 X-Frame-Option 告知浏览器该页面是否可以被嵌入,减少被 点击劫持 攻击的可能
  2. 通过设置 Content-Security-Policy 告知浏览器该页面的内容安全策略,减少被 XSS 攻击的可能
  3. 通过设置 Referrer-Policy 监管访问来源信息,减少来源地址探测
  4. 通过设置 Cross-Origin-Opener-Policy Cross-Origin-Resource-Policy Cross-Origin-Embedder-Policy 来减少跨源跳转/嵌入时的可能攻击
  5. 添加 csrf token ,减少被 CSRF 攻击的可能


## 运维安全

// TODO:

灾备 运维日志记录
运维行为审计 账号/权限控制