CISP学习指南:软件安全

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

一、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 软件安全框架

软件安全三大支柱:

graph TB A["软件安全"] B["应用风险管理<br/>Risk Management"] C["软件安全接触点<br/>Touchpoints"] D["安全知识<br/>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)
📝软件安全三大支柱详解

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)
│   └── 数据脱敏
├── 输入验证
│   ├── 白名单验证
│   ├── 参数化查询
│   └── 输出编码
└── 会话管理
    ├── 安全会话令牌
    ├── 会话超时
    └── 会话固定防护

六、系统安全工程能力成熟度模型(SSE-CMM)

6.1 SSE-CMM概述

系统安全工程-能力成熟度模型(SSE-CMM,Systems Security Engineering Capability Maturity Model)是评估和改进组织安全工程能力的框架。 SSE-CMM的核心理念:

graph TB A["SSE-CMM"] B["安全工程"] C["能力成熟度"] D["持续改进"] A --> B A --> C A --> D B --> B1["系统化方法"] B --> B2["工程化实践"] B --> B3["全生命周期"] C --> C1["5个成熟度级别"] C --> C2["22个过程域"] 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

6.2 SSE-CMM的正确理解

☠️🚨 SSE-CMM的错误理解

错误说法:基于SSE-CMM的工程是独立工程,与软件工程、硬件工程、通信工程等分别规划实施为什么这是错误的: SSE-CMM强调安全工程应该集成到其他工程中,而不是独立存在。 正确理解:

  • ✅ 安全工程应融入软件工程
  • ✅ 安全工程应融入硬件工程
  • ✅ 安全工程应融入通信工程
  • ✅ 安全工程应融入系统工程
  • ❌ 不是独立的、分离的工程
📝SSE-CMM的核心特性

🤝 组织协作性

  • 需要与开发方、产品供应商、集成商、咨询服务商等协作
  • 安全工程不是孤立的活动
  • 强调跨组织的相互作用 📊 工程规范化
  • 通过成熟度模型使安全工程规范化
  • 可以度量和评估安全工程能力
  • 支持持续改进
  • 使安全工程成为确定的、成熟的和可度量的学科 🔗 工程集成性
  • 安全工程应该集成到软件工程、硬件工程、通信工程等其他工程中
  • 不是独立规划和实施的工程
  • 需要与其他工程协同工作
  • 强调融合而非分离 🏢 全面覆盖性
  • 包括管理、组织和工程活动
  • 不仅仅是系统安全的工程活动
  • 是全面的能力评估框架
  • 覆盖整个组织的安全工程实践 SSE-CMM的关键特征: | 特征 | 说明 | 重要性 | |------|------|--------| | 集成性 | 与其他工程集成,不是独立工程 | ⭐⭐⭐⭐⭐ | | 全面性 | 覆盖管理、组织、工程活动 | ⭐⭐⭐⭐⭐ | | 协作性 | 与多方组织相互作用 | ⭐⭐⭐⭐ | | 可度量性 | 确定的、成熟的、可度量的 | ⭐⭐⭐⭐⭐ | | 持续改进 | 支持能力提升 | ⭐⭐⭐⭐⭐ |

6.3 SSE-CMM的成熟度级别

5个成熟度级别:

graph TB A["SSE-CMM成熟度级别"] B["Level 1<br/>执行非正式"] C["Level 2<br/>计划和跟踪"] D["Level 3<br/>定义良好"] E["Level 4<br/>定量控制"] F["Level 5<br/>持续改进"] A --> B B --> C C --> D D --> E E --> F B --> B1["基本实践"] C --> C1["项目管理"] D --> D1["标准化"] E --> E1["量化管理"] F --> F1["优化"] style B fill:#ffcdd2,stroke:#b71c1c style C fill:#ffccbc,stroke:#d84315 style D fill:#fff3e0,stroke:#f57c00 style E fill:#c8e6c9,stroke:#2e7d32 style F fill:#e3f2fd,stroke:#1976d2

各级别特征:

级别名称特征关键实践
1执行非正式临时的、混乱的基本安全实践
2计划和跟踪项目级管理项目计划、跟踪
3定义良好组织级标准化标准过程、培训
4定量控制量化管理度量、统计控制
5持续改进优化缺陷预防、技术创新

6.4 SSE-CMM的过程域

22个过程域分类:

SSE-CMM过程域:
├── 工程过程域(11个)
│   ├── 管理安全控制
│   ├── 评估影响
│   ├── 评估安全风险
│   ├── 评估威胁
│   ├── 评估脆弱性
│   ├── 建立保证论据
│   ├── 协调安全
│   ├── 监控安全态势
│   ├── 提供安全输入
│   ├── 规定安全需求
│   └── 验证和确认安全
├── 项目过程域(6个)
│   ├── 确保质量
│   ├── 管理配置
│   ├── 管理项目风险
│   ├── 监控和控制技术工作
│   ├── 计划技术工作
│   └── 定义系统工程过程
└── 组织过程域(5个)
    ├── 改进组织系统工程过程
    ├── 管理产品线演进
    ├── 管理系统工程支持环境
    ├── 提供持续技能和知识
    └── 协调与供应商

6.5 SSE-CMM与其他模型的关系

模型对比:

模型关注点范围关系
SSE-CMM安全工程能力组织安全工程专注安全
CMM/CMMI软件/系统工程能力组织工程能力通用框架
ISO 27001信息安全管理信息安全管理体系管理体系
SDL安全开发软件开发生命周期开发实践
SSE-CMM的价值:
  • 📊 评估组织安全工程能力
  • 🎯 识别改进机会
  • 📈 指导能力提升
  • ✅ 验证改进效果
  • 🏆 获得客户信任

七、软件安全实践总结

7.1 安全实践框架

软件安全实践的关键领域:

软件安全实践框架:
├── 人员层面
│   ├── 安全意识培训
│   ├── 安全技能培训
│   └── 安全文化建设
├── 过程层面
│   ├── 安全需求分析
│   ├── 威胁建模
│   ├── 安全设计审查
│   ├── 安全编码
│   ├── 代码审查
│   └── 安全测试
├── 技术层面
│   ├── 安全编码准则
│   ├── 安全开发工具
│   ├── 静态代码分析
│   ├── 动态安全测试
│   └── 渗透测试
└── 管理层面
    ├── 安全策略制定
    ├── 安全度量
    ├── 安全审计
    └── 持续改进
📝安全实践要点

有效的安全措施:安全意识培训

  • 提高开发人员安全意识
  • 了解常见安全漏洞
  • 学习安全编码实践 ✅ 安全编码准则
  • 建立安全编码标准
  • 防止常见安全漏洞
  • 统一安全实践 ✅ 安全测试环节
  • 在发布前发现漏洞
  • 验证安全控制
  • 持续改进

八、总结

软件安全的核心要点:

  1. BSI模型:将安全内建到软件过程中,使用工程化方法
  2. 三大支柱:应用风险管理、软件安全接触点和安全知识
  3. 接触点:在开发生命周期关键点应用安全实践
  4. 风险管理:识别、评估、处置和监控安全风险
  5. 安全知识:掌握安全原则、漏洞模式和最佳实践
  6. SDL:将安全融入整个开发生命周期
关键要点
  • BSI强调将安全内建到软件过程中,贯穿整个生命周期
  • 提出的软件安全三大支柱:应用风险管理、软件安全接触点和安全知识
  • 安全测试是软件安全接触点的一部分,不是独立的支柱
  • 软件安全接触点包括代码审核、架构风险分析、渗透测试等
  • 应用风险管理是战略层面的安全管理
  • 安全知识是软件安全的基础
  • 安全应该融入软件开发生命周期的每个阶段
💡实践建议
  • 建立安全开发生命周期(SDL)
  • 定期进行安全培训
  • 在设计阶段进行威胁建模
  • 实施代码审核和安全测试
  • 建立漏洞响应机制
  • 持续监控和改进安全实践