欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2016-7054:OpenSSl 1.1.0a 、1.1.0b堆溢出漏洞利用

来源:本站整理 作者:佚名 时间:2016-12-21 TAG: 我要投稿

几天前,Fortinet发表了一个题为“OpenSSL ChaCha20-Poly1305堆溢出(CVE-2016-7054)分析”的文章。OpenSSL程序库中的一个高危堆溢出漏洞被发现,影响1.1.0a和1.1.0b版本。漏洞代码位于openssl-OpenSSL_1_1_0a\crypto\evp\e_chacha20_poly1305.c文件中。
让我们看一下这段存在漏洞的代码:
//Line No 196
static int chacha20_poly1305_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
        const unsigned char *in, size_t len)
       {
       ...
       //Line No 241
       } else { /* ciphertext: Decrypt the ciphertext */
           Poly1305_Update(POLY1305_ctx(actx), in, plen);
           chacha_cipher(ctx, out, in, plen);
           in += plen;
           out += plen; //out points to the end of the buffer where decrypted ciphertext is stored.
           actx->len.text += plen;
       }
      ...
      //Line No 293
       Poly1305_Final(POLY1305_ctx(actx), ctx->encrypt ? actx->tag
            : temp); //Generate MAC from the ciphertext
            actx->mac_inited = 0;if (in != NULL && len != plen) { /* tls mode */
            if (ctx->encrypt) {
                memcpy(out, actx->tag, POLY1305_BLOCK_SIZE);
             } else {
                if (CRYPTO_memcmp(temp, in, POLY1305_BLOCK_SIZE)) {
                    /* If the generated MAC doesn't match the one sent along with ciphertext...
                       Clear the buffer where ciphertext was stored, but notice that 'out' points
                       to the end of the buffer ** So extra space from heap will be cleared **
                     */
                     memset(out, 0, plen);
                     return -1;
                }
             }
      }
      else if (!ctx->encrypt) {
          if (CRYPTO_memcmp(temp, actx->tag, actx->tag_len))
              return -1;
          }
      }
      return len;
}
CHaCHa20流密码和Poly1305消息认证码
ChaCha20
ChaCha20是Salsa20算法的改良版,使用256比特密钥。ChaCha20连续的使用同一个密钥和随机数调用ChaCha20块函数,并连续增加块计数器参数。然后,ChaCha20以小字节序(little-endian order)对结果进行序列化处理,得到密钥流数据块。这个密钥流数据块将与明文进行异或运算得到密文。
ChaCha20的输入:
1. 256比特密钥
2. 32比特初始计数器
3. 96比特随机数(IV)
4. 任意长度的明文
其输出是与明文长度相同的密文。
Poly1305
Poly1305是一个一次性的验证器,其输入为:
1. 32比特的一次性密钥
2. 一段消息
其输出是16字节的标记(Tag),用于验证消息。Poly1305使用AES加密随机数,但是AES可以被任意的带密钥的函数替代,就像这篇论文描述的。
因此使用ChaCha20-Poly1305我们得到:

至此,我们已经知道足够的基础知识,现在我们可以进行深入分析。下一步,我们尝试通过生成带有错误标记的TLS消息来触发有漏洞的代码。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载