总结:接下来,作者从密码算法的误用开始,改进了一些常量静态分析工具。 具体来说,是基于动静态分析方法相结合、在线记录文件、离线检测分析相结合的策略,使整个工具更加完善。
本文的目标:准确性论文“CRYLOGGER:动态检测加密滥用”。
针对密码算法的API利用,本文是上一篇文章CryptoGuard的改进版本,实现了一个动态与静态相结合的开源自动检测工具。 该论文于 2020 年发表于 S&P。 点击免费获取该工具。 基准测试工具与 CryptoGuard 使用的同一篇论文。 这是 CryptoGuard 实现的基准测试工具的链接。 研究工作正在逐步取得进展。 我们都站在巨人的肩膀上。 接下来要爬到哪里取决于我们~
想想看,在两种想法之间:流行的“自动检测”在三种想法之间:为通用配置规则?思想之间的密码库 4:检测细节 - 长代码警告!五个思想:这个工具好用吗?六个思想之间:涉及逆向工程。 七念之间:还是有局限性...
一念之间:目前的密码算法有哪些
对于密码算法来说,系统最重要的是保证安全性?您钥匙的安全。 从算法的角度来看,如果你想保证你的系统的机密性,就需要关注加密算法。 如果你想确保系统的完整性,你应该注意加密哈希函数。
当然,有很多学者在研究这些基本的加密算法,但到目前为止他们还没有能够找到完全安全的加密算法。 尽管我们不能保证我们的算法完全准确和安全。无法保证该算法的实施不会被利用或其他漏洞。
请举一个具体的例子:椭圆曲线加密算法的理论看起来很有前途。 我们的身份证就是用这个算法来加密的,2012年初就有一些学者在用这个算法来加密。 OpenSSL算法中的一个bug使得椭圆曲线加密算法的完整私钥被获取。 即使您获得了密钥,您的系统也可能根本没有安全性。
抛开算法的理论层面,考虑上述算法的实现,几个与密码学相关的新问题就出现了。 2013 年,学者们进行了一项研究,发现从 Google Play 商店下载的 Android 应用程序中有 88% 至少存在一种类型的加密漏洞。 具体来说,在确保系统机密性的层面上,一些应用程序使用硬编码密钥进行加密,而不是真正的随机密钥。 某些 Android 应用程序的哈希函数可能会在确保系统完整性的层面上发生冲突。 、SHA1 等
近年来,研究人员致力于分析各种情况下的密码滥用情况。 ① 从 Stack Overflow 获取的代码片段不安全。 有研究人员通过 Stack Overflow 获取了一些 Android 应用程序 98% 的代码片段,对其进行分析后发现,其中大部分都存在严重的加密问题。 ② 应用程序编程接口(API)过于复杂,是Java中密码滥用的主要根源。 API 的复杂性要求开发人员专注于低级决策,例如选择加密算法的填充类型,而不是高级任务。 ③ 部分Python加密库不完整。 研究人员发现,Python 密码学库的文档不明确、代码示例不足、API 默认设置不正确。 ④ 第三方库不安全。 Android 上 90% 的加密漏洞源自第三方库。
这就是检测工具的创建方式,因为发现问题是解决问题的先决条件。 由于上一篇文章中的CryptoGuard号称是第一个也是最好的静态分析工具,也许作者读完CryptoGuard后有了新的想法,立即开始了他的第一个动态检测工具。工具。 接下来,作者从 API 滥用密码算法入手,改进了 CryptoGuard 静态分析工具的几个常量。
具体来说,CRYLOGGER是一种基于CryptoGuard的动态和静态分析技术相结合的策略。 在线记录日志文件,离线发现分析,使得整个工具更加完整。 让我们一步步拆解CRYLOGGER吧~
思考之间:流行的“自动检测”
自动化越来越流行,检测工具也不例外。 在介绍Dynamic CRYLOGGER之前,我们先来说说大家津津乐道的“自动检测”! 这是 CRYLOGGER 工具设计中的重要一步。
总的来说,“自动发现”的思想主要涉及两个方面: (1)定义一组加密规则。 (2) 通过验证加密API传递的参数来检查您的应用是否合规。 规则。
标准规则(依据) ◾ 论文中的加密算法或其设置错误导致的漏洞。 由 NIST 和 IETF 等组织和团体定义的密码学相关标准。
您能举个例子吗?: ① 设置加密的最小密钥大小。 例如,RSA 是 2048 位。 ② 设置密钥导出的最小迭代次数(例如 PKCS#5 为 1000 次)。
遵循规则 ◾ 静态方法:主要利用程序切片检查CrySL、CryptoLint、CryptoGuard、MalloDroid、CogniCrypt、CMA等加密API的参数。 优点:无需执行。 完整的代码分析,可扩展。 缺点:误报。 与我们在上一篇文章中讨论的CryptoGuard类似,它可能会导致分支被过早地剪枝(可能是由于上一篇文章中讨论的剪枝深度控制问题),或者一段代码需要修复很多。误报的来源,例如缺失数据。 它是动态加载的(可能是由于上一篇文章中提到的问题)。 幻想图书馆问题)。 ◾ 动态方法:优点:加密API必须在运行时触发,从而减少误报。 缺点:使用困难,不支持静态方法的加密规则。
也就是说,我们目前正在考虑静态分析。许多人使用动态分析技术,但很少有人考虑动态分析技术。 这也是作者发现的一个研究空白。
让我们看看CRYLOGGER如何使用自动发现:
上面两个方面,即配置规则和遵守规则仍然很重要。
记录器规则:扩展 Java 加密库 ═▶ 跟踪(检测)加密算法的 API 调用 ═▶ 要查看加密规则的关联参数值,必须使用日志文件记录(存储)。 示例:上图中的记录器将消息摘要 (SHA1) 和对称加密 (AES) 的算法名称存储在您的应用代码中。 跳棋遵守规则。 在线运行后,═▶ 离线分析日志文件,并 ═▶ 生成应用程序违反的规则列表。 需要一系列的检查过程。 每个检查过程都包含许多加密规则,如上图中的一条(红色感叹号)。 检查人员发现该应用程序使用不安全的哈希函数(SHA1)作为消息摘要算法。
为什么需要将上述两个过程分开?(1)密码库的参数是稳定的。 也就是说,不太可能添加新的参数。 例如,密钥派生算法的唯一关键参数是盐值(Salt)、密码(Password)和迭代次数。 (2) 如果加密规则不确定并且新规则针对新的漏洞,则必须更新当前规则。 例如,RSA 的最小密钥大小是可变的。 (3)加密规则与上下文相关,但有些规则可能与系统上下文无关。 (4)在线检查规则会影响性能,但离线不会。 这对于某些应用程序中的关键响应非常重要。
既然您知道从哪里开始使用这个工具,那么让我们更清楚地理解这两个过程。
三思之间:为通用密码库配置规则
首先上图:该图展示了经典密码库的七个主要安全点。 (1)消息摘要。 (2)对称加密。 (3) ) 非对称加密。 (4)密钥推导。 (5)随机数生成。 (6)密钥存储。 (7) SSL/TLS/证书。
当然,这仅包括现有的静态工具使用的类以及在 Java 和 Android 中实现的相应类是利用最多的,但该库仍然不完整。 因此,作者增加了规则的可扩展性,用户现在可以添加他们需要的检测规则。
现在我们来解释一下这个图的具体含义:
(1)消息摘要-用于检查数据完整性
p> [输入](任意长度)数据↓哈希函数 ↓ [输出](固定长度) hash = 摘要
[关键参数] alg:用作哈希函数的算法(例如 SHA1、SHA256)。 不同的库支持不同的算法。
(2) 对称加密分组密码
[输入] (固定长度) 组数据 = 大小 + (算法定义长度) 密钥 ↓ 分组密码 ↓ [输出] 组数据 = (加密后) 密文或者(解密)明文
[关键参数] alg:加解密使用的算法,如AES。 钥匙:钥匙。 #block:固定大小的分组数据。 模式:处理多个分组数据的多种操作模式,包括电子码本模式(ECB),它允许对分组数据进行独立的加密和解密。 密码块链接模式 (CBC)、代码反馈模式 (CFB)、输出反馈模式 (OFB) 和伽罗瓦/计数器 (GCM),允许每个明文数据包与前一个密文数据包进行异或。 iv:初始化向量。 定义需要异或的第一个分组数据。 Pad:用于配置数据包大小的填充算法,例如ZEROPADDING、PKCS#5、PKCS#7,其中最后一个数据包用零填充。
(3)非对称加密的公钥加密算法
[发送方] [发送方] | [发送方] [发送方] ↓↑|↓↑接收方泄露 使用密钥 使用接收方私钥进行加密和解密| 使用发送者的私钥进行签名,并使用发送者的公钥进行验证 ↓↑|↓↑[收件人][收件人]|[收件人][收件人]
[密钥参数] alg:用于加密的算法,例如 RSA。 椭圆曲线(EC)、数字签名名称算法 (DSA)。 key:使用的公钥/私钥对。 PAD:NOPADDING、PKCS1-v1.5、PSS 等算法。
(4)密钥推导
【输入】密码或密码 ↓加盐 ↓哈希函数 ↓经过一定次数的迭代后 ↓【输出】密钥
【密钥参数】 pass:密码输入或密码。 盐:盐值。 这是一个随机值。 iter:用于生成密钥的固定迭代次数。 迭代次数越多,就越不容易受到暴力攻击。
(5)生成随机数本文仅假设两种类型的算法:Secure 和 NotSecure。
【主要参数】 alg:如果要生成适合加密的随机数,则使用secure算法,否则使用NotSecure算法。 out:生成随机数的字节。 种子:生成的种子。
(6)密钥存储——存储加密密钥、证书等敏感内容。
【关键参数】 pass:输入的密码或密码。
(7) SSL/TLS/证书。
【主要参数】 urlprot:HTTP或HTTPS连接。 allhost:检查是否接受所有主机名。 allcert:检查证书是否可信。 sethost :SSL/TLS 连接的主机名验证。
以上是需要关注的加密算法漏洞。
❗请稍等,照片中的圆圈尚未引入❗
别担心。 前面的《阅读材料》中提到,主要有两种。 规则设置的基本原理:由加密算法或其错误配置引起的漏洞。 由 NIST 和 IETF 等组织和机构定义的密码学相关标准。
作者从NIST和IETF发表的论文和官方文档中收集了CRYLOGGER应该支持的规则,并创建了下表。 具体来说:
? R-01 不允许使用不安全的应用程序完整的哈希函数,即可能导致冲突的函数,例如SHA1。
? R-02禁止使用Blowfish、DES等不安全的对称加密算法。
? R-03 和 R-04 不允许应用程序使用 ECB 和 CBC 操作模式。 ECB保持相同的明文加密格式不变,这破坏了语义安全属性,使其容易受到攻击。 另一方面,CBC 很容易受到 C/S 中的 padding oracle 攻击。
? R-05 和 R-06 限制密钥生成。 对称加密的密钥由应用程序随机生成,而不是硬编码常量。 密钥的随机生成器必须是安全的;
? R-07 和 R-08 与前一个类似。 对称加密需要使用 IV 而不是密钥。 作者认为,当 IV 与某种操作模式(例如 GCM)匹配时,它总是随机且非恒定的。 作者认为使用 IV 可以提高数据机密性。
? R-09 不允许重复使用相同的(密钥/IV)对来加密不同的消息。 因为重用是可以预测的。
? R-10 和 R-05 相同。 这是密钥生成中使用的盐值。
? R[k4 ]11 salt 值必须足够大(≥64 位)。
? R-12 禁止重复使用相同的盐值,因为这违背了为相应密码添加随机性的目的。
? R-13 密钥生成算法有足够的迭代次数来防止暴力攻击。
? R-14 和 R-15 不允许使用列入黑名单的密码,这使得它们更难以破解。
? R-16 禁止使用固定密码。
? R-17 需要使用随机值而不是伪随机数生成器 (PRNG) 种子 A 的常量值。 由于常数种子产生的数字序列是可预测的,
?]18 应用程序不能使用未经批准的 PRNG,例如 java.util.Random。
? R-19、R-20 和 R-21 不允许 RSA 算法设置的某些方面。 密钥必须至少为 2048 位,加密/解密必须使用不同于 NOPADDING 和 PKCS1-v1.5 的填充算法。
? R-22 禁止使用 HTTP,并要求使用更安全的 HTTPS。
? R-23 禁用使用静态密码来存储密钥。
? R-24 和 R-25 需要正确验证主机名和证书。 禁止接受所有主机名或所有证书。
? R-26 禁止修改标准主机名验证器,因为这可能会导致不安全的 SSL/TLS 通信。
所有规则已在上面解释。 下面开始你的测试。
六个想法之间:检测详细信息 - 长代码警告!五个想法:这个工具易于使用吗? 六个想法之间:涉及逆向工程。 七念之间:还是有限制的……
评论前必须登录!
注册