CISP学习指南:软件安全

  1. 一、BSI(Build Security In)系列模型
  2. 二、软件安全三大支柱
  3. 三、软件安全接触点
  4. 四、应用风险管理
  5. 五、安全知识
  6. 六、安全开发生命周期
  7. 七、总结

软件安全是信息安全的重要组成部分,通过在软件开发生命周期中融入安全实践,可以从源头上降低安全风险。

一、BSI(Build Security In)系列模型

1.1 BSI的含义

BSI(Build Security In)是指将安全内建到软件过程中,而不是可有可无,更不是游离于软件开发生命周期之外。

BSI的核心理念:

graph TB A["BSI核心理念"] B["安全内建"] C["全生命周期"] D["工程化方法"] A --> B A --> C A --> D B --> B1["不是可有可无"] B --> B2["不是游离于外"] B --> B3["是有机组成部分"] C --> C1["需求阶段"] C --> C2["设计阶段"] C --> C3["实现阶段"] C --> C4["测试阶段"] C --> C5["运维阶段"] D --> D1["系统化方法"] D --> D2["可重复过程"] D --> D3["最优实践"] style B fill:#e3f2fd,stroke:#1976d2 style C fill:#e8f5e9,stroke:#388e3d style D fill:#fff3e0,stroke:#f57c00

💡 BSI的关键特征

BSI强调的核心思想:

🏗️ 安全内建(Built-in)

  • 安全是软件的有机组成部分
  • 不是事后添加的附加功能
  • 从一开始就考虑安全

🔄 全生命周期

  • 贯穿整个软件开发生命周期
  • 不是某个阶段的独立活动
  • 持续的安全保障

🛠️ 工程化方法

  • 使用系统化、工程化的方法
  • 不是临时性的安全措施
  • 可重复、可度量的过程

二、软件安全三大支柱

2.1 Gary McGraw的软件安全框架

Gary McGraw博士及其合作者提出,软件安全应由三根支柱来支撑。

软件安全三大支柱:

