【问题标题】:What is premature close as for network programming?什么是网络编程的过早关闭?
【发布时间】:2019-11-21 07:09:06
【问题描述】:

我正在阅读 An Introduction to OpenSSL Programming ,这是 图 6 中的代码

while(1){
    r=SSL_read(ssl,buf,BUFSIZZ);
    switch(SSL_get_error(ssl,r)){
        case SSL_ERROR_NONE:
            len=r;
            break;
        case SSL_ERROR_ZERO_RETURN:
            goto shutdown;
        case SSL_ERROR_SYSCALL:
            fprintf(stderr,
            "SSL Error: Premature close0");
            goto done;
        default:
            berr_exit("SSL read problem");
}
        fwrite(buf,1,len,stdout);
}

在下面,在 错误处理 部分,它说:

错误处理

如果返回值是负数,那么一些 发生了某种错误。我们担心两种错误 与:普通错误和“过早关闭”。我们使用 SSL_get_error() 调用以确定我们遇到了哪种错误。错误 在我们的客户端处理是非常原始的,所以大多数错误我们 只需调用berr_exit() 即可打印错误消息并退出。 为时过早 关闭必须特别处理

什么是过早关闭? (我没有找到任何与SO相关的东西)为什么这里说需要特殊处理?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    有过度简化的风险:

    1. 在 TCP/IP 级别,TCP 连接可以“正常关闭”(双方发送 FIN 以关闭各自的连接)或“突然终止”(一方或另一方获得 RST)。你可以在RFC 783阅读更多内容。

    2. SSL 在 TCP/IP 之上引入了其他协议。

    3. 旧版本的 SSL 容易受到“截断攻击”:

    https://www.cs.cmu.edu/~srini/15-441/F02/Projects/lab01/reference/part1.pdf

    TCP 使用一个 FIN 段来表示发送方已经发送了它所有的 数据。 SSL 版本 2 只允许任何一方发送 TCP FIN 到 终止 SSL 连接。这允许“截断攻击”: 攻击者可以使消息看起来比它短 只是通过伪造一个 TCP FIN。除非受害者有其他方式 知道期望的消息长度会简单地相信 它收到了一条较短的消息。

    1. SSLv3 引入了“close_notify 警报”来缓解这个潜在的安全问题:

    close_notify 是一条 SSL 消息(因此是安全的),但 不是数据流本身的一部分,因此不会被 应用。 close_notify 后不能传输任何数据 已发送。

    因此,当 SSL_read() 返回 0 时表示套接字已 已关闭,这实际上意味着 close_notify 已 已收到。如果客户端在接收之前收到FIN close_notify,SSL_read() 将返回错误。这被称为 “过早关闭”。

    1. “不幸的是”,文章继续说,“发送过早关闭是一个相当常见的错误,在客户端中尤其常见”。它们应该与其他错误“不同”地处理。或者有时甚至最好忽略。

    这是另一个不错的链接:https://stackoverflow.com/a/28056464/421195

    【讨论】:

    • OK 。两者都被客户端突然终止或截断攻击会导致过早关闭,现在最好的做法是忽略过早的错误,因为您无法判断它是攻击还是常见错误。那么引入close_notifyalert..是什么意思呢?有点好笑……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2012-12-06
    • 2012-04-27
    • 1970-01-01
    • 2023-03-27
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多