Archipelago

Lec 1什么是计算机安全?

讲义完成更新于 2026-09-16
承接

这是当前课程已收录的第一篇。

Lec 1 什么是计算机安全?

TL;DR

  • 安全结论只在明确的系统模型与威胁模型内成立;设计必须分别说明攻击者能力、安全目标和实现机制。
  • 机密性、完整性与可用性描述不同保护目标,而现实系统不可能同时抵御所有物理、软件与社会工程攻击。
  • 失败通常来自目标定义错误、威胁模型遗漏或实现漏洞;公开设计、最小权限和纵深防御用于降低单点假设失效的代价。

1. 安全的核心框架

计算机安全的目标:在对手(adversary)的攻击下,系统仍能正确运行。

系统设计的三要素:

要素含义示例
模型(Model / Threat Model)系统与攻击者的交互方式,攻击者能力边界攻击者可发送网络包,但不能物理接触服务器
目标(Goal)系统需要保证的安全属性只有 Alice 能读取文件 F
实现(Implementation)如何在该模型下实现目标设置文件权限、启用密码+双因素认证

Kerckhoff 原则:

实现方案永远假定为公开,唯一保密的是密钥(secret key)

2. 安全目标的三大类别

  • 机密性(Confidentiality):对手无法获取敏感信息
  • 完整性(Integrity):对手无法篡改系统状态
  • 可用性(Availability):系统在攻击下仍能正常运行

3. 安全为何困难

3.1 负向目标(Negative Goal)

实现正向功能只需一条代码路径,而安全要求没有任何漏洞路径——需要考虑所有可能攻击。

3.2 典型案例:成绩单文件

攻击途径包括:利用服务器漏洞、猜测助教密码、窃取笔记本、拦截网络传输、破解加密方案、入侵注册办公室……

4. 三类失败原因

4.1 目标设计不当

  • 航空公司商务舱票:允许"随时改签不收费",但未限定"登机后禁止改签"——攻击者可无限循环乘机。

  • Sarah Palin 邮件被盗:Yahoo 密码重置通过安全问题完成,而答案可从互联网公开信息找到。策略实际上等价于"密码 OR 安全问题"。

  • Mat Honan 账户链式攻击:

    1. Amazon 允许无验证添加信用卡
    2. 用刚添加卡的末四位通过 Apple 密码重置
    3. 进入 Apple 邮件 → 触发 Gmail 密码重置
    • 教训:各个策略单独看合理,组合后产生漏洞。
  • Fairfax 学校权限提升: 老师可将学生加入班级 → 修改学生密码 → 将 Superintendent 变为"学生" → 修改其密码 → 获取全校文件访问权。

  • TLS 证书 OCR 漏洞:CA 对 .eu 域名联系人邮件地址用 OCR 识别 ASCII 图片,a1telekom.at 被误读为 altelekom.at,攻击者注册误读域名即可冒充合法域名获取证书

  • 管理/维护盲点:谁能修改权限?谁能访问审计日志?谁能管理备份?

4.2 威胁模型假设错误

假设实际漏洞
用户不会向对手透露 2FA 码电话社工可骗取用户实时输入验证码
个人信息难以获取Facebook 等使安全问题答案几乎公开
56-bit DES 够安全(1980s)如今暴力破解仅需 ~$100
IP 限速防止 DDoS攻击者控制百万台僵尸设备
CAPTCHA 需要 OCR 才能破解人工破解服务每个不到 $0.01
所有 CA 不会被攻破2011 年 DigiNotar 被攻破,伪造了 Google/Yahoo/Tor 等证书
安全通过隐藏实现(Security through Obscurity)Clipper Chip 等案例证明此策略不可靠

4.3 实现结果的漏洞

缓冲区溢出:C 代码对缓冲区边界检查不当 → 覆盖返回地址 → 任意代码执行。

iCloud 限速遗漏:对所有登录接口限速,但"查找 iPhone" API 遗忘限速 → 每天可暴力猜测数百万次密码。

不安全默认配置:路由器默认密码、AWS S3 Bucket 默认公开权限——大系统中极易遗漏配置,默认必须安全。

MS Office 签名绕过:

  • Bug 1:未检查签名文档是否为顶层文档,可嵌套欺骗显示"已签名"
  • Bug 2:Mac 版只要存在签名对象就显示"受数字签名保护",不验证签名内容

Citi 缺失授权检查:账户页面 URL 含账户 ID(x.citi.com/id=1234),服务器未校验当前登录用户是否匹配,可枚举他人账户。

随机数质量问题:

  • Sony PS3:签名时重用随机数 nonce → 私钥可被数学推导出
  • Debian OpenSSL(2008):开发者删除 PRNG 初始化代码,所有生成密钥可被猜测
  • Android 比特币钱包:SecureRandom 未初始化 → ECDSA nonce 重复 → 私钥泄露 → 比特币被盗

5. 设计原则

目标与威胁模型层面

  • 创建简单、通用的安全目标
  • 通过更好的系统设计消除对不合理假设的依赖
  • 不断学习、迭代(安全不可能一次做对)
  • 纵深防御(Defense in Depth):多层防御,单点失效不导致整体崩溃

实现层面

  • 系统越简单,漏洞越少
  • 将安全关键部分独立为小模块(如 HSM 硬件安全模块)
  • 复用经过充分测试的代码和密码库
  • 充分理解并测试边界情况

关键公式 / 定义

机密性(非正式):对任意高效对手 A\mathcal{A},其输出与受害者秘密独立。

可行性阈值(实践经验值):

运行时间>2128⇒不可行(infeasible)\text{运行时间} > 2^{128} \Rightarrow \text{不可行(infeasible)}

Pr⁡[事件]<2−128⇒可认为永远不会发生(negligible)\Pr[\text{事件}] < 2^{-128} \Rightarrow \text{可认为永远不会发生(negligible)}

安全的博弈定义(非正式):

  • 挑战者(Challenger)设置系统
  • 对手(Adversary)在威胁模型约束下与系统交互
  • 若对手无法以不可忽略概率违反安全目标,则称系统是安全的

公开漏洞数据库, 如https://www.cve.org/

我的理解

安全结论永远附着在威胁模型上;不先说明资产、对手能力和失败边界,“安全”就只是无法验证的形容词。