graph TB A["软件安全"] B["应用风险管理
Risk Management"] C["软件安全接触点
Touchpoints"] D["安全知识
Knowledge"] A --> B A --> C A --> D B --> B1["识别和评估风险"] B --> B2["制定缓解策略"] B --> B3["持续监控"] C --> C1["代码审核"] C --> C2["架构风险分析"] C --> C3["渗透测试"] C --> C4["安全测试"] D --> D1["安全原则"] D --> D2["最佳实践"] D --> D3["威胁知识"] D --> D4["漏洞模式"] style B fill:#e3f2fd,stroke:#1976d2 style C fill:#e8f5e9,stroke:#388e3d style D fill:#fff3e0,stroke:#f57c00

🚨 常见错误:安全测试不是三大支柱之一

错误说法:软件安全的三根支柱是风险管理、软件安全触点和安全测试

为什么这是错误的:

  • 安全测试只是软件安全接触点的一部分
  • 不是独立的支柱
  • 它属于软件安全接触点中的具体实践

正确的三大支柱:

  1. 应用风险管理(Risk Management)
  2. 软件安全接触点(Touchpoints)
  3. 安全知识(Knowledge)

考题示例:

题目18:下列关于软件安全开发中的BSI(Build Security In)系列模型说法错误的是(B)。

A. BSI含义是指将安全内建到软件过程中,而不是可有可无,更不是游离于软件开发生命周期之外
B. 软件安全的三根支柱是风险管理、软件安全触点和安全测试
C. 软件安全触点是软件开发生命周期中一套轻量级最优工程化方法,它提供了从不同角度保障安全的行为方式
D. BSI系列模型强调应该使用工程化的方法来保证软件安全,即在整个软件开发生命周期中都要确保将安全作为软件的一个有机组成部分

答案:B

解析:

  • 选项B错误:软件安全的三根支柱是应用风险管理、软件安全接触点和安全知识,而不是"风险管理、软件安全触点和安全测试"
  • 安全测试只是软件安全接触点中的一个具体实践,不是独立的支柱
  • 其他选项都正确描述了BSI模型的核心理念

💡 软件安全三大支柱详解

正确答案:应用风险管理、软件安全接触点和安全知识

1️⃣ 应用风险管理(Risk Management)

  • 识别和评估软件面临的安全风险
  • 制定风险缓解策略
  • 持续监控和管理风险
  • 将安全风险纳入业务决策

2️⃣ 软件安全接触点(Touchpoints)

  • 在软件开发生命周期的关键点应用安全实践
  • 包括代码审核、架构风险分析、渗透测试等
  • 将安全融入开发过程
  • 在不同阶段采用不同的安全活动

3️⃣ 安全知识(Knowledge)

  • 安全原则和最佳实践
  • 威胁和攻击模式知识
  • 常见漏洞和缺陷模式
  • 安全设计模式和反模式

为什么不是其他选项:

选项 说明 为什么不正确
代码审核、风险分析和渗透测试 这些都是软件安全接触点 只是三大支柱之一的具体实践
威胁建模、渗透测试和软件安全接触点 威胁建模和渗透测试是接触点的一部分 缺少应用风险管理和安全知识
威胁建模、代码审核和模糊测试 都是具体的安全活动 只是软件安全接触点的实践方法

2.2 三大支柱的关系

三大支柱如何协同工作:

graph LR A["安全知识"] --> B["应用风险管理"] A --> C["软件安全接触点"] B --> D["安全软件"] C --> D B <--> C style A fill:#fff3e0,stroke:#f57c00 style B fill:#e3f2fd,stroke:#1976d2 style C fill:#e8f5e9,stroke:#388e3d style D fill:#c8e6c9,stroke:#2e7d32

💡 三大支柱的协同作用

安全知识是基础:

  • 为风险管理提供威胁和漏洞知识
  • 指导安全接触点的实施
  • 帮助团队理解安全重要性

应用风险管理是战略:

  • 确定安全优先级
  • 指导资源分配
  • 平衡安全和业务需求

软件安全接触点是战术:

  • 将安全融入开发过程
  • 在关键点应用安全实践
  • 发现和修复安全问题

三、软件安全接触点

3.1 主要接触点

软件开发生命周期中的安全接触点:

graph TB A["需求阶段"] --> A1["安全需求分析"] B["设计阶段"] --> B1["架构风险分析"] B --> B2["威胁建模"] C["实现阶段"] --> C1["代码审核"] C --> C2["安全编码"] D["测试阶段"] --> D1["安全测试"] D --> D2["模糊测试"] D --> D3["渗透测试"] E["部署阶段"] --> E1["安全配置"] E --> E2["部署审查"] F["运维阶段"] --> F1["安全监控"] F --> F2["漏洞管理"] style A fill:#e8eaf6,stroke:#3f51b5 style B fill:#f3e5f5,stroke:#9c27b0 style C fill:#e0f2f1,stroke:#009688 style D fill:#fff3e0,stroke:#ff9800 style E fill:#e8f5e9,stroke:#388e3d style F fill:#fce4ec,stroke:#c2185b

关键接触点详解:

接触点 阶段 主要活动 目标
安全需求分析 需求 识别安全需求、合规要求 明确安全目标
架构风险分析 设计 评估架构安全风险 安全架构设计
威胁建模 设计 识别威胁和攻击面 理解安全威胁
代码审核 实现 审查代码安全问题 发现代码缺陷
安全测试 测试 验证安全控制 确保安全功能
渗透测试 测试 模拟攻击 发现漏洞

3.2 代码审核

代码审核的类型:

graph TB A["代码审核"] B["静态代码审核"] C["动态代码审核"] D["人工代码审核"] A --> B A --> C A --> D B --> B1["不执行代码"] B --> B2["分析源代码"] B --> B3["自动化工具"] C --> C1["执行代码"] C --> C2["运行时分析"] C --> C3["发现运行时问题"] D --> D1["专家审查"] D --> D2["发现逻辑问题"] D --> D3["最佳实践检查"] style B fill:#e3f2fd,stroke:#1976d2 style C fill:#e8f5e9,stroke:#388e3d style D fill:#fff3e0,stroke:#f57c00

3.3 渗透测试

渗透测试的价值:

💡 渗透测试的作用

渗透测试是验证安全性的重要手段:

🎯 模拟真实攻击

  • 从攻击者角度评估系统
  • 发现实际可利用的漏洞
  • 验证安全控制有效性

🔍 发现深层问题

  • 发现设计和实现缺陷
  • 识别配置错误
  • 发现业务逻辑漏洞

📊 提供改进建议

  • 评估风险严重程度
  • 提供修复建议
  • 帮助优先级排序

四、应用风险管理

4.1 风险管理流程

应用风险管理的关键步骤:

graph LR A["风险识别"] --> B["风险评估"] B --> C["风险处置"] C --> D["风险监控"] D --> A A --> A1["识别威胁和漏洞"] B --> B1["评估可能性和影响"] C --> C1["制定缓解措施"] D --> D1["持续监控"] style A fill:#e3f2fd,stroke:#1976d2 style B fill:#fff3e0,stroke:#f57c00 style C fill:#e8f5e9,stroke:#388e3d style D fill:#f3e5f5,stroke:#7b1fa2

风险处置策略:

策略 说明 适用场景
规避 消除风险源 风险过高且可避免
缓解 降低风险 风险可接受但需控制
转移 转移给第三方 可通过保险等转移
接受 接受残余风险 风险很低或成本过高

4.2 风险评估方法

常用风险评估方法:

风险评估方法:
├── 定性评估
│   ├── 专家判断
│   ├── 风险矩阵
│   └── 场景分析
├── 定量评估
│   ├── 年度损失期望(ALE)
│   ├── 投资回报率(ROI)
│   └── 成本效益分析
└── 混合方法
    ├── FAIR(Factor Analysis of Information Risk)
    ├── OCTAVE(Operationally Critical Threat, Asset, and Vulnerability Evaluation)
    └── NIST风险管理框架

五、安全知识

5.1 安全原则

核心安全原则:

graph TB A["安全原则"] B["最小权限"] C["纵深防御"] D["失败安全"] E["完全中介"] F["开放设计"] G["权限分离"] A --> B A --> C A --> D A --> E A --> F A --> G B --> B1["仅授予必要权限"] C --> C1["多层安全控制"] D --> D1["失败时保持安全"] E --> E1["检查每次访问"] F --> F1["不依赖隐蔽性"] G --> G1["分散权力"] style B fill:#e3f2fd,stroke:#1976d2 style C fill:#e8f5e9,stroke:#388e3d style D fill:#fff3e0,stroke:#f57c00 style E fill:#f3e5f5,stroke:#7b1fa2 style F fill:#fce4ec,stroke:#c2185b style G fill:#e1f5fe,stroke:#0277bd

5.2 常见漏洞类型

OWASP Top 10(2021):

排名 漏洞类型 说明
A01 失效的访问控制 未正确实施访问限制
A02 加密机制失效 敏感数据未加密或加密不当
A03 注入 SQL注入、命令注入等
A04 不安全设计 设计阶段的安全缺陷
A05 安全配置错误 不安全的默认配置
A06 易受攻击和过时的组件 使用有漏洞的第三方组件
A07 身份识别和身份验证失效 认证机制缺陷
A08 软件和数据完整性失效 未验证完整性
A09 安全日志和监控失效 缺乏有效监控
A10 服务器端请求伪造(SSRF) 服务器被诱导发起请求

5.3 安全设计模式

常用安全设计模式:

安全设计模式:
├── 认证和授权
│   ├── 单点登录(SSO)
│   ├── 基于角色的访问控制(RBAC)
│   └── OAuth 2.0
├── 数据保护
│   ├── 加密存储
│   ├── 传输加密(TLS/SSL)
│   └── 数据脱敏
├── 输入验证
│   ├── 白名单验证
│   ├── 参数化查询
│   └── 输出编码
└── 会话管理
    ├── 安全会话令牌
    ├── 会话超时
    └── 会话固定防护

六、安全开发生命周期

6.1 SDL模型

Microsoft SDL(Security Development Lifecycle):

graph LR A["培训"] --> B["需求"] B --> C["设计"] C --> D["实现"] D --> E["验证"] E --> F["发布"] F --> G["响应"] A --> A1["安全培训"] B --> B1["安全需求"] C --> C1["威胁建模"] D --> D1["安全编码"] E --> E1["安全测试"] F --> F1["安全响应计划"] G --> G1["事件响应"] style A fill:#e8eaf6,stroke:#3f51b5 style B fill:#f3e5f5,stroke:#9c27b0 style C fill:#e0f2f1,stroke:#009688 style D fill:#fff3e0,stroke:#ff9800 style E fill:#e8f5e9,stroke:#388e3d style F fill:#fce4ec,stroke:#c2185b style G fill:#ffebee,stroke:#c62828

SDL各阶段活动:

阶段 主要活动 交付物
培训 安全意识培训、技术培训 培训记录
需求 安全需求分析、合规要求 安全需求文档
设计 威胁建模、架构审查 威胁模型、设计文档
实现 安全编码、代码审查 安全代码
验证 安全测试、渗透测试 测试报告
发布 最终安全审查、响应计划 发布批准
响应 漏洞响应、补丁管理 安全更新

七、总结

软件安全的核心要点:

  1. BSI模型:将安全内建到软件过程中,使用工程化方法
  2. 三大支柱:应用风险管理、软件安全接触点和安全知识
  3. 接触点:在开发生命周期关键点应用安全实践
  4. 风险管理:识别、评估、处置和监控安全风险
  5. 安全知识:掌握安全原则、漏洞模式和最佳实践
  6. SDL:将安全融入整个开发生命周期

🎯 关键要点

  • BSI强调将安全内建到软件过程中,贯穿整个生命周期
  • Gary McGraw提出的软件安全三大支柱:应用风险管理、软件安全接触点和安全知识
  • 安全测试是软件安全接触点的一部分,不是独立的支柱
  • 软件安全接触点包括代码审核、架构风险分析、渗透测试等
  • 应用风险管理是战略层面的安全管理
  • 安全知识是软件安全的基础
  • 安全应该融入软件开发生命周期的每个阶段

💡 实践建议

  • 建立安全开发生命周期(SDL)
  • 定期进行安全培训
  • 在设计阶段进行威胁建模
  • 实施代码审核和安全测试
  • 建立漏洞响应机制
  • 持续监控和改进安全实践

系列文章:

分享到