【论文笔记】搞 CryptoGuard 的那伙人有新动静了 —— 除了Java,C/C++也得搞起来呀~

本文目标:速读论文 “From Theory to Code: Identifying Logical Flaws in Cryptographic Implementations in C/C++∗” 。

前一篇文章提到:密码 API 误用的静态工具有针对 C 的研究。好巧不巧的,这篇工具类文章和 CryptoGuard 的作者是同一人!该论文好像没有具体发布的时间,大概会发布在 TDSC 的未来一期,文章页眉也注释了“该文尚未完全编辑”,所以这也可以解释论文有些语句不完整的情况。我估计作者是在占坑啊☠,来看看这个坑大不大~


坑的蓝图

  • 🐾现状
    ① 在许多应用程序(例如 HTTPS 、 DNSSEC 、 SMTP-over-TLS )中,加密协议/结构 通常是 作为提供强大安全保证的 构建块,但依赖密码学的应用程序缺乏可证明的安全保证。(例:OpenSSL 中的 heartbleed 漏洞 和 Juniper Network 中的 seed leaking)。
    ② 现有工作单一:要么只精确检测应用程序对加密 API 的滥用(如该作者的cryptoguard);要么只识别加密库中特定于协议的漏洞。

  • 🐾gap分析
    密码库/结构/参数本身不安全。应用程序使用了 易受攻击的密码库 或 不安全的密码构造/参数(例:MD5 哈希函数);
    加密结构使用不规范。在不满足其要求的前提条件下使用加密结构(例:初始化向量不随机);
    API调用不规范。根本没有调用底层密码库的正确API、没按规定顺序调用、调用了不正确的参数(例:X.509证书链验证后没有进行主机名验证);
    代码漏洞。应用程序存在逻辑/运行时漏洞(例如,缓冲区溢出)。

  • 🐾文章目标:提供技术支持,帮助开发人员规避上述漏洞。

  • 🐾理论支持:上述许多漏洞都可以映射到 meta-level 属性 的实现违规上去。
    meta-level 属性:实现加密属性所必需的程序属性】

  • 🐾创新点:TAINTCRYPT 使用污点跟踪技术检测 C/C++ 中的 library-level 和 application-level 的漏洞。

    • 💨 Library-level coding 漏洞
      ◾ 编码错误(比如由于不正确的循环条件而过早地退出一个 for 循环);
      ◾ 漏洞(比如密钥泄漏);
      ◾ 完整性问题及误用(比如秘密被不安全存储)。

    • 💨 Application-level implementation 漏洞
      ◾ 这类漏洞大多与 API 误用有关(比如错误调用或配置 SSL 库的 API;使用过时的加密原语;故意禁用安全机制)。

  • 🐾实验假设
    为了解释元级属性,假设一个处理客户端命令的虚拟应用程序。
    为了保证提交命令的完整性,它使用了一个8字节的消息认证码(MAC)方案,假设 MAC 方案享有所需的抵抗存在伪造的安全属性。

  • 🐾主要工作:针对加密协议的实现,提出新范式: 加密程序分析 (CPA) —— 规定使用程序分析方法,以开发编译时的不安全检查和安全增强解决方案,主要检测 meta-level 属性 的违规情况。
    ① 开发了基于 确定性有限自动机 (DFA) 的 规范语言
    ② 开发了静态工具: TAINTCRYPT —— 基于 LLVM 的实用工具,针对用 C/C++ 实现加密的情况,使用 静态污点分析 ,在编译时识别 meta-level 属性违规。

  • 🐾规则来源
    ① 调研有关加密实现缺陷的现有文献;
    ② 观察 OpenSSLs 版本的变更日志(第 3 节)。
    对密码实现中的 25 类可利用漏洞分类,归结为 12 种不同类型的安全攻击。
    从漏洞研究和分类法中得到 25 条可执行规则(meta-level 属性),它们解决了所识别的 12 种安全攻击中的 6 种。
    静态分析可用于这些规则中的 23 条,是证明属性成立的充分条件。
    根据工具 TAINTCRYPT 的执行探索到15条安全规则。

  • 🐾测试来源:开源 C/C++ 加密库(例如 OpenSSL)、5 个流行的应用程序和库(证明可扩展性)

  • 🐾应用场景:在编译时检测

  • 🐾针对对象:开发人员


