跳转到内容
← 返回核心概念
安全与隐私计算机科学 · 安全15 分钟阅读

计算机安全原则

Computer Security Principles

2017 年 5 月 12 日,"WannaCry"勒索软件在一天之内感染了全球 150 个国家超过 23 万台计算机。英国国家医疗服务体系(NHS)的大量医院被迫关闭紧急服务,手术被取消,救护车被改道。代价估计超过 40 亿美元。 WannaCry 利用的是 Windows 的一个漏洞(EternalBlue),这个…

安全密码学漏洞威胁模型零信任

2017 年 5 月 12 日,"WannaCry"勒索软件在一天之内感染了全球 150 个国家超过 23 万台计算机。英国国家医疗服务体系(NHS)的大量医院被迫关闭紧急服务,手术被取消,救护车被改道。代价估计超过 40 亿美元。

WannaCry 利用的是 Windows 的一个漏洞(EternalBlue),这个漏洞由美国国家安全局(NSA)发现并保留,后被一个叫"影子掮客"的组织窃取并公开。微软在攻击爆发前两个月已经发布了补丁,但数十万台机器没有及时更新。

这个案例展示了计算机安全的核心悖论:安全工具本身也是攻击工具;最危险的漏洞往往不在于技术,而在于人和流程

破除误解:安全不是产品,是过程

许多人把安全理解为"装了防火墙和杀毒软件就安全了"。这是危险的误解。

安全是一个持续的过程,不是一个可以购买的产品状态。

原因在于:攻击者和防御者处于持续的"猫鼠游戏"中。每个新的防御机制都会催生新的攻击手段,每个发现的漏洞背后都有未知的同类漏洞。绝对的安全不存在;目标是把攻击的代价提高到超过收益,以及把被攻击后的损失控制到可接受范围

破除误解:把系统藏起来不等于安全

另一个常见误解是"只要把算法和源码藏好,攻击者就攻不进来"。这叫"隐晦式安全"(security through obscurity),在专业领域被视为脆弱的策略。

荷兰裔密码学家奥古斯特·柯克霍夫斯(Auguste Kerckhoffs)早在 1883 年的《军事密码学》(La Cryptographie Militaire)中就提出:一套加密系统即使整体设计落入敌手,也应当依然安全——安全只应依赖于密钥的保密,而非算法的保密。

信息论奠基人香农(Claude Shannon)后来把它凝练成一句话:"敌人了解系统"(the enemy knows the system)。

这正是现代密码学(如 AES、RSA)公开算法、只保护密钥的根本理由:公开的算法经得起全世界的审视,藏起来的算法只是把已知的漏洞推迟到被发现的那一天。隐晦可以作为深度防御的一层,但绝不能是唯一的一层。

安全的三角:CIA

计算机安全有三个核心目标,简称 CIA 三角

  • 保密性(Confidentiality):信息只被授权的人访问。破坏示例:数据库泄露、网络窃听。
  • 完整性(Integrity):信息不被未授权篡改。破坏示例:中间人攻击修改了传输中的数据、文件被恶意软件加密。
  • 可用性(Availability):授权用户能在需要时访问系统。破坏示例:DDoS 攻击、勒索软件。

不同系统对三个目标的权重不同:军事系统最关注保密性,金融系统最关注完整性,应急响应系统最关注可用性。

威胁建模

威胁建模(Threat Modeling)是安全设计的第一步:在攻击发生前,系统性地思考"谁会攻击我,用什么方式,目标是什么"。

常用的威胁建模框架:

STRIDE(微软的 Loren Kohnfelder 与 Praerit Garg 于 1999 年在内部文章《The Threats to Our Products》中提出):

威胁类型含义破坏的安全属性
Spoofing(假冒)冒充他人身份身份验证
Tampering(篡改)修改数据或代码完整性
Repudiation(否认)否认执行过某操作不可否认性
Information Disclosure(信息泄露)向未授权方暴露信息保密性
Denial of Service(拒绝服务)使服务不可用可用性
Elevation of Privilege(权限提升)获取超出授权的权限授权

最小权限原则

最小权限原则(Principle of Least Privilege,PoLP) 是安全设计的基石之一,由 Jerome Saltzer 和 Michael Schroeder 在 1975 年论文中提出:

每个主体(用户、程序、系统)只应该拥有完成其任务所需的最少权限,不多一点。

