8个版本
0.3.2 | 2021年2月23日 |
---|---|
0.3.1 | 2019年11月13日 |
0.3.0 | 2019年10月30日 |
0.2.2 | 2019年5月12日 |
0.1.0 | 2018年12月16日 |
#191 in 机器学习
115KB
2K SLoC
F-BLEAU

F-BLEAU是一种通过黑盒方式(即仅通过查看秘密输入和相应的输出示例)来估计系统关于其秘密泄露的工具。它将一个通用系统视为黑盒,接收秘密输入并相应地返回输出,并测量输出“泄露”了多少关于输入的信息。它是在[2]中提出的。
F-BLEAU基于估计特定类别机器学习模型误差与估计信息泄露之间的等价性[1,2,3]。
此代码也被用于[2]的以下评估实验:Gowalla、e-passport和有限域指数的旁路攻击。
入门指南
F-BLEAU作为命令行工具提供,fbleau
。也存在Python绑定(见下文)。
fbleau
以CSV数据为输入,包含系统的输入和输出示例。它目前需要两个CSV文件作为输入:一个训练文件和一个验证(或测试)文件,例如
0, 0.1, 2.43, 1.1
1, 0.0, 1.22, 1.1
1, 1.0, 1.02, 0.1
...
其中第一列指定秘密,其余列指示输出向量。
它运行选定的方法来估计贝叶斯风险(敌手在给定相应输出预测秘密的最小错误概率),以及相对安全性度量。
一般语法是
fbleau <estimate> [--knn-strategy=<strategy>] [options] <train> <eval>
Arguments:
estimate: nn Nearest Neighbor. Converges only if the
observation space is finite.
knn k-NN rule. Converges for finite/continuous
observation spaces.
frequentist Frequentist estimator. Converges only if the
observation space is finite.
knn-strategy: ln k-NN with k = ln(n).
log10 k-NN with k = log10(n).
train Training data (.csv file).
eval Validation data (.csv file).
示例
此示例考虑了根据几何分布(隐私级别为nu=4)生成的100K观察结果(详情见[2]);贝叶斯风险的真值为
R*=0.456,通过分析计算得出。观察结果分为训练集(80%)和测试集(分别对应于
examples/geometric-4.train.csv和
examples/geometric-4.test.csv)。
可以使用 fbleau
来计算使用 ln
策略的 knn
估计(具体估计方法细节见下文)如下:
$ fbleau knn --knn-strategy ln examples/geometric-4.train.csv examples/geometric-4.test.csv
Random guessing error: 0.913
Estimating leakage measures...
Minimum estimate: 0.473
Multiplicative Leakage: 6.057471264367819
Additive Leakage: 0.44000000000000006
Bayes security measure: 0.5180722891566265
Min-entropy Leakage: 2.5987156557884865
You have new mail in /var/mail/joker
注意:根据您的机器配置,这可能需要一些时间。
默认情况下,F-BLEAU 在不断增加的训练样本上运行估计器,并在每一步计算估计值。返回的 R*(此处为 0.473)是此过程中观察到的最小值。
要记录每一步的估计值,请指定一个日志文件,使用 --logfile <logfile>
。
估计值
原则上,应该尝试尽可能多的估计方法,并选择产生最小估计值的那个 [2]。然而,某些估计器更适合某些情况。以下表格显示了:i)当估计器在足够的数据下保证收敛到正确值时,以及 ii)它们是否适合小型或大型系统。例如,小型系统可能具有多达 1K 的可能输出值;大型系统的输出空间可能更大。
估计 | 选项 | 收敛性 | 适用场景 |
---|---|---|---|
频率派 | 如果输出空间是有限的 | 小型系统 | |
nn | 如果输出空间是有限的 | 小型/大型系统 | |
knn | --knn-strategy |
始终 | 小型/大型系统 |
nn-bound | 始终(然而,请注意,这是一个下界) | 小型/大型系统 |
例如
fbleau nn <train> <test>
更多细节请见 [2]。
k-NN 策略
k-NN 估计器也需要定义一个“策略”。目前实现策略包括:
ln k-NN 估计器,其中 k = ln(n)
,其中 n
是训练样本的数量。
log 10 k-NN 估计器,其中 k = log10(n)
,其中 n
是训练样本的数量。
例如,您可以运行
fbleau knn --knn-strategy log10 <train> <test>
其他选项
默认情况下,fbleau
对所有训练数据运行。但是,可以指定一个停止条件,形式为 (delta, q)-收敛:当估计值的值至少 q 步没有超过 delta(《--delta》),在相对(默认)或绝对(《--absolute》)意义上时,fbleau
停止。
fbleau
可以通过指定 --scale
标志来缩放系统输出(“特征”)的个别值,使其在 [0,1]
区间内。
可以使用 --distance
选项来选择最近邻方法所需的最优距离度量。
其他选项请参阅帮助页面
fbleau -h
安装
代码是用 Rust
编写的,但它被认为是作为一个独立的命令行工具使用。
安装 rustup,这将使 cargo
可用于您的路径。然后运行
cargo install fbleau
现在您应该在您的 $PATH
中找到二进制文件 fbleau
(如果没有找到,请再次检查 rustup)。
如果您的系统上没有 rustup
(例如,某些 *BSD 系统),您仍然可以使用系统的包管理器安装 cargo
,然后像上面那样安装 fbleau
。如果不起作用,请提交一个工单。
Python 绑定
如果您希望使用Python通过F-BLEAU,我们现在提供了一个Python模块来实现基本功能。
安装
pip install fbleau
用法
>>> import fbleau
>>> fbleau.run_fbleau(train_x, train_y, test_x, test_y, estimate,
... knn_strategy, distance, logfile, delta, qstop, absolute, scale)
其中参数遵循上述约定。
train_x : training observations (2d numpy array)
train_y : training secrets (1d numpy array)
test_x : test observations (2d numpy array)
test_y : test secrets (1d numpy array)
estimate : estimate, value in ("nn", "knn", "frequentist", "nn-bound")
knn_strategy : if estimate is "knn", specify one in ("ln", "log10")
distance : the distance used for NN or k-NN
log_errors : if `true`, also return the estimate's value (error)
for each step
log_individual_errors : if `true`, log the individual errors for each
test object, for the best estimator
(i.e., for the smallest error estimate)
delta : use to stop fbleau when it reaches (delta, qstop)-convergence
qstop : use to stop fbleau when it reaches (delta, qstop)-convergence
absolute : measure absolute instead of relative convergence
scale : scale observations' features in [0,1]
函数 run_fbleau()
返回一个字典,包含以下内容
- min-estimate:最小贝叶斯风险估计(应使用该估计值)
- last-estimate:使用完整训练数据计算出的估计值
- random-guessing:随机猜测误差的估计(约为基础线,见[2])
- estimates:(如果
log_errors=true
)包含每次估计值的向量 - min-individual-errors:(如果
log_individual_errors=true
)包含每个测试对象个体误差的向量(true
表示有误差,否则为false
),对应于最佳(即最小的)估计值
简单示例
fbleau.run_fbleau(train_x, train_y, test_x, test_y, estimate='knn',
knn_strategy='ln', distance='euclidean', log_errors=false,
log_individual_errors=false, delta=None, qstop=None,
absolute=false, scale=false)
待办事项
目前,这里提供的代码
- 基于频率统计和最近邻方法;未来我们希望扩展到其他机器学习方法;请注意,这不会影响结果的普适性,这些结果适用于任何“普遍一致”的分类器,
- 一次计算一个估计值(即要计算多个估计值,需要多次运行
fbleau
);这可能在将来改变。
短期
- 返回各种泄漏度量(而不是仅R*)
- 重置估计值
中期
- 同时预测多个估计器的结果
- 从标准输入获取训练数据(在线模式)
也许
- 其他机器学习方法(例如,SVM,神经网络)
- Python 绑定
黑客攻击
如果您想尝试这段代码,可以在克隆存储库后使用以下命令编译它
cargo build
要编译Python模块,需要启用可选功能python-module
;这需要夜间的Rust。安装maturin(pip install maturin
),然后编译
maturin build --cargo-extra-args="--features python-module"
参考文献
[1] 2017, "Bayes, not Naïve: Security Bounds on Website Fingerprinting Defenses". Giovanni Cherubin
[2] 2018, "F-BLEAU: Fast Black-Box Leakage Estimation". Giovanni Cherubin, Konstantinos Chatzikokolakis, Catuscia Palamidessi.
[3](博客)“用于量化黑盒安全性的机器学习方法”. https://giocher.com/pages/bayes.html
依赖项
~6–9MB
~152K SLoC