【问题标题】:Secure coding on send and receive data from C sockets. What kind of checks should I perform?从 C 套接字发送和接收数据的安全编码。我应该进行哪些检查?
【发布时间】:2020-09-08 15:44:21
【问题描述】:

我正在编写一个使用 C 套接字的应用程序。我对send()recv() 都进行了一些检查(请参阅下面的代码),但我不确定它们是否就足够了。应该执行哪些其他检查来保护 C 套接字的安全编码?

ssize_t nbytes;
void send_stuff(int socket_fd, TYPE stuff, size_t EXP_BYTES){
  nbytes = send(socket_fd, (void*)stuff, EXP_BYTES, 0);
  if(nbytes < 0){
    fprintf(stderr, "Error in sending stuff from socket %d. Error: %s\n", socket_fd, strerror(errno));
    exit(1);
  }
  if((unsigned long) nbytes < EXP_BYTES){
    fprintf(stderr, "Stuff not entirely sent on socket %d. Error: %s\n", socket_fd, strerror(errno));
    exit(1);
  }
}

recv() 也一样,比照了

【问题讨论】:

  • 取决于“安全”的含义。您的代码与安全性无关,只是一种理智。
  • 是的,它有。但是机密性、完整性、身份验证等不在我的问题范围之内。我指的是代码清理以消除其可能的漏洞
  • 计算机只做你告诉它的事情。你不必告诉它不要做错事。你只需要不要告诉它做错事。大多数“不安全代码”都是一个错误,程序员告诉计算机要做的事情是愚蠢的。例如,在这里你告诉它如果没有一次性发送整个消息就放弃。因此,攻击者可以通过故意建立慢速连接来使您的程序崩溃。这是你想要的吗?
  • 没有“删除可能的漏洞”。有漏洞,也有没有漏洞的代码。可能的漏洞列表很有用,因此您可以检查您是否不小心写了一个。但是如果没有漏洞,您将无法删除!
  • 这是用于 TCP 套接字还是 UDP?如果是前者,您需要为小于预期大小的读取做好准备——这种情况发生是正常的,而不是错误。

标签: c sockets secure-coding


【解决方案1】:

我建议添加 md5sum。 MD5 是 128 位加密哈希,如果使用得当,它可以用来验证文件的真实性和完整性。

char *str = buffer;
unsigned char digest[16];

    while (length > 0) {
        if (length > 512)
            MD5_Update(&md5, str, 512);
        else
            MD5_Update(&md5, str, length);
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &md5);

然后您可以将 md5sum 添加到缓冲区的末尾并将其与数据一起发送

char *out = (char *) malloc(33);
    int n;
    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n * 2]), 16 * 2, "%02x",
             (unsigned int) digest[n]);
    }
for (i = 0; i < 33; i++) {
        buffer[msgsize + i + 1] = out[i];
    }

然后在另一边(服务器),你可以提取md5sum,再次计算,并与那边计算的md5sum进行比较。

int n;
    for (n = 0; n < 33; n++) {
        md5recv[n] = buffer[msgsize + n + 1];
    }

//或者如果确切的消息大小未知

int n;
    for (n=0; n <33; n--) {
        md5recv[n] = buffer[msgsize -33+n];
    }

然后对接收到的数据计算md5sum,并与md5recv[]中的一个进行比较。

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2014-12-09
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多