查看原文
其他

PRIVGUARD:用于GDPR隐私合规的数据治理框架

CDra90n 安全学术圈 2022-09-24

笔记作者:CDra90n@SecQuan
原文作者:Lun Wang,Usmann Khan,Joseph Near,Qi Pang,Jithendaraa Subramanian,Neel Somani,Peng Gao,Andrew Low
原文标题:PRIVGUARD: Privacy Regulation Compliance Made Easier
原文来源:USENIX2022
原文地址:https://www.usenix.org/system/files/sec22summer_wang-lun.pdf
笔记小编:ourren@SecQuan

如何持续遵守 GDPR(General Data Protection Regulation)和 CCPA(California Consumer Privacy Act)等隐私法规已成为从小型初创企业到商业巨头的公司的沉重负担。当今的合规流程中严重依赖人工审计,这种审计成本高昂、速度慢且容易出错。为了解决这个问题,本研究提出了 PRIVGUARD,这是一种新颖设计的系统,可减少所需的人工参与并提高合规流程的生产力。PRIVGUARD主要由两个组件组成:(1)PRIVANALYZER,一个基于抽象解释的静态分析器,用于部分执行隐私法规,以及(2)一组组件,在数据的整个生命周期内为数据提供强大的安全保护。为了验证这种方法的有效性,对 PRIVGUARD进行原型设计并将其集成到工业级数据治理平台中。案例研究和评估表明,PRIVGUARD 可以以合理的性能开销正确地对现实世界的程序执行编码的隐私策略。

0x01 Introduction

随着欧盟通用数据保护条例 (GDPR) 和加州消费者隐私法案 (CCPA) 等隐私法规的出现,用户数据的保护得到了前所未有的重视。这对数据主体来说是一个积极的发展,但对合规性提出了重大挑战。今天的合规范式在很大程度上依赖于人工审计,并且在两个方面存在问题。首先,雇用和培训数据保护人员并依靠人工来监控合规性是一个昂贵的过程。根据福布斯的一份报告,截至 2018 年 5 月 25 日,GDPR 使美国财富 500 强公司损失了 78 亿美元。DataGrail的另一份报告显示,74% 的中小型组织花费了超过 100,000 美元来准备持续遵守 GDPR 和 CCPA。其次,人工审核速度慢且容易出错。合规性的低效阻碍了数据的有效使用并阻碍了生产力。合规人员犯的错误可能会损害数据主体并导致法律责任。

一个理想的解决方案将使数据管理者能够以最少的人工参与轻松确保细粒度的合规性,并快速适应隐私法规的新变化。欧洲 ICT PrimeLife 项目建议使用 Primelife政策语言 (PPL,Primelife Policy Language) 对法规进行编码,并通过将政策与用户指定的隐私偏好相匹配并在检测到特定行为时触发强制行动来执行它们。A-PPL通过添加责任规则扩展了 PPL 语言。这两部开创性的工作在探索有效的政策合规方面发挥了重要作用。但是,由于它们专注于 Web 2.0 应用程序,因此它们对复杂数据分析任务中的细粒度隐私要求合规性提供有限的支持。SPECIAL 项目部分继承了 PPL 项目的设计,因此受到类似的限制。对于另一种隐私政策的形式化语言(LEGALEASE)和执行它们的系统(GROK),其使用启发式方法来帮助确定分析过程是否符合策略,并且需要人工审核来捕获误报。因此,大规模有效遵守隐私法规仍然是一项重要挑战。

PRIVGUARD促进合规: 本文描述了一个名为 PRIV-GUARD 的原则性数据分析框架,以减少人对合规流程的参与。PRIGUARD 在加密工具和可信执行环境 (TEE) 的保护下按五步流程工作。

首先,数据保护官 (DPO)、法律专家和领域专家协作将隐私法规翻译成机器可读的政策语言。翻译过程是特定于应用程序的,需要应用程序和隐私法规方面的特定领域知识(例如,将法律概念映射到具体领域)。编码策略称为基本策略。对基本策略进行编码是 PRIVGUARD 工作流程中最需要人力的一步。

其次,在收集数据之前,数据主体在客户端 API 的帮助下指定他们的隐私偏好(privacy preferences)。他们可以直接接受基本策略或添加自己的隐私要求。隐私偏好与数据一起收集。

第三,数据分析师提交程序来分析收集的数据。分析师必须连同他们的计划一起提交不低于基本政策的相应保护策略(guard policy)。只能使用策略不强于保护策略的数据。

第四,提出的静态分析器 PRIVANALYZER 检查分析程序以确认其符合保护策略。同时,将加载隐私偏好不强于保护策略的数据子集进行真实分析。

最后,根据 PRIVANALYZER 的输出,结果将被解密给分析师或由剩余的未满足的隐私要求(称为残差策略,residual policy)保护。

LEGALEASE 的扩展-编码策略: PRIVGUARD 旨在与许多机器可读的策略语言兼容。在这项工作中,由于其可读性和可扩展性,使用 LEGALEASE来实例化本研究的实现。通过提供新的属性类型来扩展 LEGALEASE,包括需要使用隐私增强技术(如差分隐私)的属性。