🌰基本的编程错误例子:
在这里插入图片描述
见上图,在这种情况下,全局变量(prng_temporaryprng_output_index)的共享使用,会导致函数 prng_generate() 在第 16 行调用prng_reseed() ,从而泄漏敏感数据 prng_seedprng_reseed() 中的第 5 行)。
另外,还有OpenSSL 中的 heartbleed 漏洞(CVE-2014-0160),它可能泄露敏感信息(加密密钥、PRNG seeds等)。

这类问题的挑战性在于:通常错误修复一个问题可能会导致新问题。对于大型密码软件,手动方法不可行,而自动化的安全防御/执行机制则是强制性的。

本文使用静态信息流分析,以检测密码代码中各种类型的敏感数据泄漏;本文不针对侧信道漏洞(如 RSA padding oracle )。


挖坑:🌸找规则

一组安全规则(应被强制执行):
表1

  • 针对 IV 的选择明文攻击
    • 表中第1行:密码要避免使用 ECB 模式的安全实施规则
    • 表中第2行:攻击与 CBC 模式加密中的 IVs 可预测性有关。

本文提出了基于静态信息流分析的机制来检测这些漏洞。

  • 针对 PRNG 攻击
    • 表中第11行:随机数要随机生成。(密码方案依赖于由安全随机数生成器生成的密钥和 cryptographic nonce generation )
    • 表中第9行:PRNG 可预测(可预测的 seeds )
    • 表中第10行:PRNG 不可信( backdoor-able PRNG )
    • 表中第19行:由编程错误导致的多重漏洞级联,导致 Juniper 网络中的 PRNG seeds 泄漏。NIST的PRNG标准被可能也有问题。

本文演示了如何利用静态程序分析来检测此类漏洞。

  • 传统密码误用
    • 中间人攻击者
    • 表中第5,6,23行:弱哈希函数(如在 TLS、IKE 和 SSH 上使用 MD5 或 SHA-1 )(非对称加密、对称加密、hash函数)

可以使用静态分析来检测相应的漏洞。

  • Padding Oracles 漏洞
    • (1)对称密码中的Padding Oracles
      利用服务器泄露的信息更改密文,在不知道密钥的情况下解密密文。
      利用计时侧信道漏洞,不检查 MAC 上填充的错误密文。
      表中第3行:总结了 Padding Oracles 对 CBC 模式加密的攻击。
    • (2)非对称密码中的Padding Oracles
      利用计时侧通道来区分密文的正确格式和错误格式。
      表中第4行:总结了 Padding Oracles 攻击。

可以使用程序依赖图,检测来自非常数时间实现的 Padding Oracles 。
💥 但消除这些侧通道非常困难,因为它依赖于程序控制流。

  • 侧通道攻击
    • (1)基于时间的
      时序侧信道很难检测,但可以检测一些相对直接的情况(如:由于提前终止的时间侧通道,可以使用程序依赖分析检测出来)。
      表中第7行:总结了基于时间的侧信道攻击。
    • (2)基于缓存的
      文章提出一种基于缓存的侧通道攻击,破坏 OpenSSL 对 DSA 签名方案的实现,并在 TLS 和 SSH 加密协议中恢复密钥。
      表中第8行:描述了基于缓存的侧信道攻击。

💥 TAINTCRYPT 无法检测这些侧通道漏洞!

  • 状态机漏洞
    • 利用不同加密协议的协议状态机漏洞进行攻击。(例:OpenSSL上的CCS注入攻击)
      表中第25行总结了这些攻击。

大多数技术都使用基于动态程序分析、基于模糊的输入生成机制 来检测由于状态机误用而导致的漏洞。
基于静态分析的检测机制还有待研究,关键挑战之一在于:随着协议内部状态的增加,计算复杂度将相应地呈指数增长。

  • 编程错误
    C/C++安全软件中,网络安全漏洞的主要来源,包括从内存使用不当到内存管理不当的所有问题。
    • 内存使用不当包括:内存过度读取(例:heartbleed 攻击,表中第22行)、内存覆盖(例:缓冲区溢出,表中第16行)、整数溢出(表中第15行)、类型截断(表中第13行)、堆栈溢出(表中第24行);
    • 内存管理不当包括:分配的地址空间未释放(表中第21行)、同一块内存释放两次(表中第12行)和悬空指针(Dangling pointer)(表中第14行)。
    • 其他编程错误也普遍存在(表中第25行),如误处理加密密钥(例:使用硬编码密钥)。

本文使用静态程序分析来检测由各种编程错误引起的密码漏洞。


挖坑:🌸检测

🐾程序属性映射规则

