zoukankan      html  css  js  c++  java
  • 汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码

    OpenSSL 心血(HeartBleed)漏洞 是openssl 在 2014-04-07 发布的重大安全漏洞(CVE-2014-0160)这个漏洞使攻击者可以从server内存中读取64 KB的数据,甚至获取到加密流量的密钥。用户的名字和password。以及訪问的内容。

    主要影响版本号 OpenSSL 1.0.1 到 OpenSSL 1.0.1f 以及 OpenSSL 1.0.2 Beta1

    不受此漏洞影响的 OpenSSL版本号信息:
    OpenSSL 1.0.1g 已修复该漏洞 ,以及g以上预计也修复了
    OpenSSL 1.0.0 分支版本号不受此漏洞影响
    OpenSSL 0.9.8 分支版本号不受此漏洞影响 ///汉澳sinox系统使用的openssl版本号
    OpenSSL 1.0.2 Beta2 不受此漏洞影响

    root@www:~ # openssl version
    OpenSSL 0.9.8y 5 Feb 2013

    可是假设用户升级到OpenSSL 1.0.1 到 OpenSSL 1.0.1f。就会面临漏洞攻击。用户编译安装定义了OPENSSL_NO_HEARTBEATS。也能够避开此漏洞。

    引入心跳这个功能应该是为了保持client与server的连接。事实上这个不是必须的。

    #ifndef OPENSSL_NO_HEARTBEATS
    int
    dtls1_process_heartbeat(SSL *s)
    {
    unsigned char *p = &s->s3->rrec.data[0], *pl;
    //rrec是心跳包ssl3结构,用户发来的数据包

    /×typedef struct ssl3_record_st
        {
            int type;               /* type of record */
            unsigned int length;    /* How many bytes available */
            unsigned int off;       /* read/write offset into 'buf' */
            unsigned char *data;    /* pointer to the record data */
            unsigned char *input;   /* where the decode bytes are */
            unsigned char *comp;    /* only used with decompression - malloc()ed */
            unsigned long epoch;    /* epoch number, needed by DTLS1 */
            unsigned char seq_num[8]; /* sequence number, needed by DTLS1 */
        } SSL3_RECORD;

    */
    unsigned short hbtype;
    unsigned int payload;
    unsigned int padding = 16; /* Use minimum padding */

    if (s->msg_callback)
    s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
    &s->s3->rrec.data[0], s->s3->rrec.length,
    s, s->msg_callback_arg);

    /* Read type and payload length first */
    if (1 + 2 + 16 > s->s3->rrec.length) //patch
    return 0; /* silently discard */             //patch
    //这个是补丁,长度为0的心跳包,就返回不要处理
    hbtype = *p++;//运行后就是心跳包用户设置的payload,用户能够随意设置
    n2s(p, payload);//宏n2s从指针p指向的数组中取出前两个字节,并把它们存入变量payload中,p是client的数据。能够设置0xFFFF,最大65535
    if (1 + 2 + payload + 16 > s->s3->rrec.length)   //patch
    return 0; /* silently discard per RFC 6520 sec. 4 */  //patch
    //这个是补丁,用户设置payload长度+19超过心跳包实际长度,就返回不要处理

    pl = p;

    if (hbtype == TLS1_HB_REQUEST)
    {
    unsigned char *buffer, *bp;
    unsigned int write_length = 1 /* heartbeat type */ +
    2 /* heartbeat length */ +
    payload + padding;
    int r;

    if (write_length > SSL3_RT_MAX_PLAIN_LENGTH)
    return 0;

    /* Allocate memory for the response, size is 1 byte
    * message type, plus 2 bytes payload length, plus
    * payload, plus padding
    */
    buffer = OPENSSL_malloc(write_length);
    bp = buffer;

    /* Enter response type, length and copy payload */
    *bp++ = TLS1_HB_RESPONSE;
    s2n(payload, bp);//宏s2n与宏n2s干的事情正好相反:s2n读入一个16 bit长的值,然后将它存成双字节值,所以s2n会将与请求的心跳包载荷长度同样的长度值存入变量payload
    memcpy(bp, pl, payload);
    //假设用户并没有在心跳包中提供足够多的数据,会导致什么问题?比方pl指向的数据实际上仅仅有一个字节,那么memcpy会把这条SSLv3记录之后的数据——不管那些数据是什么——都复制出来。

    后面那些数据可能存有其它用户的密钥。username和password。

    这个就是c语言的内存指针。编写者没有考虑到payload会超过数据实际长度的情况。要检查才行。

    非常幸运,汉澳sinox没有碰上这个漏洞。这是程序设计者添加新功能引入的新漏洞。而bash漏洞则是非常久就有的一直没有被发现。所以新版本号不意味就更好,由于没有充分測试修复可能产生的新bug.

  • 相关阅读:
    MySQL性能调优语句
    APP测试
    JForum项目搭建
    Bug的等级及定位
    mysql any和all的用法
    mysql产生随机数
    MySQL存储过程例子
    【转】 卡特兰数
    牛客小白月赛5 I 区间 (interval) 【前缀和】
    牛客小白月赛5 D 阶乘(factorial) 【前缀】
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6814809.html
Copyright © 2011-2022 走看看