Birds of a Feather Flock Together: How Set Bias Helps to Deanonymize You via Revealed Intersection Sizes("物以类聚:集合偏差如何帮助去匿名化——通过揭示交集大小)
Xiaojie Guo, Ye Han, Zheli Liu, Ding Wang, Yan Jia, Jin Li
摘要
安全的两方协议,用于计算与交集相关的统计信息,受到了工业界的广泛关注。这些协议使得两个组织能够共同计算一个函数(例如计数和求和),而无需明确揭示交集。然而,大多数这类协议最终会揭示两个集合的交集大小。在这项工作中,我们关注的是攻击者能够利用揭示的交集大小,推断一个组织集合中一些元素的成员资格的程度。甚至将一个元素的成员资格向另一个组织披露,也可能违反隐私法规(例如GDPR),因为这样的元素通常用于在两个组织之间识别一个人。我们是第一个研究在揭示交集大小的协议中集合成员泄漏的团队。我们提出了两种攻击,即基线攻击和特征感知攻击,以在现实场景中评估这种泄漏。特别是,我们的特征感知攻击利用了现实中的集合偏差,即具有特定特征的元素更有可能是一个组织集合的成员。结果显示,我们的两种攻击可以在三种现实场景中平均推断出2.0∼72.7个集合成员。如果集合偏差不弱,特征感知攻击将优于基线攻击。例如,在COVID-19接触追踪中,特征感知攻击在135个协议调用中可以找到25.9个感染患者的标记,比基线攻击多出1.5倍。我们讨论了这类结果可能造成的负面实际影响,并提出了可能的对抗我们攻击的防御措施。
1 引言
涉及两个组织集合交集的安全双方计算引起了行业的广泛关注。一个知名的协议是私有集合交集基数(PSI-CA),该协议向一个组织返回交集的大小,而不向任何一方透露其他信息。该协议在追踪社交网络和关联规则挖掘等领域得到了广泛应用。另一个流行的协议是带基数的私有交集求和(PSI-SUM),该协议汇总了一个组织持有的与交集中索引相关联的值。PSI-SUM最初是在Google的工作中提出的,用于衡量由于广告转化而产生的收入。最近,Facebook提出了Private-ID,这是一种用于在线广告中隐私保护测量转化提升[13]的协议。
尽管这些安全计算协议永远不会向任何一方透露两个组织集合的交集,但它们会揭示两个集合的交集大小。只要在两个组织之间反复调用这种揭示交集大小的协议,攻击就可以利用揭示的交集大小测试某些元素是否在交集中。在这种攻击中,一个组织(充当攻击者)可以在每次与另一个组织(充当受害者)的协议调用中输入一个单元素集,并观察结果的交集大小。如果这个大小等于一,那么涉及的元素就在交集中;否则,不在。我们强调攻击者可以在协议调用中使用其目标元素,而这些元素的成员资格基本上会透露它们属于受害者集合的成员资格。换句话说,这种攻击允许攻击者推断目标元素属于受害者集合的成员资格。如果受害者集合是静态的,N次协议调用可以泄露N个元素的集合成员资格。
我们的研究超越了这种攻击,并启动了有关由揭示的交集大小导致的集合成员泄漏的首次研究。这种泄漏对于所有在不透露关于交集的任何信息的情况下计算与交集相关的统计量的协议都是一个普遍问题,许多现实世界的系统使用这些协议来尽可能隐藏有关受害者集的信息免受攻击者的侵害。在这些系统中,不允许透露受害者集中的任何元素。然而,本研究表明,对于具有这种安全要求的系统来说,使用揭示交集大小的协议可能存在风险。
本研究始于设计两种集合成员推断攻击,以测试目标元素是否在受害者集中。首先,我们展示,即使攻击者什么都不知道,只知道交集的大小,也存在一种基线攻击,导致比玩具攻击更严重的集合成员泄漏。其次,我们考虑了一个现实情况,即受害者集在特定特征方面存在偏差。粗略地说,这种集合偏差意味着具有这些特征的元素更有可能包含在受害者集中。例如,在卫生局的COVID-19患者集中存在这种集合偏差。该集合被认为在人的发热特征方面存在偏差,因为发热是COVID-19的常见症状。我们提出了针对这种有偏集合的特征感知攻击。其直觉是,如果攻击者知道目标元素的与偏差相关的特征,它可以利用这些特征来提高推断效率。
本研究进一步评估了在三种情景下,由我们的两种攻击及玩具攻击导致的集合成员泄露问题:(i) 基于PSI-CA的COVID-19接触追踪,(ii) 从PSI-SUM测量广告转化收入,(iii) 通过PrivateID测量广告转化提升。我们的测量显示,情景(i)中的集合偏差是不可忽视的,而其他两个情景中的偏差较弱。每个情景都允许多次调用其揭示交集大小的协议,其中受害者的集合是动态的。
在情景(i)中,我们的基线(特征感知)攻击能够识别出3.7 ∼ 7.2倍(5.2 ∼ 9.0倍)比玩具攻击更多的集合成员。特别是,我们的攻击需要远少于玩具攻击的协议调用次数来找到同样多的集合成员。平均而言,当最初有14/28/56个集合成员在512/1024/2048个目标元素中时,我们的基线(特征感知)攻击大约通过70/135/135次协议调用就能找到12.0/18.1/17.6(13.4/22.4/25.9)个集合成员。在情景(ii)和(iii)中,玩具攻击可能无法找到任何集合成员,但我们的攻击仍然有效。例如,在情景(ii)中,当最初有2/4/7个集合成员在512/1024/2048个目标元素中时,我们的基线(特征感知)攻击大约通过15/33/60次协议调用能找到2.0/4.0/7.5(2.0/4.2/7.5)个集合成员。由于受害者的集合随时间变化,我们的攻击在这一情景中可以找到与最初不同的一些集合成员。上述结果表明,我们的攻击可以帮助攻击者在三种情景中猜测受害者集合中的元素。
本工作最后讨论了我们的结果在现实世界中的含义以及一些可能的防御措施。值得注意的是,在考虑的情景中,攻击者可以将其选择的元素与现实世界中的人联系起来。因此,这些元素的集合成员泄露表明了与受害者交互的联系人,进而他们的相关元素被记录在受害者的集合中。这种个人信息应仅为交互组织所知,而这些信息被泄露给另一个未经授权的组织违反了隐私法规(例如,GDPR和HIPPA)。我们还讨论了这种交互泄露在三种情景中可能产生的负面后果。例如,结果表明,结合我们的攻击和链接攻击,可以推断出由卫生局记录的COVID-19患者。这种推断可能影响这些患者的日常生活。
2 背景
2.1 交集大小揭示协议
存在许多安全的双方协议,可以计算两方集合的交集函数,而不透露关于交集的任何信息,除了其大小。
-
PSI-CA:该协议是一个黑盒,从一方接收集合 X X X,从另一方接收集合 Y Y Y。它在内部计算交集大小 ∣ X ∩ Y ∣ |X ∩Y| ∣X∩Y∣ 并将此值发送给两方中的一方。
-
PSI-SUM :该协议是一个黑盒,从一方接收集合 X X X,从另一方接收索引-值对的表 ( y i , v i ) {(y_i, v_i)} (yi,vi),它在内部聚合与交集 X ∩ Y X ∩ Y X∩Y中的索引相关联的值,并得到总和 ∑ y i ∈ X ∩ Y v i \sum_{y_i∈X∩Y} v_i ∑yi∈X∩Yvi。然后,该协议将此总和和交集大小 ∣ X ∩ Y ∣ |X ∩ Y| ∣X∩Y∣发送给输入表的一方。
-
Private-ID:该协议是一个黑盒,从一方接收集合 X X X,从另一方接收集合 Y Y Y。它内部为联合 X ∪ Y X ∪ Y X∪Y 中的所有元素分配随机标签,以便两方对于交集 X ∩ Y X ∩Y X∩Y 中的每个元素都将获得相同的标签。然后,该协议将这些标签和交集大小 ∣ X ∩ Y ∣ |X ∩Y| ∣X∩Y∣ 发送给双方。这些标签可用于后续安全计算交集 X ∩ Y X ∩Y X∩Y 的许多统计信息。
-
Circuit-based PSI:该协议是一个黑盒,从一方接收表 ( x i , u i ) {(x_i, u_i)} (xi,ui),从另一方接收表 ( y i , v i ) {(y_i, v_i)} (yi,vi)。基于电路的PSI 可以计算由交集 X ∩ Y X ∩ Y X∩Y 中的元素索引的两方值的任何函数。可以认为基于电路的PSI 是计算与交集相关的统计信息的最终解决方案。实现了基于电路的PSI 协议,并向两方透露交集大小 ∣ X ∩ Y ∣ |X ∩Y| ∣X∩Y∣ 以提高协议效率。
集合成员推断问题:对于接收来自揭示交集大小的协议的一方,这个大小衡量了其集合与另一方集合之间的相似性。由于该方可以选择发送到协议的集合,它可以以其希望的方式测量另一方的集合。一个有趣的问题是,当一方拥有许多目标元素时,是否可以利用这种测量能力确定这些元素是否属于另一方的集合。
2.2 威胁模型
攻击者的能力:攻击者具有以下能力:
- 攻击者是交集大小显露协议的一方。在每次协议调用中,攻击者可以选择其输入并了解由该输入和另一方集合导致的交集大小。在此,另一方是受害者,其集合可以是动态的。
- 攻击者被允许重复使用相同的受害者调用协议。
攻击者的背景知识:我们考虑以下两种背景知识的攻击者:
- 基线攻击者:该攻击者对受害者的集合没有任何背景知识。我们使用该攻击者的性能来衡量由交集大小显露协议导致的最小集合成员泄露。
- 特征感知攻击者:该攻击者知道某些特征与受害者集合中的偏差相关。换句话说,攻击者知道受害者的集合倾向于包含具有特定特征的元素。这是关于受害者集合中偏差的背景知识。
攻击者的目标
攻击者有许多目标元素,并对这些元素是否属于受害者的集合感兴趣。如果这个集合随时间变化,攻击者将考虑目标元素的历史集合成员资格,这表示目标元素是否出现在受害者集合的任何快照中,从攻击开始到结束。
3 集合成员推断攻击
3.1 基线攻击
基线攻击者采用一种类似二分搜索的策略。首先构建这样一棵二叉树,其中(i)每个节点存储一个非空集合,(ii)根节点存储目标元素的集合,(iii)非叶节点中存储的集合将被分为两个非空且不相交的子集,这两个子集将分别存储在非叶节点的两个子节点中。
对于二叉树T的节点v,令 T v ∈ X T_v \in X Tv∈X 表示节点v中存储的集合,leftChild(v)(rightChild(v))表示v的左(右)子节点。我们的基线攻击按照Algorithm 1中的蓝图进行,并使用Algorithm 2作为子例程来构建二叉树。
Algorithm 2: 基线攻击者的buildTree算法输入:一个集合X。忽略参数BK。
输出:一棵二叉树T。1. 初始化T,包含一个单独的节点root,该节点存储集合X。
2. 通过递归将存储的集合分割成两个非空且不相交的子集,构建一棵平衡的二叉树T。
3. 返回T。。
Algorithm 2 举例:
假设广告公司想要在某一城市的特定区域中进行广告投放,并希望了解哪些年龄段对他们的广告产生了转化。为简化问题,我们将用户按照年龄进行分类,每个用户由其年龄代表。我们的目标是使用集合成员推断攻击构建一棵平衡的二叉树,从而推断出对广告产生转化的年龄段。
- 初始化: 初始时,我们有一个包含该城市所有年龄段的用户集合X。算法初始化一棵二叉树,根节点表示整个年龄段集合。
- 递归划分: 通过递归地将年龄段集合划分为两个非空且不相交的子集,构建平衡的二叉树。例如,我们可以选择按照年龄中位数来划分。假设初始年龄段为20到60岁,我们选择将其划分为两个子集:20到40岁和40到60岁。这两个子集分别成为根节点的左右子节点。
- 继续划分: 针对每个非叶子节点,我们重复递归地划分其存储的年龄段集合(按照年龄中位数来划分),直到达到某个终止条件。每一步的划分都确保子集的平衡性,以保持二叉树的平衡性。
- 构建平衡的二叉树: 通过反复划分和构建,我们最终得到一棵平衡的二叉树,其中每个节点存储一个年龄段集合。叶子节点表示最小的年龄段,即单个年龄。
为了推断目标元素的集合成员资格,攻击者对排队的子树运行深度优先搜索(DFS)(队列最初包含构建的二叉树)。在每次DFS中,攻击者(i)遍历从队列弹出的子树,(ii)与受害者调用协议以接收有关访问过的每个节点中存储的集合的交集大小,(iii)在存储集合大小等于接收到的交集大小的节点处终止。在此搜索期间未访问的子树被推入队列以供将来的DFS(第16和19行)。最后,攻击者清空队列并找到包含受害者也持有的目标元素的所有子集。同时,攻击者可以看到其他目标元素是非成员。
Algorithm 1: Blueprint of set membership inferenceInput: A set X of target elements, background knowledge
BK, an algorithm buildTree.Output: A set membership predicate σ such that, for each
xi ∈ X, σ(xi) = 1 if xi is in the victim’s set; otherwise σ(xi) = 0.1 Initialize Z ← ∅.
2 Input X to the protocol and get an intersection size m.
3 T ← buildTree(X,BK). // Build a binary tree based on the
attacker’s background knowledge
4 forest ← {(m/|X|,(m,T.root))}. // A priority queue of
(priority, subtree-info) tuples
5 while forest is not empty do
6 (mnode,node) ← forest.pop().
7 while 0 < mnode < |Tnode| do
8 L ← leftChild(node), R ← rightChild(node).
9 if TR contains more elements than TL then
10 Input TL to the protocol and get an intersection size mL.
11 mR ← mnode −mL.
12 else
13 Input TR to the protocol and get an intersection size mR.
14 mL ← mnode −mR.
15 if mR/|TR| > mL/|TL| then
16 forest.push((mL/|TL|,(mL,L))).
17 node ← R, mnode ← mR. // Goto right child
18 else
19 forest.push((mR/|TR|,(mR,R))).
20 node ← L, mnode ← mL. // Goto left child
21 if mnode > 0 then Z ← Z ∪Tnode.
22 Let σ be such a predicate that σ(xi) = 1 iff xi ∈ X ∩Z.
23 return σ.
该算法的目标是通过构建一个二叉树,利用协议和交集大小的信息来推断目标元素是否属于受害者的集合。算法维护一个优先级队列,其中包含了以交集大小为优先级的子树信息。通过迭代地从队列中弹出子树并进行协议调用,算法构建了一颗二叉树,最终得到一个集合成员谓词σ,用于确定每个目标元素是否属于受害者的集合。
剩下的问题是基线攻击者如何划分存储在非叶节点中的集合。回想一下,对于基线攻击者,每个目标元素成为集合成员的概率相同。对于这个攻击者来说,最好是随机均匀地划分集合并最终构建一棵平衡的二叉树。这种做法确保DFS路径的期望长度最小,或者说期望的协议调用次数最小。
我们的基线攻击比玩具攻击更高效,这归功于类似二分搜索的策略。假设受害者的集合Y是静态的,并且攻击者已构建了一个二进制树T。我们的第一个观察是对于树T的任何非叶节点v,以下等式成立:
∣ T v ∩ Y ∣ = ∣ T leftChild ( v ) ∩ Y ∣ + ∣ T rightChild ( v ) ∩ Y ∣ . |T_v \cap Y| = |T_{\text{leftChild}(v)} \cap Y| + |T_{\text{rightChild}(v)} \cap Y|. ∣Tv∩Y∣=∣TleftChild(v)∩Y∣+∣TrightChild(v)∩Y∣.
通过这个等式,如果攻击者已经学到了父节点的大小(例如, ∣ T v ∩ Y ∣ |T_v \cap Y| ∣Tv∩Y∣)和另一个子节点的大小(例如, ∣ T leftChild ( v ) ∩ Y ∣ |T_{\text{leftChild}(v)} \cap Y| ∣TleftChild(v)∩Y∣),则攻击者可以局部确定一个子节点的交集大小(例如, ∣ T rightChild ( v ) ∩ Y ∣ |T_{\text{rightChild}(v)} \cap Y| ∣TrightChild(v)∩Y∣)。因此,攻击者可以避免对那些可以在本地确定的交集大小进行徒劳的调用。在我们的实现中,攻击者利用这一性质来维护子树队列,其中每个推送的子树的根的交集大小(除了初始情况)已经在本地确定(见第16和19行)。这使得攻击者可以至少减少二叉树每个非根层的协议调用次数的一半。
回顾一下,在具有 N : = ∣ X ∣ N := |X| N:=∣X∣ 个叶节点的平衡二叉树中,有 2 N − 2 2N − 2 2N−2个叶节点,深度为 ⌈ log 2 N ⌉ \lceil \log_2 N \rceil ⌈log2N⌉ 。对于确定二叉树上所有交集大小所需的总调用次数,有一个上限:
1 + 1 2 ⋅ ∑ d = 1 ⌈ log 2 N ⌉ − 1 2 d + 1 2 ⋅ ( 2 N − 2 ) ⌈ log 2 N ⌉ = N . 1 + \frac{1}{2} \cdot \sum_{d=1}^{\lceil \log_2 N \rceil - 1} 2^d + \frac{1}{2} \cdot \left(2N − 2\right)^{\lceil \log_2 N \rceil} = N. 1+21⋅d=1∑⌈log2N⌉−12d+21⋅(2N−2)⌈log2N⌉=N.
这等于玩具攻击所需的总调用次数。这个上限保证我们的基线攻击的效率不会比玩具攻击差。
我们的第二个观察是,这个上限是宽松的,因为每个深度优先搜索(DFS)可能会在深度小于 ⌈ log 2 N ⌉ \lceil \log_2 N \rceil ⌈log2N⌉ 的非叶节点处提前终止。这种提前终止是因为一些目标元素的各个单例集合被合并成受害者集合的较大子集。当DFS遇到这个子集时,攻击者将了解一批目标元素的集合成员资格并终止此DFS。在这种情况下,由于DFS路径的缩短,调用次数减少。此外,剩余目标元素的数量也减少,并且需要更少的DFS通行来进行进一步的推断。因此,我们的基线攻击应比玩具攻击更为高效。
效率优化:贪心深度优先搜索(DFS)。由于合并集合成员可以提高攻击效率,攻击者应首先搜索具有最大合并概率的子树。这个概率与子树根的交集大小与该子树中目标元素数量的比率正相关。攻击者了解这个比率,并且可以将这个比率作为优先级分数,用于对推送到(优先级)队列中的子树进行排序。这样,攻击者将首先在具有最大合并概率的弹出子树上运行DFS。在每次DFS中,攻击者递归访问具有最大优先级分数的子节点。图1中呈现了一个示例。
Algorithm 3: buildTree for the feature-aware attackerInput: A set X, background knowledge BK.
Output: A binary tree T.1 Parse BK as a table DX such that DX [xi
] denotes the features
associated with a target element xi ∈ X.
2 Initialize T to contain a single node root.
3 Troot ← X, queue ← {root}.
4 while queue is not empty do
5 node ← queue.pop().
6 Use features {xi ∈ Tnode : DX [xi
]} to run k-means to divide Tnode into two subsets SL and SR.
7 Append two child nodes L and R to node.
8 TL ← SL, TR ← SR.
9 if |SL| > 1 then queue.push(L).
10 if |SR| > 1 then queue.push(R).
11 return T.
该算法的目的是根据给定的集合X和背景知识BK,构建一个二叉树,其中每个节点代表一个子集,通过k均值算法不断划分子集,直到子集中的元素数量满足某个条件。这样的二叉树结构可以用于特征感知的攻击,从而更有效地获取目标元素的信息。