◾ 25条安全规则中,有23条可以通过静态代码分析强制执行。
将密码规则( meta-level 属性)映射到静态分析属性上 ═▶ 获取证明违反密码规则的充分条件(不捕获必要条件的原因是违规未必是可利用的漏洞)。

◾ 23条规则中,有15条可以使用静态污点分析强制执行。
将这些规则映射到污点分析属性上 ═▶ 下面就是污点跟踪技术的常规做法了~

◾ 四种类型的函数标识:源、传播器、过滤器和汇聚点。
💨 源:输入函数,产生不可信输入;
💨 传播器:传播函数,将不可信数据从程序的一个点(通过变量)传播到另一个点;
💨 过滤器:无害处理函数,净化不可信变量并使其可信的函数。
💨 汇聚点:输出函数,某不可信输入到达的敏感目的地。

◾ 从污点分析来看完整性与机密性:
💨 完整性关注:“源”到“汇聚点”是否可达?是否对程序有篡改?
💨 机密性关注:“源”是否泄露任意信息到“汇聚点”处?

◾ 同样,模仿污点跟踪分析技术,定义确定性有限自动机(DFA): ( Q , P , δ , q 0 , F ) (Q, P , δ, q_0, F) (Q,P,δ,q0,F)
💨 Q = { q 0 , q 1 , q 2 , q 3 } Q = \{ q_0, q_1, q_2, q_3\} Q={q0,q1,q2,q3}
💨 P = { s o u r c e ( ) , p r o p a g a t o r ( ) , f i l t e r ( ) , s i n k ( ) } P = \{source(), propagator(), f ilter(), sink()\} P={source(),propagator(),filter(),sink()}
💨 δ δ δ取值:(大概就是个状态转移的意思)
 δ

💨 q 0 = { q 0 } q_0 = \{q_0\} q0={q0} and F = { q 3 } F = \{q_3\} F={q3}

使用不安全的原语
作者认为密码库提供了一个高级接口来支持广泛的密码函数(例如,哈希、对称密码、非对称密码、签名等),不论底层算法或模式,编码风格都保持一致。

从外部来源过滤数据。
来自外部源的数据在使用之前应该进行过滤,
如果我们将外部源定义为source(),将对任何外部数据敏感的函数定义为sink(),将任何消毒/过滤函数定义为过滤器,则
图4中的FSM可以用来检测从外部源到敏感sink避免过滤器的任何流。从图2的FSM中丢弃输入符号传播器()将导致图4中的FSM。因此,污点分析可以检测出所有此类违规行为。
其他规则的映射也可以类似地推导出来。
(未完待续…)

在其执行期间,每当应用程序接收到明文命令和它的 MACrmacmk 时,在处理命令之前,该命令会检查 MACrmacmk 的有效性。 MAC验证失败时,返回MACFAILwarning消息,否则返回OK。为了验证MAC,它首先通过使用它的keyk来构造MAC。假设构造了 MACiscmmacmk。然后通过比较cmacmk和rmacmk的每个字节来检查是否cmacmk=?rmacmk;当观察到第一个不匹配时,通过发送 MACFAIL 来停止比较。很明显,通过观察响应消息和接收到的响应消息的时间,不知道密钥的对手可以仅用 8×256 次而不是 2568 次尝试来伪造新消息的 MAC。基于[21]、[22]、[23]的先前工作,我们推测该缺陷可以很容易地映射到以下元级属性违规:“在加密有效载荷的比较期间没有提前终止”。同样,臭名昭著的 Bleichenbacher 对 RSA 的填充预言机攻击可以由于违反另一个元级属性而被安装:“每当协议遇到错误条件时,都应该发送相同的通用错误消息”。

许多元级属性可以特定于加密图形构造/协议。 为了实现此类元级属性的规范,我们提供了一种基于确定性有限自动机 (DFA) 的语言。 我们还开发了一个名为 TAINTCRYPT 的工具,它利用静态信息流分析来识别 C/C++ 实现中元级属性的违规行为。 我们的静态分析既是路径敏感的又是上下文敏感的,因此能够精确地执行一组丰富的加密属性(即小的误报)。

我们的工作针对并解决了将理论密码概念映射到实际代码结构和与安全相关的行为属性的基本挑战,这可能为密码软件提供广泛的基于代码的安全分析。 因此,这项工作是对密码库及其数百万行代码的应用进行系统化、自动化分析的重要第一步。 尽管静态信息流分析本身已被研究为推理密码代码安全性的通用方法 [21], [22]、[23] 中,如何利用这种通用技术来构建统一的工具来检测各种加密漏洞仍然没有开发。

2.2

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值