PRIVANALYZER-执行策略: PRIVGUARD 的核心组件是 PRIVANALYZER,这是一个静态分析器,用于检查分析程序是否符合隐私政策。PRIVANALYZER 对分析师提交的程序进行静态分析,以检查它们是否符合相应的保护政策。

与以前依赖访问控制或手动验证的方法相比,PRIVANALYZER 是一种基于抽象解释的新型策略执行机制。PRIVANALYZER 不依赖启发式方法来推断策略或程序语义,并为某些属性提供可证明的可靠性。PRIVANALYZER 仅检查程序和策略(而不是数据),因此使用 PRIVANALYZER 不会泄露其保护的数据内容。本文方法适用于通用编程语言,包括那些具有复杂控制流、循环和命令特性的语言。因此,PRIVANALYZER 能够分析分析师编写的程序,因此分析师无需学习新的编程语言或更改他们的工作流程。本研究使用 Python 实例化实现,Python 是用于数据分析的最广泛使用的编程语言之一。

在大约 1400 行 Python 中实现了 PRIVANALYZER,并将其集成到工业级数据治理平台中,以建立PRIVGUARD原型。在 23 个执行数据分析和机器学习任务的开源 Python 程序上对原型进行了实验性评估。所选程序利用了Pandas、PySpark、TensorFlow、Py Torch、Scikit-learn 等流行库。结果表明 PRIVGUARD 具有可扩展性并且能够分析未经修改的 Python 程序,包括广泛使用外部库的程序。

0x02 PRIVGUARD Overview

在本节中概述了 PRIVGUARD 的设计和实现。首先使用一个示例来介绍 PRIVGUARD,然后介绍系统设计和实现。最后,讨论了 PRIVGUARD 的威胁模型和安全性。

A. 示例

使用一个示例来演示 PRIGUARD 的工作流程,这也能够展示使用的主要组件。例如,一家公司启动移动应用程序并收集用户数据以帮助做出明智的业务决策。为了促进遵守隐私法规,公司部署了 PRIGUARD 来保护收集的数据。PRIVGUARD原型基础设施如下图。

1643989359782

首先,DPO、法律专家和领域专家在基本策略中编码了两个要求:(1)未成年人的数据不得用于任何分析;(2) 任何有关数据的统计数据均应使用差分隐私加以保护。

其次,隐私偏好与数据一起从数据主体那里收集。一些数据主体(第 1 组)信任公司并直接接受基本策略。有些人(第 2 组)更加谨慎,并希望在分析之前编辑他们的邮政编码。其他人(第 3 组)不信任该公司,并且不希望他们的数据被用于除合法利益之外的目的。

第三,数据分析师想要调查用户年龄分布。它指定了一个保护策略,除了基本策略之外,邮政编码也不得用于分析。分析员将计算用户年龄直方图的程序提交给 PRIVGUARD。她记得过滤掉所有次要信息并编辑邮政编码字段,但忘记使用差异隐私保护程序。

第四,PRIVGUARD 使用PRIVANALYZER 来检查隐私偏好并将组1 和2 的数据加载到TEE 中,因为它们的隐私偏好并不比保护策略更严格。PRIGUARD 运行程序并保存生成的直方图。然而,在检查程序和保护策略后,PRIVGUARD 发现程序未能保护具有差分隐私的直方图。因此,直方图被加密,转储到存储层并由指示在解密结果之前应应用差异隐私的残差策略保护。

最后,PRIVGUARD 将剩余策略输出给分析师。分析员在检查了残差策略后,提交了一个程序,该程序将噪声添加到直方图以满足差分隐私。PRIGUARD 然后解密直方图,将其加载到 TEE 中,并执行程序以向其添加噪声。这一次,PRIVGUARD 发现保护策略中的所有要求都得到满足,因此它将直方图解密给分析师。

B. 系统设计

基本策略编码: 编码基本策略是 PRIVGUARD 工作流程中人工参与最多的步骤。基本政策应由 DPO、法律专家和领域专家共同设计,以准确反映隐私法规的最低要求。请注意,每个数据收集只需要一个基本策略,并且可以在对数据的所有分析中重复使用。基本政策的目的有两个。首先,基本政策的文本版本将作为最低隐私标准提供给数据主体,然后再选择数据收集。其次,数据分析师在进行分析之前需要了解基本策略。如果他们的分析满足更严格的隐私标准,他们可以指定自己的保护策略以利用更多用户数据。

1643989177268

使用 HIPAA 避风港(safe harbor)方法的子集演示了编码过程(上图)。DPO 和法律专家首先以一般方式对法规进行编码,而不考虑具体的数据格式。如上图a 所示,第一个子句(第 1-2 行)允许患者的医生检查他或她的数据。第二条(第 3-7 行)代表一些安全港要求:如果受试者未满 90 岁并且邮政编码被删除,则可能会发布健康信息。然后,DPO 和领域专家通过引入真实模式和消除不必要的要求,将编码映射到具体的数据集合。例如,在上图b 中,HealthInformation 被替换为数据集中的具体列名 SerumCholestoral,并且由于数据集不包含邮政编码,因此删除了最后一个要求。

