- 操作系统教程
- 操作系统 - 首页
- 操作系统 - 需求
- 操作系统 - 概述
- 操作系统 - 历史
- 操作系统 - 组件
- 操作系统 - 结构
- 操作系统 - 架构
- 操作系统 - 服务
- 操作系统 - 属性
- 操作系统 - 周转时间 & 等待时间
- 操作系统进程
- 操作系统 - 进程
- 操作系统 - 进程调度
- 操作系统 - 调度算法
- 先来先服务调度算法
- 最短作业优先调度算法
- 轮循调度算法
- 最高响应比优先调度算法
- 优先级调度算法
- 多级队列调度
- 上下文切换
- 进程操作
- 彩票进程调度
- 预测突发时间最短作业优先调度
- 竞争条件漏洞
- 临界区同步
- 互斥同步
- 进程控制块
- 进程间通信
- 抢占式和非抢占式调度
- 操作系统同步
- 进程同步
- 操作系统内存管理
- 操作系统 - 内存管理
- 操作系统 - 虚拟内存
- 操作系统存储管理
- 操作系统 - 文件系统
- 操作系统类型
- 操作系统 - 类型
- 操作系统杂项
- 操作系统 - 多线程
- 操作系统 - I/O 硬件
- 操作系统 - I/O 软件
- 操作系统 - 安全
- 操作系统 - Linux
- 考试题库及答案
- 考试题库及答案
- 操作系统有用资源
- 操作系统 - 快速指南
- 操作系统 - 有用资源
- 操作系统 - 讨论
操作系统 - 竞争条件漏洞
竞争条件
在操作系统中,竞争条件是一种不希望出现的情况,当多个进程或线程并发访问和操作共享资源时发生,导致输出不一致。执行结果取决于在抢占式环境中执行的进程的各个语句的执行顺序。共享资源可以是共享变量、表或文件。这些进程“竞争”访问共享资源,因此这种情况称为竞争条件。
竞争条件示例
让我们考虑一个场景,其中两个进程 P1 和 P2 试图更改存储在内存位置 C 中的共享变量的值,该变量最初为 10。P1 想要增加 C 的值,而 P2 想要减少 C 的值。增加或减少的操作不是单个语句,而是对应于如下所示的多个语句。
P1 的语句为 −
R1 ← M(C) [将内存位置 C 的内容加载到寄存器 R1]
R1 ← R1 + 1 [增加寄存器 R1 的内容]
M(C) ← R1 [将寄存器 R1 的内容存储到内存位置 C]
P2 的语句为 −
R2 ← M(C) [将内存位置 C 的内容加载到寄存器 R2]
R2 ← R2 - 1 [减少寄存器 R1 的内容]
M(C) ← R2 [将寄存器 R2 的内容存储到内存位置 C]
在理想情况下,P1 完全执行,然后 P2 执行,反之亦然。因此,在两个进程都执行后,C 的值保持不变,即 10。但是,由于 P1 和 P2 彼此竞争,并且每个进程都可能抢占另一个进程,因此语句是交织在一起的。让我们看一下导致不同输出的两种不同场景。
场景 1 −
时间戳 | 进程 | 语句 | R1、R2 和 M(C) 的值 |
---|---|---|---|
T1 | P1 | R1 ← M(C) | R1 = 10,M(C) = 10 |
T2 | P2 | R2 ← M(C) | R2 = 10,M(C) = 10 |
T3 | P2 | R2 ← R2 - 1 | R1 = 10,R2 = 9,M(C) = 10 |
T4 | P1 | R1 ← R1 + 1 | R1 = 11,R2 = 9,M(C) = 10 |
T5 | P1 | M(C) ← R1 | R1 = 11,R2 = 9,M(C) = 11 |
T6 | P2 | M(C) ← R2 | R1 = 11,R2 = 9,M(C) = 9 |
在上述场景中,我们发现进程 P1 执行的增加操作完全丢失了,C 的值为 9,这是不正确的。
场景 2 −
时间戳 | 进程 | 语句 | R1、R2 和 M(C) 的值 |
---|---|---|---|
T1 | P1 | R1 ← M(C) | R1 = 10,M(C) = 10 |
T2 | P1 | R1 ← R1 + 1 | R1 = 11,M(C) = 10 |
T3 | P2 | R2 ← M(C) | R1 = 11,R2 = 10,M(C) = 10 |
T4 | P2 | R2 ← R2 - 1 | R1 = 11,R2 = 9,M(C) = 10 |
T5 | P2 | M(C) ← R2 | R1 = 11,R2 = 9,M(C) = 9 |
T6 | P1 | M(C) ← R1 | R1 = 11,R2 = 9,M(C) = 11 |
在上述场景中,我们发现进程 P2 执行的减少操作丢失了,C 的值为 11,这也是不正确的。
从以上两个场景可以看出,如果更改共享资源的代码部分没有以原子方式执行,则结果可能不正确或丢失。
竞争条件漏洞
竞争条件漏洞是一种软件错误,允许恶意实体利用竞争条件下并发进程的执行,以便产生不一致的输出。它是一个重要的安全漏洞,被识别为 CWE-362(常见弱点枚举,第 362 节)。
当在进程或线程的检查时间 (TOC) 和使用时间 (TOU) 窗口之间插入错误代码时,无论是恶意还是故意,都会导致此问题。
以下是一些竞争条件漏洞的示例 −
- 黑客可以在检查登录凭据之前,在授予访问权限的过程中干扰安全系统。攻击是通过在 TOC 和 TOU 之间插入恶意代码来执行的,然后对未经授权的用户进行身份验证以访问系统。
- 对于临时文件,攻击者将使用一些常见的名称建议创建或更改文件以存储敏感数据。通过这种方式,攻击者可以更改系统的行为,从而导致漏洞。
- 当用户想要访问任何文件或数据时,系统会提示他们文件需要访问权限。利用这一点,数据和文件可能会导致损坏或丢失。
- 攻击者可以打开数据库并根据自己的需要更改数据,例如根据绩效更新数据库中员工的工资信息,他们可以为绩效低的员工增加工资,反之亦然。
竞争条件的后果
竞争条件漏洞会带来一些严重的后果,破坏安全系统及其功能,例如:
- 竞争条件可能导致共享文件和共享表的 数据丢失和数据损坏。
- 当内核进程受到竞争条件漏洞的影响时,它们可能会无限期地执行,从而导致系统崩溃。
- 在登录会话期间,未经授权的人员可能会访问系统。
- 当多个进程争用使用共享资源时,可能会发生某些进程持有某些资源,同时等待其他资源的情况。这会导致死锁。
防止竞争条件漏洞
竞争条件漏洞会带来严重的后果,降低系统的整体性能并危害系统安全。因此,必须采取适当的保护措施,以尽可能避免这些情况。
一些常用的措施如下所列 −
- 原子操作 − 如果任何操作的指令序列作为一个单元执行,则称为原子操作。原子操作不允许中断,因此可确保多个进程无法同时访问共享资源。
- 同步 − 为了确保任何时候只有一个进程或线程可以访问共享资源,可以使用同步机制,例如锁、信号量、互斥量或监视器。
- 访问限制 − 可以最小化或优化跨越 TOCTOU 的漏洞窗口,以限制访问资源的持续时间。
- 检测措施 − 自动化分析和测试工具有助于定期审查代码以检测竞争条件。
- 维护日志 − 维护正确的系统日志有助于跟踪对共享资源的访问和乱序操作,指示竞争条件。
- Web 应用防火墙 − Web 应用防火墙可防止 Web 攻击,进而防止 TOCTOU 中的漏洞。