形式陈述
从轨迹的集合到轨迹集合的集合
固定轨迹语义 公理库 轨迹与路径语义 Trace semantics · Path semantics · Execution traces 以状态路径和可观察动作轨迹描述有限、无限与最大行为,并说明投影和隐藏会遗忘什么。 的行为域 T r ,系统 M 的全部可观察执行构成 T M ⊆ T r 。普通的轨迹性质 是一个允许轨迹集合 P ⊆ T r ;系统满足它,意味着每一条执行都被允许:
M ⊨ P ⟺ T M ⊆ P . 超性质 (hyperproperty)则是
H ⊆ P ( T r ) , M ⊨ H ⟺ T M ∈ H . 这里有两层集合:T M 的元素是轨迹,H 的元素是整套轨迹集合。超性质因此能够要求同一系统的不同执行彼此相容,例如“公开输入相同时,秘密输入的变化不能改变公开输出”。这种要求必须同时看到多条执行。[1, §2]
每个轨迹性质都可提升成超性质:
[ P ] = { T ⊆ T r : T ⊆ P } . 提升保留了原来的满足关系,但并非每个超性质都来自这样的 P 。规格 公理库 规格 Specification · Formal specification · Behavioral specification 明确允许输入、状态、输出或执行轨迹的数学条件,是正确性与精化的比较基准。 中的行为包含式描述的是这一逐轨迹情形;跨执行合同需要直接约束整个行为集合。
一个确定性非干扰模型
取顺序、确定性、对全部输入正常终止的整数程序;整数按数学整数计算,没有溢出或异常。输入分为公开量 l 与秘密量 h ,程序最后输出一个公开整数 y 。只观察公开输入和这一次最终输出,因而可观察终止轨迹编码为
t = ( in ( l ) , out ( y ) ) . 秘密输入仍然决定程序执行,但不会直接写入公开轨迹。若程序的输出函数为 F ( l , h ) ,则
T F = { ( in ( l ) , out ( F ( l , h ) ) ) : l , h ∈ Z } . 记轨迹中的公开输入、输出分别为 lowIn ( t ) 与 lowOut ( t ) 。定义全称双运行非干扰超性质
NI = { T ⊆ T r : ∀ t 1 , t 2 ∈ T , lowIn ( t 1 ) = lowIn ( t 2 ) ⇒ lowOut ( t 1 ) = lowOut ( t 2 ) } . 对于上述程序,这恰好是
T F ∈ NI ⟺ ∀ l , h 1 , h 2 ∈ Z , F ( l , h 1 ) = F ( l , h 2 ) . 即使不同秘密输入产生同一条公开轨迹、在集合中被合并,这个等价式也成立:每次运行的公开结果都在 T F 中,而其中每条轨迹都由某个输入产生。
直觉
安全性可以取决于两次执行之间的差异
单独看输出 5,无法断言秘密泄漏了。它可能是公开输入要求的结果,也可能编码了秘密。非干扰固定公开输入,改变秘密输入,再比较输出:若观察者能从输出变化辨别秘密变化,程序就违反了这个合同。
“同一输入运行两次得到相同输出”只检验确定性。非干扰的两次运行允许 h 1 ≠ h 2 ,要求相同的只是 l 。秘密也不是完全不能参与计算;它可以出现在内部算式中,只要最后公开结果不随它改变。
为什么不能逐条检查轨迹来表达 NI
取两条公开输入相同、公开输出不同的轨迹 t 1 , t 2 。单元素集合 { t 1 } 与 { t 2 } 都属于 NI ,因为各自内部不存在冲突的两条轨迹;它们的并集却不属于 NI 。
假设存在某个轨迹性质 P ,对所有 T ⊆ T r 都有
T ∈ NI ⟺ T ⊆ P . 两个单元素集合满足 NI,迫使 t 1 , t 2 ∈ P ,于是 { t 1 , t 2 } ⊆ P ,按假设它也应满足 NI,矛盾。问题不是某种单轨迹逻辑还不够强,而是固定的逐轨迹允许集无法表达这项跨轨迹约束。
这个证明比较一般的轨迹集合;其中的单元素集合不必来自一个覆盖全部整数输入域的程序。具体程序 F 的验证仍使用上一节给定的完整 T F 。
例子与边界
秘密参与计算与秘密影响输出
比较两个程序,内部变量 z 不可观察:
text 安全候选 P 泄漏程序 Q
z := l + h y := l + h
y := z - h output y
output y
1 2 3 4
固定 l = 3 ,选择两个秘密输入:
程序
秘密输入 h
中间量 z
公开输出 y
P
2
5
3
P
7
10
3
Q
2
不使用
5
Q
7
不使用
10
对 P ,代数化简给出 F P ( l , h ) = ( l + h ) − h = l ,所以对任意 l , h 1 , h 2 输出都相等。表格展示了一组实例,代数恒等式才覆盖全部输入。对 Q ,表中的两条运行已经构成反例:同一公开输入 3 对应公开输出 5 和 10。
本例观察接口只保留最终 y 。若在赋值后公开 z ,安全候选也会泄漏;若观察运行时间或控制路径,则需要把那些信息加入轨迹重新验证。终止在本模型中已对所有输入作出保证,因此没有留下秘密依赖的终止差异。
有限非确定模型:先保留秘密输入的索引
现在换一个明确有限的模型。公开输入域 L 、秘密域 H 都有限且非空,输出域 Y 有限;程序总是终止,每个 ( l , h ) 对应一个非空有限 完整运行集 Runs ( l , h ) ,且能穷尽枚举,例如有限无环控制图上的程序。运行 ρ = ( l , h , c , y ) 保留输入、完整内部选择记录 c 与最终输出。公开观察仍只有 ( l , y ) ,但规格量词在保留 h 的完整运行域上解释。
定义
Out ( l , h ) = { y : ρ = ( l , h , c , y ) ∈ Runs ( l , h ) } . 允许公开非确定性的一项合同为
(M) ∀ l ∈ L ∀ h 1 , h 2 ∈ H ∀ ρ 1 ∈ Runs ( l , h 1 ) ∃ ρ 2 ∈ Runs ( l , h 2 ) , y 1 = y 2 . 它等价于固定 l 时所有 Out ( l , h ) 相等。若 (M) 成立,任取第一集合的一个输出,选产生它的运行,再取匹配运行,便得到集合包含;交换有序输入对 h 1 , h 2 得到反向包含。反之,若集合相等,y 1 属于第二集合,按定义就有一条输出它的完整运行。这是两个方向都可直接复核的等价证明。
将 ∃ ρ 2 换成 ∀ ρ 2 得到更强的全对相等条件。它推出 (M),因为第二运行集非空;反向不成立。信息流文献也以交替轨迹量词允许选择匹配行为,[1, §2.3; 3, §3] 但这里证明的只是明确规定初始输入与最终输出的有限合同,并未把所有时序版本合并成同一个性质。
四条运行给出匹配,三个结果暴露缺口
取 L = { 0 } 、H = Y = { 0 , 1 } 。程序 P 非确定地选择位 r ,输出 y = r xor h ;Q 在 h = 0 时可输出两个位,在 h = 1 时只输出零。
程序
h
内部选择
y
P
0
r = 0
0
P
0
r = 1
1
P
1
r = 0
1
P
1
r = 1
0
Q
0
选零
0
Q
0
选一
1
Q
1
唯一分支
0
对 P ,两个输出集合都是 { 0 , 1 } 。给定第一条运行的 r 1 , h 1 和目标秘密 h 2 ,取
r 2 = r 1 xor h 1 xor h 2 , 就有 r 2 xor h 2 = r 1 xor h 1 ,构成显式匹配函数。但它不满足全对相等:即使 h 1 = h 2 = 0 ,r 1 = 0 , r 2 = 1 也产生不同输出。
对 Q ,Out ( 0 , 0 ) = { 0 , 1 } 而 Out ( 0 , 1 ) = { 0 } 。取第一条运行 h 1 = 0 , y 1 = 1 ,目标秘密 h 2 = 1 没有匹配。这次不能靠“另一条运行输出不同”就断言无匹配;关键是已经穷尽了目标秘密下的全部运行。
图片加载失败 全称运行需要存在一个匹配见证 若提前删除秘密标签,把两程序都压成公开轨迹集合,两者恰好都是 { ( 0 , 0 ) , ( 0 , 1 ) } ,却只有 P 满足 (M)。所以不存在仅查看这个已遗忘 h 的集合便区分二者的合同;必须先在完整运行集合上陈述 (M),再通过公开投影定义匹配关系。此处与前面的确定性 NI 模型保留信息的需求不同。
推论与应用
自组合:把双运行关系变成单程序断言
复制程序 P ,把它读写的全部变量换成新鲜变量,得到 P ′ :l , h , z , y 分别变成 l ′ , h ′ , z ′ , y ′ 。两份存储完全不相交,再顺序执行 P ; P ′ 。因为所有输入都正常终止,每个组合执行都能完成两份计算。
把输出视为终态变量 y ,使用Hoare 三元组 公理库 Hoare 三元组 Hoare triple 断言若前置条件成立且程序终止,则后置条件成立的 {P}C{Q} 形式。 检验
{ l = l ′ } P ; P ′ { y = y ′ } . 前置条件不要求 h = h ′ ,否则只会比较相同输入,失去检测秘密影响的能力。完全换新也包括输入变量和临时变量,避免第二份程序覆盖第一份所依赖的状态。[2]
在此模型中,三元组有效与 P 满足 NI 等价。证明的关键是组合运行与两次独立运行的对应:任取原程序的两组输入,可把它们放在两份不相交的初始存储里;第一份只读写未加撇变量,第二份只读写加撇变量,所以终态恰好同时保存这两次运行的输出。
从三元组到 NI。 任取 l 相同、h 可以不同的两次原运行,把初始存储合并。它满足 l = l ′ ,组合执行后由有效三元组得 y = y ′ ,因此原来的两个输出相同。
从 NI 到三元组。 任取满足 l = l ′ 的组合初态。其两个存储分量分别决定原程序的两次运行;由 NI,它们的输出相同。第二份运行不改变第一份的 y ,所以组合终态满足 y = y ′ 。这覆盖了所有满足前置条件的初态,三元组有效。
全终止假设在此承担实际工作:若第一份可能发散,串行组合可能根本执行不到第二份;部分正确性的三元组也可能因没有终态而真空成立。当前等价证明因此是在明确的总程序模型上进行的。
对安全候选,执行结果分别为 y = l 与 y ′ = l ′ ,前置条件直接推出后置条件。对泄漏程序,取 l = l ′ = 3 , h = 2 , h ′ = 7 ,组合终态为 y = 5 , y ′ = 10 ,后置条件失败。自组合使跨执行问题落到已有的程序断言验证工具上。
为非确定匹配建立有限证书
穷尽枚举每个 Runs ( l , h ) ,构造表
一 条 输 出 的 完 整 运 行 W l , h : y ⟼ 一条输出 y 的完整运行 . 每个键保留一条见证即可;但键集合必须来自完整枚举。对每个 l 选一个基准秘密 h 0 ,逐一比较所有表与 W l , h 0 的键集合。全部相等便接受;否则,从两个不等集合的差集中选一个输出,并把有该键的一侧作为 h 1 ,缺键的一侧作为 h 2 ,输出 ( l , h 1 , h 2 , ρ 1 ) 与第二侧的完整枚举结果。
接受可靠性来自:任意第一运行的 y 1 都在所有第二侧表中,查表就构造 ρ 2 。完整性来自:若 (M) 成立,已证明所有键集合相等,检查不会拒绝。拒绝可靠性则使用目标表的穷尽性;它证明没有可能被遗漏的匹配运行。若总运行数为 N 、输入对数为 K ,输出有固定有限编号,则用 K | Y | 个槽和 O ( N + K | Y | ) 时间即可构表并比较,另计存储或验证完整运行记录的成本。
普通自组合的全称 Hoare 三元组会检查所有独立选择对,因此验证的是全对相等;它会拒绝上例 P 。验证 (M) 必须允许第二侧根据第一侧的运行挑选见证。这里的存在见证可以依赖整条已完成运行,尚未要求一个只能看到前缀的在线策略,也没有加入公平性或任何概率分布。相同可能输出不意味着相同输出概率。
两条有限坏观察与 2-safety
超安全性使用有限组有限前缀见证违反。形式化地,令 U 是有限轨迹前缀的集合,写
是 的 前 缀 U ⪯ T ⟺ ∀ u ∈ U ∃ t ∈ T : u 是 t 的前缀 . 超性质 H 是 k -safety ,若每个 T ∉ H 都存在有限前缀集合 U ,使
| U | ≤ k , U ⪯ T , ∀ T ′ ⊆ T r , U ⪯ T ′ ⇒ T ′ ∉ H . 这一定义要求至多 k 条有限观察,而且无论怎样延长、怎样添加其他轨迹,违反都无法修复。[1, §§3–4]
为与通常基于无限轨迹的表述一致,把本页每条终止轨迹接上无限终态停顿,公开输入和已经输出的值保持不变。这是完整有限执行的编码,不把尚未输出的普通前缀误当作终止结果。
若 T 违反 NI,必有两条轨迹的公开输入相同、公开输出不同。分别截取到最终输出已经出现的有限前缀,组成 U ;任何延长都保留两个冲突输出,任何包含这些延长的执行集仍违反 NI。因此该 NI 是 2-safety。前面的单元素集合论证又说明,一个单轨迹坏观察不足以表达这种冲突。
这个 2-safety 结论针对全称 NI。它不直接适用于 (M):在四条异或运行中删去 h = 1 , y = 1 的见证,就得到仍对每个输入有运行、却缺少匹配的集合;把该见证加回来又能修复。只看到两条不相等的输出不能排除未来观察到匹配运行。有限完整枚举能证实“没有”,依赖的是模型已被穷尽,不能与任意扩展下都不可修复的正观察坏前缀混淆。[1, §3]
这种有限见证解释了为什么产品程序适合搜索全称 NI 的泄漏反例:验证器寻找的是两份执行共同到达 y ≠ y ′ 的状态。跨版本等价、关系化程序验证等也采用类似双运行思想,但应按各自的输入关系、输出关系和执行模型重新给出断言。
参考资料
[1] Michael R. Clarkson and Fred B. Schneider, “Hyperproperties,” Journal of Computer Security 18(6), 2010, pp. 1157–1210,作者全文 ,§2 给出两层集合与信息流性质,§§3–4 定义有限坏观察、k -safety 并讨论自组合。
[2] Gilles Barthe, Pedro R. D’Argenio and Tamara Rezk, “Secure Information Flow by Self-Composition,” CSFW 2004 , pp. 100–114,作者上传全文 ,讨论输入—输出非干扰与变量不相交的自组合。
[3] Michael R. Clarkson et al., “Temporal Logics for Hyperproperties” , POST 2014 , pp. 265–284,§§2–3:轨迹量词语义及 observational determinism 与 generalized noninterference 的量词区别。