数据和隐私偏好收集: 除了基本政策之外,数据主体还可以指定额外的隐私偏好来行使他们限制处理的权利。这些隐私偏好与数据一起发送给数据管理者,在那里它们将被保存在存储层中。为了防御传输和存储过程中的攻击,数据在发送到数据管理员之前被加密。解密密钥被委托给密钥管理器以供将来解密。

一个问题是“在 LEGALEASE 中指定隐私偏好需要多少专业知识?”在一项针对 DPO 的调查中,发现大多数人在培训后能够正确编码策略。为了补充他们的调查并更好地了解需要多少专业知识,本研究针对未经培训的普通用户进行了在线调查。该调查揭示了两个事实:(1)理解和编码 LEGALEASE 策略的难度与用户对其他编程语言的熟悉程度之间存在显着的正相关关系;(2)大多数用户未经培训无法正确理解差分隐私等隐私技术。根据这些观察,研究者强烈建议没有编程经验的用户直接接受基本策略,而不是自己编码。虽然超出了范围,但通过开发更用户友好的 UI 和翻译工具来简化隐私偏好规范是未来的重要方向。

分析初始化: 要初始化分析任务,分析人员需要向 PRIVANALYZER 提交 (1) 分析程序和 (2) 保护策略。保护策略不应弱于满足最低隐私要求的基本策略。守卫政策越严格,可用于分析的数据就越多。

PRIVANALYZER 分析: 收到提交后,PRIVANALYZER 将从存储层加载隐私偏好,并与保护策略进行比较。只有偏好不超过保护策略的数据才会被加载到 TEE 中,使用来自密钥管理器的密钥进行解密,然后合并以准备进行实际分析。同时,PRIVANALYZER 将(1)检查保护策略不弱于基本策略,(2)然后检查保护策略和生成剩余策略的程序。为确保静态分析正确运行,PRIVANALYZER 在可信执行环境 (TEE) 中受到保护。

合规执行实际上取决于三个检查:(1)保护策略不弱于基本策略;(2) 只使用隐私偏好不强于保护策略的数据;(3) 解密前应满足保护政策。对于 (3),保护策略可以通过单个程序或多个程序依次应用于数据来满足。这种设计使 PRIVGUARD 能够在多步分析中执行隐私政策

执行和解密: 在 PRIVANALYZER 完成分析后,提交的程序将使用 TEE 中的解密数据执行。如果上一步生成的残差策略为空,则可以将结果解密给分析师。否则,输出将被再次加密并存储在受残差策略保护的存储层中。

读者可能会问“为什么 PRIVGUARD 不直接拒绝不符合保护政策的程序?”该设计选择是出于两个考虑。首先,当保护策略包含 ROLE 或 PURPOSE 属性时,并不总是可以获得空的残差策略。这些属性将在真实数据分析后由人工审核来满足。其次,PRIVGUARD 旨在与多步分析兼容,这是实际产品管道中的常见情况。在多步骤分析中,很可能在不同的步骤中满足隐私要求。

C. 系统安全

在本节中将介绍威胁模型并演示如何在威胁模型下保护 PRIVGUARD。

威胁模型: 设置涉及四方 - (1) 数据主体(例如用户),(2) 数据管理者(例如网络服务提供商、银行或医院),(3) 数据分析师(例如数据管理者的员工), (4) 不受信任的第三方(例如外部攻击者)。数据从数据主体收集,由数据管理者管理,并由数据分析师进行分析。数据主体和数据管理者都希望遵守隐私法规,以保护自己的数据或避免法律或声誉风险。然而,数据分析师诚实却是粗心的,可能会无意中编写违反隐私法规的程序。数据分析师与数据交互的唯一方法是提交分析程序并检查输出。不受信任的第三方可能会主动发起攻击以窃取数据或干扰合规流程。一个具体的例子是托管小公司服务或数据的云提供商。在以下两个假设下,本研究保护第三方的数据机密性和执行完整性。首先,假设不受信任的第三方不能向 PRIVANALYZER 提交分析程序,或者让内部人员这样做。其次,假设不受信任的第三方适合所选 TEE 的威胁模型,因此他们不能破坏 TEE 的安全保证。

安全措施: PRIGUARD 采取以下措施来防御不受信任的第三方,并在上述威胁模型下建立安全的工作流程。首先,数据在传输到数据管理者之前由数据主体在本地加密。解密密钥被委托给密钥管理器,因此在没有向密钥管理器或数据主体询问解密密钥的情况下,任何人都不能有意或不小心接触数据。为了以不可变的方式绑定数据和策略,加密数据包含相应策略的哈希值。其次,所有传输通道都满足传输层安全标准(TLS 1.3)。第三,PRIVANALYZER 在 TEE 内运行,以保证静态分析的完整性。密钥管理器可以远程证明以确认 PRIVANALYZER 在发布解密密钥之前正确地检查了程序和策略。第四,数据解密和分析程序执行也在 TEE 内部受到保护。

PRIGUARD 针对不受信任的第三方的安全性基于以下信任来源。首先,数据的机密性和完整性保留在 TEE 和 TLS 通道内。其次,代码执行的完整性保留在 TEE 内部。远程证明可以正确、安全地报告执行输出。第三,密钥管理器是完全信任的,这样解密密钥的机密性得以保留。可信密钥管理器的设计与本文的重点是正交的。潜在的解决方案包括 TEE 内部的密钥管理器或分散的密钥管理器。