这个原则的推论在于:即使某个组件被攻陷,攻击者获得的权限也是受限的,无法横向移动到其他系统。

值得一提的是,同一篇 1975 年论文一口气提出了八条设计原则,最小权限只是其中之一。另外几条同样常被引用:默认拒绝(fail-safe defaults,没有明确授权就一律拒绝)、开放设计(open design,安全不依赖设计的保密,与上文柯克霍夫原则呼应)、以及心理可接受性(psychological acceptability,安全机制必须易用,否则用户会主动绕开它)。半个世纪过去,这八条几乎原封不动地仍是安全设计的公认起点。

实际应用: - 数据库账户应只有当前应用需要的操作权限(读/写特定表),不应是管理员 - 云服务角色(IAM Role)应精确定义,不应用"管理员"角色 - 进程应以非 root 用户运行

深度防御

深度防御(Defense in Depth) 来自军事概念:不依赖单一防线,而是设置多层防御,即使某层被突破,其他层仍能阻止攻击。

一个 Web 应用的深度防御示例: - 网络层:防火墙、DDoS 防护 - 传输层:TLS 加密 - 应用层:输入验证、SQL 注入防护 - 身份层:多因素认证 - 数据层:加密存储、最小权限访问 - 检测层:日志、异常检测、SIEM

当任何一层失效时,其他层仍然提供保护。

常见攻击类型

SQL 注入(SQL Injection):攻击者在用户输入中嵌入 SQL 命令。例如,登录表单的用户名输入 admin' --,可能绕过密码验证。防御:参数化查询(Prepared Statement)。

跨站脚本(XSS,Cross-Site Scripting):在网页中注入恶意 JavaScript,当其他用户访问时执行。防御:输出转义(HTML encoding)、内容安全策略(CSP)。

跨站请求伪造(CSRF,Cross-Site Request Forgery):诱导已登录用户的浏览器向目标网站发送恶意请求。防御:CSRF Token、SameSite Cookie。

缓冲区溢出(Buffer Overflow):写入超过缓冲区大小的数据,覆盖相邻内存,可以劫持程序执行流。C/C++ 代码的经典漏洞。防御:边界检查、使用内存安全语言(Rust)、Address Space Layout Randomization(ASLR)。

这类内存安全漏洞的分量超出多数人想象。微软安全工程师 Matt Miller 在 2019 年 BlueHat 大会上披露:过去 12 年里,微软约 70% 的安全补丁都在修复内存安全问题。Google 对 Chrome 的统计也得出相近比例。正因如此,美国网络安全和基础设施安全局(CISA)近年公开呼吁用内存安全语言(如 Rust)重写关键系统——这是一个"换语言比打补丁更治本"的罕见行业共识。

社会工程学(Social Engineering):不攻击技术,而是利用人的心理——冒充 IT 部门要求提供密码、发送钓鱼邮件等。技术防御无法完全阻止,需要安全意识培训。

Verizon 的《2024 年数据泄露调查报告》给出了量化证据:约 68% 的数据泄露涉及非恶意的人为因素——有人犯了错,或落入社会工程陷阱;而被窃取的凭据是 38% 数据泄露的最初突破口。开篇 WannaCry 揭示的悖论在这里再次得到印证:最薄弱的环节常常是人,而非机器。

软件供应链:现代防御的新前沿

WannaCry 暴露的是"没及时打补丁",而 2021 年底的 Log4Shell 暴露的是另一类更棘手的问题:你依赖的开源组件出了漏洞,而你甚至不知道自己用了它。

Log4j 是一个极其普及的 Java 日志库。它的漏洞 CVE-2021-44228 在 2021 年 12 月初公开,CVSS 评分拿到满分 10.0——攻击者只需让服务器记录一行精心构造的日志,就能远程执行任意代码。

这个漏洞由阿里云安全团队的陈兆军(Chen Zhaojun)发现并上报,而它其实自 2013 年起就潜伏在代码里,多年无人察觉。由于 Log4j 被无数应用间接依赖,潜在受影响设备以亿计。

它的教训是:现代软件是层层依赖堆叠出来的,你的安全边界不止于自己写的代码,还包括你所有的依赖、以及依赖的依赖。这催生了"软件物料清单"(SBOM,列出软件包含的全部组件,让漏洞排查有据可查)等供应链安全实践。

零信任架构

传统安全模型假设:内网是安全的,外网是危险的。"城堡与护城河"模型——只要攻入边界,内部是可信的。

