生成钩子放置方案以实施预期的访问控制策略
1. 授权钩子放置问题
授权钩子放置主要涉及两个步骤:
- 找出程序中的安全敏感操作(SSOs)。
- 放置钩子以满足一组需求。
1.1 识别安全敏感操作
通过静态分析自动识别程序中的安全敏感操作集 O。每个 SSO 用变量 v 以及对该变量的一组读写结构成员访问来表示。例如,在
CHANGEWINDOWPROPERTY
函数中,最后两条语句产生一个安全敏感操作
pProp:[write(data), write(size)]
。
程序中一个 SSO 可能有多个实例,每个实例用元组
(o, l)
表示,其中 o 是 SSO,l 是代码中该实例出现的位置(语句)。设 OL 是程序中所有 SSO 的所有实例的集合,目标是放置授权钩子来调解 OL 中的所有元素。
定义 1:授权钩子是一个元组
(Oh, lh)
,其中 lh 是包含钩子的语句,Oh ⊆ OL 是由该钩子调解的安全敏感操作实例的集合。一组授权钩子称为授权钩子放置。
采用控制依赖图(CDG)来表示程序语句和钩子。CDG = (L, E) 由一组程序语句 L 和边 E 组成,边表示语句之间的控制依赖关系。这有助于计算授权钩子放置,确保 OL 中的每个操作实例至少包含在一个授权钩子 Oh 中。
1.2 合并钩子放置
自动化技术初始放置的钩子通常是细粒度的,即在每个识别出的安全敏感操作实例处放置。可以利用程序中要实施的访问控制策略的约束来合并授权钩子,以实现合适的钩子放置粒度。
设 U 是给定程序的假设访问控制策略 M 的所有主体的集合,
Allowed
函数将 O 中的每个安全敏感操作映射到根据策略 M 被允许执行该操作的主体 U。有两种与授权钩子放置相关的情况:
- 不变式 I:对于任意两个操作 o1 和 o2,如果访问控制策略 M 允许
Allowed(o1) = Allowed(o2)
,则 o1 和 o2 在授权方面是等价的。这意味着调解 o1 并在代码中支配 o2 的任何钩子会自动授权 o2,反之亦然。
- 不变式 II:对于两个操作 o1 和 o2,如果访问控制策略 M 允许
Allowed(o1) ⊂ Allowed(o2)
,则操作 o1 在授权方面“包含”o2。这意味着调解 o1 并支配 o2 的钩子也可以调解 o2,但反之不行。
基于上述观察,为了合并钩子,需要在 O 的元素之间施加等价和偏序关系。因此,定义一组授权约束如下:
定义 2:一组授权约束 P 是程序中 SSO 之间关系的一对 (S, Q),其中 Q 表示等价关系,S 表示包含关系。
等价关系 Q 会对安全敏感操作集 O 进行分区,设 OQ 是由 Q 产生的分区集。包含关系 S 在 OQ 的元素之间施加偏序。可以使用这两种关系将并行代码路径上的钩子合并到支配程序位置(钩子提升操作),或消除后支配程序位置上的冗余钩子(钩子移除操作)。
2. 设计
该方法有两个主要输入:
- 程序中 SSO 的集合 O 及其实例 OL。
- 程序的控制依赖图 CDG。
2.1 生成默认放置
使用 O、OL 和 CDG 生成默认放置。由于 OL 中的元素与代码位置相关,而 CDG 中的节点有位置信息,因此可以创建一个从 CDG 中的每个节点 si 到 OL 中与 si 位于同一位置的 SSO 实例集合的映射 C2O。默认放置 D 在每个
C2O[si] ≠ ∅
的节点 si 处放置一个钩子。
2.2 生成受约束的钩子放置
如果已有一组授权约束 Pi,该工具的第二步能够自动生成一个最小放置 Ei,该放置可以实施满足这些约束的任何访问控制策略。该方法使用等价约束进行提升,使用包含约束进行移除,从而最小化钩子的数量。
2.2.1 推导受约束的放置
给定默认放置 D 和授权约束集 P,系统可以推导出一个候选受约束放置 E,该放置满足完全调解和最小特权,且钩子数量最少。P 中的包含关系 S 和等价关系 Q 使我们能够对 D 进行两种不同的钩子细化以推导出 E。
提升(Hoisting) :目标是合并用于调解等价操作实例(出现在控制语句的所有分支上的兄弟实例)的钩子。根据 Q 将钩子放置提升到 CDG 中更高的位置。
算法 1 展示了如何进行提升:
top′ = T opoSortRev(CDG)
while top′ ̸= ∅do
si = top′.pop()
if isControl(si) then
α[si] = C2O[si] ∪Q
j {α[sj] | (si, sj) ∈CDG}
else
α[si] = C2O[si] ∪
j{α[sj] | (si, sj) ∈CDG}
end if
end while
该算法以 CDG 和 C2O 映射为输入,累加器 α 通过将 si 的 C2O 与子节点的 α 映射组合来收集每个节点 si 处的 SSO 集合。算法按反向拓扑排序顺序遍历 CDG,并在 CDG 中的每个节点处做出提升决策。将 CDG 中的节点分为控制节点和非控制节点,在控制节点处执行交集操作
Q
以合并等价的 SSO,在非控制节点处使用并集操作累积 SSO。
移除(Removal) :目标是使用 S 从 CDG 中消除多余的钩子。如果执行 SSO o1 的节点 s1 支配执行 SSO o2 的节点 s2,并且根据 P,o1 包含或等价于 o2,则 s1 处调解 o1 的钩子会自动检查允许 s2 处 o2 所需的权限,因此可以安全地移除 s2 处的钩子。
算法 2 展示了如何执行移除操作:
top = T opoSort(CDG)
while top ̸= ∅do
si = top.pop()
OD = QS
j
{φ[sj] | (sj, si) ∈CDG}
φ[si] = α[si] ∪OD
OR = ∅
for all om ∈α[si] do
if ∃on ∈OD, (on S om) or (on Q om) then
OR = OR ∪{om}
end if
end for
β[si] = α[si] −OR
end while
该算法以 CDG 和提升阶段计算的映射 α 为输入,按拓扑排序顺序(自上而下)遍历 CDG,并在每个节点 si 处根据支配 si 的所有钩子检查的操作集做出移除决策。
2.2.2 帮助程序员生成放置
程序员无需手动生成细粒度的授权约束集,只需指定高级安全目标。例如,若要实施多级安全(MLS)策略,在 MLS 中,主体被分配对单个对象的读写访问权限。在该方法中,程序对象由程序操作中的变量引用,因此允许主体读取变量的一个字段的任何 MLS 策略也允许该主体读取该变量的任何其他字段;写操作同理。这意味着变量的所有读(写)类访问可以视为等价。
程序员可以创建一组这样的规则来编码安全策略(称为约束选择器),作为放置方法的输入,替代完整的授权约束集。
3. 评估
使用 CIL 程序分析框架实现该方法,所有代码用 OCaml 编写。评估的目标是回答两个问题:
- 该方法生成的放置是否更接近手动放置的钩子?
- 该方法是否减少了程序员放置授权钩子所需的工作量?
3.1 评估钩子减少情况
| 程序 | LOC | MANUAL | DEFAULT | MLS - Total | %-Reduction | %-Difference |
|---|---|---|---|---|---|---|
| X Server 1.13 | 28K | 207 | 420 | 296 | 30 | 58 |
| Postgres 9.1.9 | 49K | 243 | 360 | 326 | 9 | 29 |
| Linux VFS 2.6.38.8 | 40K | 55 | 139 | 135 | 2 | 5 |
| Memcached | 8K | 0 | 32 | 30 | 6 | n/a |
从表中可以看出,使用约束选择器最多可减少 30% 的钩子数量,并且最多可将自动放置与手动放置之间的差距缩小 58%。
3.2 评估程序员工作量
定义程序员工作量为程序员必须手动检查的授权约束的搜索空间。通过计算默认放置后工具使用约束选择器自动做出的提升和移除选择的数量来衡量程序员工作量的减少。
| 程序 | DEFAULT - REMOVE | DEFAULT - HOIST | MLS - REMOVE | MLS - HOIST |
|---|---|---|---|---|
| X Server 1.13 | 237 | 55 | 113 | 10 |
| Postgres 9.1.9 | 208 | 42 | 146 | 21 |
| Linux VFS 2.6.38.8 | 53 | 4 | 49 | 3 |
| Memcached | 8 | 1 | 6 | 0 |
例如,对于 X Server,默认放置后程序员有 237 个移除选择和 55 个提升选择,使用 MLS 约束选择器后,分别剩下 113 个移除选择和 10 个提升选择。这表明使用约束选择器减少了程序员为生成所需放置而必须做出的选择数量。
下面是整个流程的 mermaid 流程图:
graph TD;
A[开始] --> B[识别安全敏感操作];
B --> C[生成默认放置];
C --> D[生成受约束的放置];
D --> E[提升操作];
D --> F[移除操作];
E --> G[最终受约束放置];
F --> G;
G --> H[评估钩子减少情况];
G --> I[评估程序员工作量];
H --> J[结束];
I --> J;
综上所述,该方法通过使用授权约束和约束选择器,在减少钩子数量和程序员工作量方面取得了良好的效果。
4. 技术细节深入剖析
4.1 控制依赖图(CDG)的作用
控制依赖图(CDG)在整个授权钩子放置过程中起着核心作用。它由一组程序语句 L 和边 E 构成,边代表语句之间的控制依赖关系。在识别安全敏感操作时,CDG 帮助我们了解每个语句的执行依赖情况,从而准确找出安全敏感操作实例。在生成默认放置和受约束放置时,CDG 为钩子的提升和移除提供了重要的拓扑信息。
具体来说,在钩子提升操作中,CDG 用于判断哪些节点可以作为提升的目标位置。如果一个节点的所有路径上的安全敏感操作都属于同一个等价类,那么就可以将这些路径上的钩子提升到该节点。在钩子移除操作中,CDG 用于确定节点之间的支配关系,从而判断哪些钩子是冗余的可以被移除。
4.2 授权约束的数学原理
授权约束中的等价关系 Q 和包含关系 S 具有明确的数学意义。等价关系 Q 对安全敏感操作集 O 进行分区,形成分区集 OQ。这意味着在同一分区内的安全敏感操作在授权方面是等价的,可以用同一个钩子进行调解。包含关系 S 在 OQ 的元素之间施加偏序,使得我们可以根据操作之间的包含关系来优化钩子的放置。
例如,当操作 o1 包含操作 o2 时,调解 o1 的钩子可以同时调解 o2,从而减少钩子的数量。这种数学原理为我们提供了一种系统的方法来合并和优化钩子放置,确保在满足完全调解和最小特权的前提下,使用最少的钩子。
4.3 算法的复杂度分析
- 提升算法(算法 1) :提升算法按反向拓扑排序顺序遍历 CDG,时间复杂度主要取决于 CDG 中节点的数量和边的数量。假设 CDG 中有 n 个节点和 m 条边,算法的时间复杂度为 O(n + m)。在每个节点处,需要进行集合的交集和并集操作,这些操作的时间复杂度与集合的大小有关。
- 移除算法(算法 2) :移除算法按拓扑排序顺序遍历 CDG,时间复杂度同样为 O(n + m)。在每个节点处,需要根据支配关系计算相关操作集,然后进行移除决策,这些操作的时间复杂度也与集合的大小有关。
5. 实际应用案例分析
5.1 X Server 案例
在 X Server 1.13 中,默认放置有 420 个钩子,而手动放置有 207 个钩子。使用 MLS 约束选择器后,钩子数量减少到 296 个,减少了 30%,并且将自动放置与手动放置之间的差距缩小了 58%。这表明该方法在 X Server 中能够有效地减少钩子数量,同时更接近手动放置的效果。
从程序员工作量来看,默认放置后有 237 个移除选择和 55 个提升选择,使用约束选择器后,分别剩下 113 个移除选择和 10 个提升选择。这大大减少了程序员需要做出的决策数量,提高了开发效率。
5.2 Postgres 案例
Postgres 9.1.9 中,默认放置有 360 个钩子,手动放置有 243 个钩子。使用 MLS 约束选择器后,钩子数量减少到 326 个,减少了 9%,将差距缩小了 29%。虽然减少的比例相对较小,但仍然表明该方法在 Postgres 中具有一定的优化效果。
在程序员工作量方面,默认放置后的 208 个移除选择和 42 个提升选择,使用约束选择器后分别变为 146 个移除选择和 21 个提升选择,同样减少了程序员的决策负担。
6. 总结与展望
6.1 总结
本文介绍的生成钩子放置方案以实施预期的访问控制策略的方法,通过识别安全敏感操作、生成默认放置和受约束放置,并利用授权约束和约束选择器,有效地减少了钩子数量,同时降低了程序员放置授权钩子的工作量。实验结果表明,该方法在多个实际程序中都取得了良好的效果,能够更接近手动放置的效果,提高开发效率。
6.2 展望
未来可以进一步优化该方法,例如引入更精确的别名分析和路径敏感分析,以减少冗余钩子的产生。同时,可以探索更多类型的约束选择器,以适应不同的安全策略和应用场景。此外,还可以将该方法集成到开发工具中,为程序员提供更便捷的钩子放置解决方案。
以下是一个总结性的表格,展示不同程序在使用该方法前后的主要指标变化:
| 程序 | 默认钩子数 | 手动钩子数 | 使用约束选择器后钩子数 | 钩子减少比例 | 差距缩小比例 | 默认移除选择 | 默认提升选择 | 使用选择器后移除选择 | 使用选择器后提升选择 |
| — | — | — | — | — | — | — | — | — | — |
| X Server 1.13 | 420 | 207 | 296 | 30% | 58% | 237 | 55 | 113 | 10 |
| Postgres 9.1.9 | 360 | 243 | 326 | 9% | 29% | 208 | 42 | 146 | 21 |
| Linux VFS 2.6.38.8 | 139 | 55 | 135 | 2% | 5% | 53 | 4 | 49 | 3 |
| Memcached | 32 | 0 | 30 | 6% | n/a | 8 | 1 | 6 | 0 |
下面是一个 mermaid 流程图,展示未来优化的可能方向:
graph LR;
A[现有方法] --> B[引入精确别名分析];
A --> C[引入路径敏感分析];
A --> D[探索更多约束选择器];
A --> E[集成到开发工具];
B --> F[减少冗余钩子];
C --> F;
D --> G[适应更多场景];
E --> H[提供便捷解决方案];
通过以上的分析和总结,我们可以看到该方法在访问控制策略实施方面具有很大的潜力,未来的优化方向将进一步提升其性能和实用性。
超级会员免费看
48

被折叠的 条评论
为什么被折叠?