0x03 PRIVANALYZER: Static Analysis for Enforcing Privacy Policies

本节介绍PRIVANALYZER,一种用于执行 PRIV-GUARD 跟踪的隐私策略的静态分析器。首先回顾 LEGALEASE 策略语言,然后描述如何静态地执行它们。

A. 背景与设计挑战

LEGALEASE 是越来越多的工作的一个例子,它探索了用于编码隐私政策的形式化语言。由于其表达能力、形式语义和可扩展性,采用 LEGALEASE 来表达 PRIVGUARD 策略。

GROK系统结合了静态和动态分析来执行 LEGALEASE 政策。GROK 构造一个数据依赖图,该图对所有敏感数据流进行编码,然后应用一组推理规则来检查图中的每个节点是否满足策略。GROK 将系统日志分析与有限的静态分析结合起来构建图。

GROK 方法提出了两个挑战。首先,该方法是一种启发式方法:它检查程序的句法属性和程序的单个执行(通过系统日志),因此可能会由于隐式流而错过策略违规。其次,GROK 方法需要明确整个数据流图;在具有许多数据流的大型系统中,构建此图可能很棘手。

PRIVANALYZER 被设计为解决这两个挑战的替代方案。它使用基于抽象解释的静态分析而不是 GROK 的启发式分析,并通过构建可组合的残差策略来避免使数据流图显式化。

B. 策略语法和语义

1643989392257

PRIVANALYZER 执行 LEGALEASE中指定的隐私策略,这是一个使用各种类型的属性来表达策略的框架。属性被组织在概念格(concept lattices)中,它提供了属性值的偏序。根据上图中的语法表达策略(与 LEGALEASE 的语法略有不同)。策略由顶级 ALLOW 关键字后跟由 AND(用于连接)和 OR(用于分离)分隔的子句组成。例如,以下简单政策规定医生或研究人员可以检查分析结果,只要未成年人的记录不用于分析:

1643989448932

本研究使用一组推理规则和每个属性的概念格给出的部分排序来定义 LEGALEASE 策略的形式语义,但使用基于抽象域(abstract domains)而不是概念格的新属性框架。本文方法使 PRIVPOLICY 能够对具有更多表达要求的策略进行编码,例如基于行的访问控制和使用如下所述的隐私增强技术。

属性:属性是 LEGALEASE 中的基本构建块,描述了一组有用的属性。本文用两个新的扩展了这个集合:FILTER 编码基于行的访问控制要求,PRIVACY 需要使用隐私增强技术。

角色: ROLE 属性控制谁可以检查数据的内容。角色被组织成部分有序的层次结构。一个特定的个人可能有许多角色,而一个特定的角色规范可能代表许多个人。例如,医生角色可能代表具有许多不同专业的医生。以下政策规定,只有具有肿瘤学家角色的个人才能检查其涵盖的数据:

1643989474694

架构: SCHEMA 属性控制可以检查哪些数据列。例如,以下策略允许肿瘤学家检查年龄和条件列,但不允许检查其他列:

1643989484393

隐私: PRIVACY 属性通过要求使用隐私增强技术来控制数据的使用方式。作为可用机制频谱的代表性样本,实现支持以下(易于添加):(1)去识别(或假名化);(2) 聚合;(3) k-匿名性;(4) l-多样性;(5) t-接近度;(6) 差分隐私。例如,以下策略允许肿瘤学家在具有一定隐私预算的差异隐私保护下检查年龄和条件列:

1643989490533

筛选: FILTER 属性允许策略指定某些数据项必须从分析中排除。例如,以下政策规定,肿瘤学家可以检查 18 岁以上具有不同隐私的个人的年龄和状况:

1643989502546

编辑: REDACT 属性允许策略要求对列中的信息进行部分或完整的编辑。例如,以下策略需要分析以编辑邮政编码的最后 3 位数字(例如,通过用星号替换它们)。(2 : ) 表示法取自 Python 的 slice,表示第三个字符和字符串结尾之间的子字符串。

1643989590345

目的: PURPOSE 属性允许策略限制可以分析数据的目的。例如,以下政策允许出于公共利益目的使用年龄和医疗状况,并满足上述所有要求:

1643989622805

C. PRIVANALYZER 概述

PRIVANALYZER 通过抽象解释(abstract interpretation)执行其静态分析,这是对程序进行声音分析的通用框架。抽象解释通过在抽象值而不是具体(常规)值上运行程序来工作。抽象值被组织成抽象域:部分有序的抽象值集合,可以表示编程语言中所有可能的具体值。抽象值通常代表它所代表的具体值所共享的特定属性。在 PRIVANALYZER 中,抽象值基于前面描述的抽象域。本文的静态分析方法基于抽象解释框架的新实例,将策略编码为抽象值。该方法总结在下图中。抽象解释的使用能够系统地构建静态分析,确保其与属性值的预期语义一致。

1643989538782