零信任(Zero Trust):假设内网同样不可信,对每次访问都进行身份验证和授权。这个术语由 Forrester 分析师 John Kindervag 在 2010 年的报告《No More Chewy Centers》(标题讽刺传统架构外硬内软、像一颗软心糖)中正式提出。核心原则:

  • 不信任任何人,无论在内网还是外网
  • 最小权限访问,始终验证
  • 假设已被攻破(Assume Breach)

零信任的实现依赖于身份管理(Identity Provider)、微分段(每个服务之间也有访问控制)和持续监控。Google 的 BeyondCorp 项目(2010 年开始)是企业零信任的最早大规模实践之一。

代价与争议

安全与便利的永恒张力:更严格的安全措施往往意味着更大的使用摩擦。多因素认证(MFA)显著提高安全性,但增加了登录步骤。过度严格的安全措施会导致用户绕过它——在便利贴上写密码,是安全专家最头痛的现象。

安全漏洞的披露伦理:发现漏洞后,应该立即公开,还是先通知受影响方,给他们时间修补?"负责任披露"(Responsible Disclosure)是行业主流规范,但政府机构(如 NSA)囤积漏洞用于攻击的做法,与这一精神背道而驰。

AI 驱动的攻防升级:大语言模型已被用于生成更逼真的钓鱼邮件和自动化漏洞挖掘。同时,AI 也用于异常检测和自动化安全分析。这场升级战的走向仍不明朗。

跨域连接

  • 软件供应链安全:那次日志库漏洞暴露的不是补丁慢,而是你根本不知道自己用了它。信任边界止于依赖的依赖,所以现代防御的第一步是把"用了什么"变成可查询的事实——物料清单的价值就在这里。推论是:安全边界的长度等于依赖树的规模,而不是自己代码的行数。
  • 可证伪性:隐晦式安全的缺陷不在保密,而在它的安全主张无法被检验,因而也无法积累证据。柯克霍夫原则等于要求把假设写成可公开攻击的命题:公开算法经得起全世界试错,藏起来只是把已知漏洞推迟到被发现那天。这也把隐晦降格为纵深防御中的一层,而不能成为唯一的一层。
  • 信息不对称:买方在购买时无法观察软件的安全质量,于是厂商投入安全的收益不可见,市场向低质量收敛。认证、强制披露与责任规则都在补这条缺口——它们改变的不是技术,而是质量能否被定价。安全投入的转折点因此常由责任规则决定,而不由攻击技术决定。
  • 认知偏差:社会工程制造权威、紧迫与互惠三种线索,逼人用快速判断代替核实。可检验推论:只教人识别钓鱼特征的培训在时间压力下会失效;有效对策是改流程——带外确认、双人复核,而不是指望当事人当场识破。
  • 情报与间谍:同一个漏洞既是进攻能力,也是本国的暴露面,囤积还是上报因此是把攻防收益放在同一杆秤上称。那场席卷医院的勒索软件给出了这笔账的另一半:泄露之后,代价由完全无关的第三方承担。推论是:漏洞的社会成本与它的情报价值,并不由同一方承担。

参考文献

  • Saltzer, J. & Schroeder, M. The Protection of Information in Computer Systems. Proceedings of the IEEE 63(9), 1975. (最小权限原则的来源)
  • Anderson, R. Security Engineering: A Guide to Building Dependable Distributed Systems, 3rd Ed. Wiley, 2020. (全面的安全工程教材,作者提供在线阅读)
  • Google. BeyondCorp: A New Approach to Enterprise Security. ;login: USENIX, 2014.
  • OWASP. OWASP Top Ten. owasp.org. (每年更新的 Web 安全十大风险)
  • Kerckhoffs, A. La Cryptographie Militaire. Journal des sciences militaires, 1883. (隐晦式安全批判与开放设计原则的源头)
  • Kindervag, J. No More Chewy Centers: Introducing The Zero Trust Model of Information Security. Forrester Research, 2010. (零信任术语首次提出)
  • Miller, M. Trends, Challenges, and Strategic Shifts in the Software Vulnerability Mitigation Landscape. BlueHat IL, 2019. (微软约 70% 补丁为内存安全问题的来源)
  • Verizon. 2024 Data Breach Investigations Report. Verizon Business, 2024. (人为因素与凭据窃取占比的来源)

延伸阅读

  • Schneier, B. Secrets and Lies: Digital Security in a Networked World. Wiley, 2000.