CSE_lecture23:secure data flow
Secure Data Flow
taint tracking
为了防止数据暴露,希望系统具备观测数据流动的能力(taint training),即对数据进行标记
对于外部进入的数据,认为其不安全,设置taint status为true,从而标记出所有与外部数据相关的数据,如出现jump xxx,这个xxx的taint status为true,认为代码出现问题。taint的overhead极大,可能翻四十倍
taintdroid对taint的操作进行分层,高层只使用粗粒度的taint,包括对整个数据库、对整个文件、对整条消息加taint;而只对java虚拟机做细粒度的变量级的taint跟踪;而对于cpp库则提前进行分析,届时只需根据调用关系得到taint情况即可。这样就实现了性能的优化
defending malicious input
一个攻击者根据以下步骤寻找bug:
- 寻找契机
- 寻找冷门部分的bug,因为测试可能性很小
- 设计input data,这是攻击者可控的
- 追踪input data
taintcheck用于监测input data在使用taint后的整个流动过程。当用于IO量大时overhead受影响不够明显
secure channel
跨机器传输数据需要进行加密
对称加密为:
1 | |
即加密和解密使用的密码一致
1 | |
即使拥有key,也无法通过token得到message,类似于加密哈希。两者联合使用,可以在获取message的同时判断是否被篡改
问题在于replay attack可以窃取到发送的信息进行重发
通过在message中加入sequence来避免replay attack
此时reflection attack利用发送者和接收者的counter不一致,将发送者的消息发回发送者
使用两个密钥来进行加密,A给B发送的消息用key1加密,B给A发送的消息用key2加密
使用Diffie-Hellman key exchange让A和B共享密钥,A持有随机数a,B持有随机数b,共享质数p和随机数g后计算 $key = g^{ab} \ mod \ p$ 即可
但攻击者可以拦截key的分享过程,进而参与到A和B的通信过程中去
这种攻击方法无解,因此引入RSA,即非对称加密,使用其中一个密钥加密时,必须用另一个密钥解密
在加密和解密时,加密用公钥,解密用私钥;在签名和验证时,签名用私钥,验证用公钥
1 | |
public_key公开,A给B通信时使用公钥发送消息,从而验证B的身份。获取途径为,B提供证书(CA),其记录公钥,并包含签名,届时即可验证该签名
privacy
既要保证使用数据,又要保证数据不被窃取
OT: obvious transfer
假设A持有两个电话号码,现在B希望获取其中之一,需要保证B不知道另一个电话号码,也不让A知道B选的哪个
DP: differential privacy
B持有每个人的详细工资信息,A希望进行统计,但需要保证A无法知道具体每个人的工资信息。为了防止A通过作差反推具体每个人的工资信息,只提供约数;同时限制提问次数
secret sharing
希望将秘密分为n份,当有k个人时即可恢复秘密
HE: homomorphic encryption
同态加密后的数据依然可以参与计算并提供给计算资源,届时解密即可
TEE: trusted execution environment
计算资源只在cache使用明文,memory放置密文,而cache极难窃取