分析 Python 程序: 抽象解释的典型方法是构建一个使用抽象值进行计算的抽象解释器。对于像 Python 这样复杂的通用语言,这种方法需要大量的工程工作。本研究不是从头开始构建抽象解释器,而是重用标准 Python 解释器来执行抽象解释。将带有附加隐私策略的抽象值嵌入为 Python 对象,并将对抽象值的操作定义为这些对象上的方法。

例如,Pandas 库定义了对具体数据帧的操作;PRIVANALYZER 为抽象数据帧定义了 AbsDataFrame 类。AbsDataFrame 类与 Pandas DataFrame 类具有相同的接口,但其方法被重新定义为计算带有附加策略的抽象值。将重新定义的方法称为函数摘要,因为它总结了原始方法的策略相关行为。例如,Pandas 索引函数 _getitem_ 用于过滤,因此 PRIVANALYZER 的summary函数会从策略中删除满意的 FILTER 属性。

1643989738893

多步骤分析和残差策略: 如前图所示,PRIVANALYZER 的输出是一个残差策略。残差策略是程序具体输出的新策略——它包含分析程序尚未满足的需求。对于多步分析,分析的每一步都可以作为单独的分析程序输入PRIVANALYZER,上一步的残差策略成为下一步的输入策略。PRIVANALYZER 是组合式的:如果将多个分析合并到一个分析程序中,那么 PRIVANALYZER 为多步分析返回的最终残差策略将至少与单步版本一样具有限制性。在 PRIVGUARD 中使用残差策略可以在不需要显式构建全局数据流图的情况下进行组合分析,从而解决了前面提到的 GROK的挑战。

处理库: 扩展到大型程序是许多静态分析的主要挑战,包括抽象解释器。库往往是最大的挑战,因为它们往往又大又复杂。如果程序依赖于大型库,那么即使是相当小的目标程序也可能无法分析。这在设置(用于数据处理的 Python 程序)中当然是正确的,其中程序通常利用大型库,如 pandas(327,007 行代码)、scikit-learn(184,144 行代码)、PyTorch(981,753 行代码)和Tensorflow(2,490,119 行代码)。更糟糕的是,出于性能原因,许多库是用多种语言(例如 Python 和 C/C++)编写的,因此需要对这些语言中的每一种进行分析。

本研究的解决方案是以函数摘要的形式开发这些库的抽象功能函数,例如前面显示的 AbsDataFrame 示例。在分析过程中使用函数摘要,而不是库本身的具体实现。这种方法允许 PRIVGUARD 强制执行策略,即使是对利用以多种语言编写的超大型库的分析程序也是如此。

1643989762350

处理库的方法需要具有库知识的领域专家来实施其规范。根据经验,数据科学社区在很大程度上同意了一组常用的重要库(例如 NumPy、pan das、scikit-learn 等),因此为少数库提供规范是足以处理大多数程序。为了从经验上验证猜想,从 Kaggle 平台上随机选择了 200 个程序并计算了它们使用的库(上图)。结果证实,大多数数据分析程序都使用类似的库。库函数的抽象行为往往比其具体行为更简单。主要为 Numpy、Pandas 和 scikit-learn 实现了 380 个函数摘要,并正在积极努力为各种库添加更多函数摘要。

需要正确的规范来严格执行隐私政策。正确实施规范的重要性的一个说明性示例是重命名函数。狡猾的内部攻击者可能希望通过重命名敏感列来绕过静态分析。重命名模式和隐私条款中的列的正确规范应该可以减轻此类攻击。为了降低此类错误造成的风险,函数摘要应该是开源的,以便社区可以帮助检查其正确性。

与动态方法的比较: 为 PRIVANALYZER 选择静态分析的动机是因为与动态方法相比有两个主要优势:(1) 处理隐式数据流的能力,以及 (2) 增加最小运行时开销的目标。检测隐式流的能力是静态分析系统的主要优势,包括 PRIVANALYZER。与动态方法不同,PRIVANALYZER 不能被旨在混淆执行的复杂控制流所击败。例如,数据主体可能会指定策略 ALLOW REDACT name (1 : ),这需要对 name 列的大部分进行编辑。分析师可能会编写以下程序:

1643989825381

这个程序显然违反了政策,即使它没有直接返回 data.name 的值。这种违规是由于名称列到返回值的隐式流动。返回值 1 允许分析师确定地确认数据主体的名字是 Alice。这种隐式流程对动态分析提出了重大挑战,因为动态分析只执行每个条件的一个分支,并且不能对未采取的分支做出任何结论。动态分析必须要么对条件句中敏感值的使用施加重大限制,要么允许由于隐含流动而导致的不健全。

另一方面,像 PRIVANALYZER 这样的静态分析器可以执行检查两个分支的最坏情况分析。PRIVANALYZER 的分析使用抽象解释器执行两个分支,并返回两个分支的最坏情况结果。对于没有迭代次数限制的循环,分析结果代表最坏情况的结果,无论在运行时执行多少次迭代。这种能力是以潜在的缺乏精确性为代价的分析可能会拒绝实际上可以安全运行的程序。然而评估表明,PRIVANALYZER 分析对于执行数据分析的程序来说足够精确。像PRIVANALYZER 这样的静态分析工具不需要策略规范了解隐式流,因为它在结果中结合了两种类型的流。

D. PRIVANALYZER 举例

PRIVANALYZER 的输入是单个分析程序,以及它处理的数据文件的所有策略。对于程序的每个输出,PRIVANALYZER 产生一个残差策略。运行分析后,PRIV-GUARD 会将这些剩余策略中的每一个附加到适当的具体输出。PRIVANALYZER 通过执行抽象解释来工作,其中程序的输入是包含相关策略表示的抽象值。这个过程的输出是一组包含残差策略表示的抽象值。

1643989867945

上图总结了这个过程的一个完整的示例。该分析是一个 Python 程序,改编自提交给 Kaggle的开源分析。程序中的重要位置标有数字(例如上图-1 ),PRIVANA LYZER 在该程序位置计算相关的剩余策略。

将数据读入抽象值: 该程序通过读取包含敏感数据的 CSV 启动(上图-1)。PRIVANALYZER 的抽象解释库重新定义 read_csv 以返回包含与正在读取的数据关联的策略的抽象数据帧。因此,在位置 1 处,变量 df 包含程序输入的完整策略。在此示例中,策略允许程序使用 “age” “credit” 和“duration” 列,需要过滤掉未成年人的数据,以及 混合具体和抽象的价值。程序的下一部分定义了一些常量,PRIV-ANALYZER 用附加策略中缺乏的具体值来表示这些常量。然后,程序删除输入列之一(上图-2);这个动作不会改变策略,因为被删除的列不足以满足任何策略的要求,所以 df 变量没有改变。

满足FILTER要求: 下一条语句(上图-3)执行过滤操作。PRIVAN ALYZER 库重新定义了此操作,以从策略中消除适当的 FILTER 要求;由于这个过滤操作去除了 25 岁以下的个体,因此它满足策略中的 FILTER 要求,而 df 的新值是一个抽象数据帧,其策略没有这个要求。

处理循环: 程序的下一部分包含一个 for 循环(上图-4)。循环传统上是静态分析器的一大挑战。PRIVANALYZER 旨在通过简单地具体执行它们来利用具体值的循环,例如这个。PRIVANALYZER 还可以处理抽象值的循环,但在案例研究中这些循环相对较少。

库和黑盒操作: 接下来的代码(上图-5 和 6)首先获取每个特征的日志,然后缩放特征。这两种操作都会影响特征值的规模。经过这些操作后,就无法满足 FILTER 这样的策略要求,因为原始数据值已经丢失。对于像这样的有损操作,称之为黑盒操作(详见下文),PRIVANALYZER 旨在在策略中保留与值相关的要求(如 FILTER)时发出警报。

训练模型: 最后一段代码(上图-7 和 8)使用 scikit-learn 中的 KMeans 实现来执行聚类。本文总结了这种方法,以指定它满足策略中的去标识化要求。示例中的结果是一个空的残差策略,这将允许分析师查看结果。

E. 具有挑战性的语言特性

现在讨论 PRIVANALYZER 中针对几个具有挑战性的语言特征所采用的方法

条件: 取决于抽象值的条件要求抽象解释器运行两个分支并计算两个结果的上限。由于 Python 不允许重新定义 if 语句,因此向 PRIGUARD 添加了一个预处理步骤,该步骤通过运行两个分支来转换条件。

循环: 循环传统上是抽象解释器处理的最具挑战性的结构。幸运的是,用于数据分析的 Python 程序中的循环通常属于受限类。这个示例中的两个循环都超过了常数值——因此抽象解释器可以简单地运行每个循环体,次数与不断的要求。

抽象值上的循环更具挑战性,简单的方法可能永远不会终止。为了解决这种情况,为 PRIVANALYZER 中使用的每个抽象域定义了一个扩展运算符。加宽算子迫使循环到达一个固定点;在示例中,扩展对应于假设循环体将在整个数据帧上执行。

别名(Aliasing): 抽象解释的另一个挑战来自别名问题,其中两个变量指向相同的值。有时,分析不可能确定变量引用的抽象值。在这种情况下,也无法确定副作用对变量的结果。

重用现有 Python 解释器的方法有助于解决这一挑战:在 PRIVANALYZER 中,所有变量引用都被具体评估。在大多数情况下,引用是针对具体对象的,因此分析与具体执行完全对应。然而,在少数情况下,这种方法会导致不太精确的分析。例如,如果一个变量在条件的两个分支中重新分配,PRIVANALYZER 必须假设在这两种情况下都将最坏情况的抽象值(即具有最严格的策略)分配给变量。这种方法在本研究的环境中效果很好,条件和别名都相对较少。

F. 属性强制

架构、过滤器和编辑: SCHEMA、FILTER 和 REDACT 属性可以形式化定义,PRIVANALYZER 可以检查合规性。在实现中,如果库的具体实现满足相应的要求,相关函数摘要会从隐私策略中删除该属性。因此,摘要实现了对这些函数的抽象解释。请注意,PRIVANALYZER 假定没有摘要的函数不满足任何策略要求。因此,PRIVANALYZER 是不完整的:尽管满足相关政策,但某些程序可能会被拒绝(由于函数摘要不足)。

隐私: PRIVACY 属性也由 PRIVANALYZER 检查。分析程序可以通过调用删除识别信息的函数(例如聚合记录或训练机器学习模型)来满足去识别要求。程序可以通过调用提供这些属性的特定函数来满足 k-Anonymity、l-diversity、t-closeness 或差分隐私要求。函数摘要包括来自当前文献的代表性实现:IBM 差分隐私库、K-匿名库 和谷歌的 Tensorflow 隐私库。

执行差异隐私属性时有两个微妙之处。首先,满足差分隐私的程序也需要跟踪隐私预算。默认情况下,PRIVGUARD 跟踪每个提交数据源的单个全局累积隐私成本(ε 和 δ 的值),并在隐私成本超过预算金额后拒绝新的分析程序。PRIVANALYZER 报告单个分析程序的隐私成本,允许 PRIVGUARD 更新全局隐私成本。在许多分析师执行不同分析的环境中,单一的全局隐私预算可能会很快用完。这个问题的一个解决方案是生成不同的私有合成数据,可以在以后的分析中使用,而不需要进一步的隐私成本。高维矩阵机制 (HDMM,High-Dimensional Matrix Mechanism)是用于此目的的算法的一个示例,美国人口普查局使用它来发布不同的私有数据。在 PRIVGUARD 中,可以对 HDMM 等算法的输出执行任意许多额外的分析,而不会耗尽隐私预算。另一种解决方案是细粒度预算,在记录级别(如 ProPer)或静态定义的“区域”级别(如 UniTraX)。第一个更精确,但需要静默删除隐私预算用尽的记录,从而导致结果有偏差。这两种方法都允许对不断增长的数据库中的新数据进行连续分析(例如,每天只对当天获得的新数据运行特定的查询工作负载)。其次,为了计算隐私预算,PRIVGUARD 初始化一个变量来跟踪差分隐私函数之前的预处理步骤的敏感性。预处理函数摘要应操纵变量以指定它们对灵敏度的影响。如果在差分隐私函数之前的任何函数中都没有这样的规范,PRIVGUARD 将发出警告并将差分隐私要求识别为不满足。

角色: ROLE 属性由身份验证技术强制执行,例如密码、双因素身份验证,甚至是生物特征身份验证。此外,ROLE 属性也记录在下一段描述的可审计系统日志中,分析师和数据管理员将对虚假身份负责。

目的: PURPOSE 属性本质上是非形式化的。因此,采用基于问责制的方法来进行合规检查。分析人员在提交分析程序时可以指定目的,也可能无意或恶意指定无效目的。PRIVANALYZER 将使用这些目的来满足 PURPOSE 要求。PRIGUARD 生成审计日志,记录分析师、分析程序和声称的目的。因此,系统中发生的所有分析都可以在事后得到验证,分析人员可以对使用无效目的承担法律责任。

0x04 Evaluation

该评估旨在证明 (1) PRIV-ANALYZER 支持用于数据分析的常用库,并且可以分析现实世界的程序,以及 (2) PRIVGUARD 是轻量级和可扩展的。为了演示,(1) 使用来自 Kaggle 竞赛平台的 23 个真实世界分析程序测试 PRIVANALYZER,并且 (2) 使用这些程序的子集测量 PRIVGUARD 的开销。结果表明,PRIVGUARD 可以以合理的性能开销对这些程序正确执行 PRIVPOLICY 策略。

A. 实验设置

在大约 1400 行 Python 中实现了 PRIVANALYZER,并将其集成到工业级数据治理平台 Parcel中,以构建 PRIVGUARD 原型。使用 Inter Planetary File System (IPFS) 为存储层、AES-256-GCM 为加密算法和 AMD SEV 为 TEE 实例化了实现。

为了评估 PRIVGUARD 对现实世界程序的静态分析,从最著名的数据分析竞赛平台之一 Kaggle 收集了 23 个不同任务的分析程序。这些程序分析敏感数据,例如欺诈检测和交易预测。选择这些程序作为案例研究,以展示 PRIGUARD 分析现实世界分析程序和支持常用库的能力。这些案例研究被选为代表数据科学家在许多不同类型的组织的日常运营中编写的程序。调查了 100 个随机运行的 kaggle 程序,发现大约 85% 的程序少于 300 行代码(删除空行后)。相应地,案例研究范围在 50 到 276 行代码之间,总共正好 1600 行代码,其中包括从 Kaggle 笔记本中随机挑选的程序和竞赛排行榜上排名靠前的程序。如下表所示,这些程序使用各种外部库,包括广泛使用的库,如 pandas、PySpark、Tensorflow、PyTorch、scikit-learn 和 XGBoost。

1643990180324

作为评估的第一步,使用 PRIVANALYZER 来分析上表中列出的收集程序。在实验中为每个程序手动设计了一个适当的 LEGALEASE 策略,然后将它们附加到每个程序中。对于每个程序,记录了在数据集上运行的时间和 PRIVANALYZER 分析程序的时间。还手动检查了PRIVANALYZER 输出的分析结果是否正确。所有实验均在 Ubuntu 18.04 LTS 服务器上运行,该服务器配备 32 个 AMD Opteron(TM) 处理器 6212 和 512GB RAM。结果如下表所示。作为评估的第二步,选择了 7 个开源数据集的案例研究,在 PRIVGUARD 原型上运行,并进行了测量。

B. 结果

支持真实世界程序: 实验证明了 PRIVGUARD 能够分析组织中通常用于处理数据的各种分析程序。下表中的结果表明,大多数程序的静态分析只需要一两秒,其中三个异常值需要 3.32、4.78 和 6.84 秒。下一段将描述异常值的原因。

1643990274286

与其他抽象解释和符号执行框架一样,期望条件、循环和其他控制流结构对分析时间的影响比程序长度更大。数据分析和机器学习程序往往不会广泛使用这些结构,尤其是与传统程序相比。相反,他们倾向于使用库提供的构造,例如 pandas 中定义的查询函数或 scikit-learn 提供的模型构建类。上面提到的异常值(案例研究 2、13 和 14)包含相对大量使用条件语句,因此,它们的分析时间比其他程序稍长。这些结果表明,PRIVGUARD 将扩展到更长的数据分析和机器学习程序,特别是如果这些程序遵循相同的模式,即优先使用库而不是传统的控制流结构。

上表报告了所有 23 个案例研究的性能开销。结果报告了总体分析性能——静态分析所用时间与原始程序的本机执行时间之比。结果表明,这种开销可以忽略不计。对于需要大量运行时间的案例研究程序,部署 PRIGUARD 的性能开销通常小于 1%。对于运行速度更快的程序,绝对开销是相似的——通常只有一两秒——但是当程序的执行时间很短时,这代表了更大的相对变化。在实验中,最大的相对性能开销约为 35%,对于一个只需要 13.33 秒的程序。

1643990209454

整体性能开销和可扩展性: 还评估了关于的原型实现的 7 个案例研究,并测量了 PRIGUARD 系统的总开销。结果如上图和下图所示。对于每个案例研究,通过组合可能的属性和更改属性中的参数来合成一百万个随机策略,以模拟一百万个数据主体的隐私偏好。结果表明,摄取 100 万条策略的性能开销低于 150 秒。具体来说,一半以上的开销都花在了 Parcel 的系统开销上,如数据上传、数据存储、数据加密等。数据摄取大约占开销的三分之一,静态分析只需不到 10 秒。

1643990324449

本研究还对不同用户数量的开销进行了基准测试,如上图所示。Parcel 开销是指 Parcel 平台产生的开销,例如数据加载或传输。扫描开销是指查找不比保护策略更严格的策略所花费的时间。合并开销是指在 TEE 中合并数据集所用的时间。分析开销是指运行 PRIVANALYZER 的开销。如上图所示,Parcel 开销、扫描开销和合并开销在用户数较少时相对稳定,然后随用户数线性扩展。请注意,使用 log10 比例来表示 x 轴。曲线是指数的,但比率呈线性变化。对于除静态分析之外的所有实验:开销 = O(#Users) + O(1)。毫不奇怪,对于固定程序,分析开销几乎是恒定的。结果表明,PRIVGUARD 可扩展到大量用户和数据集。

0x06 Limitation

现在指出 PRIVGUARD 的一些限制,并将减轻它们视为重要的未来方向。首先,PRIGUARD 容易受到内部攻击。在威胁模型中,假设数据分析师诚实但鲁莽,可能会无意中违反隐私法规。这样的威胁模型应该足以捕获大多数现实世界的用例。然而,防御恶意分析师的挑战要大得多。由于 PRIVANALYZER 是作为 Python 库实现的,因此可以制作逃避其分析的恶意程序。例如,恶意程序可能会动态地重新定义 PRIVANALYZER 的 runFilter 函数(在前面的示例中使用)以始终报告策略已得到满足。在程序加载之前检测动态语言特性的使用的句法分析可以解决这个问题。然而,由于 Python 中的大量动态特征,检测所有此类攻击具有挑战性。

其次,许多 PURPOSE 属性不能由 PRIVGUARD 自动强制执行,因为它们与程序属性无关。例如,一个程序是否代表“合法利益”只能由人来判断,因此任何全自动系统都无法在没有人工描述的情况下决定。为了应对这一挑战,选择记录这些属性并使日志可供人工审计访问。本文目标是尽量减少而不是消除合规过程中的人为努力。

第三,PRIVGUARD 依靠 AMD SEV 等 TEE 来防御不受信任的第三方。然而,最近的研究发现了主流 TEE中的几个漏洞,这削弱了它们对恶意第三方的保护。虽然超出了范围,但想向潜在用户提及这些可能的漏洞。

0x07 Conclusion & Future Work

在本文中提出了 PRIVGUARD,这是一个促进隐私法规遵从性的框架。核心组件是 PRIVANALYZER,一个支持程序和策略之间的合规性验证的静态分析器。在 Parcel(工业级数据治理平台)上构建 PRIGUARD 原型,相信 PRIVGUARD 有可能显着降低隐私法规合规成本。本研究还希望为未来版本的 PRIVGUARD 探索几个未来方向。首先考虑到 HCI 要求,希望进一步提高 PRIVGUARD API 的可用性,以便非专家可以轻松指定自己的隐私偏好。其次,PRIVGUARD 现在采用一次性同意策略,涵盖了当前大多数应用场景。

安全学术圈招募队友-ing 
有兴趣加入学术圈的请联系 secdr#qq.com

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存