如何防止基于UDP的频道变成“后门”?

时间:2013-10-21 03:41:24

标签: security sockets networking udp embedded

最近发现一些路由器设备包含后门,some of which可以利用单个UDP数据包。我意识到其中一些后门不一定是恶意的,因为我在我自己的产品中做了相同的事情以进行故障排除:打开一个套接字以将心跳包发送到服务器,并监听命令(例如'ping')服务器。有些命令实际上可以在设备上执行任意代码,让我的心脏像鼓一样......

我的问题是,作为一种原始形式的身份验证,如果我将收到的UDP数据包的远程地址和端口与服务器的实际地址和端口进行比较套接字正在发送数据包,事情是否足够安全(即没有攻击可以被利用)?示例代码如下:

if ((bytes = recvfrom(sock, buf, sizeof(buf) - 1, 0, 
                      (sockaddr *)addr, addrlen)) == -1)
{
    perror("recvfrom");
    return -1;
}

buf[bytes] = '\0';
printf("%s: received: %s\n", __func__, buf);

if (addrcmp(addr, (sockaddr_in *)ai_server->ai_addr) == 0)
{
    // do things
}

addrcmp()的代码:

int addrcmp(sockaddr_in *a1, sockaddr_in *a2)
{
    if (a1->sin_addr.s_addr == a2->sin_addr.s_addr &&
        a1->sin_port == a2->sin_port)
    {
        return 0;
    }
    return 1;
}

3 个答案:

答案 0 :(得分:2)

即使您确保从您正在与之通话的地址收到数据包,也不一定是您正在与之通话的机器。欺骗地址和端口很容易。验证发件人的地址/端口是您可以采取的许多步骤中的第一步 - 如果您正在与一些众所周知的端口通话,并且如果有人可以猜测该地址,他们仍然可以发送具有正确地址和端口的数据包。因此,您可以探索一方使用短暂端口 - 如果您选择使用临时端口,则攻击者仍然可以猜测端口,因为只有64K端口。所以,你可以转向TCP。这将使攻击者也猜测序列号。在某些情况下,这也被打破

IMO,您应该设计系统,假设攻击者知道连接细节。无论如何,中间人都知道你的连接细节。您可以尝试以下某些操作 - 在接受之前验证数据包中的字段。确保数据包中各个字段的输入在可接受的限制范围内 - 验证内容。使用某些东西来签署数据 - 加密和验证连接

如果出于管理目的而类似心跳,如果不需要通过互联网,则应考虑将管理网络与数据端口完全隔离。在这种情况下,您可以避免上面列出的一些检查。

此列表并非详尽无遗。大多数商业产品将完成所有这些以及更多,并且仍然是脆弱的。

答案 1 :(得分:1)

您的程序实际上是一个小型防火墙。您可以使用设备前面的防火墙来阻止到端口和所关注接口的所有 UDP流量。如果您的服务器碰巧使用相同的端口和界面,您可以更改它吗?

答案 2 :(得分:1)

您无法在UDP中安全地执行此操作。您根本不应该这样做 - 被恶意发现和使用。大多数设备设计人员都会在电路板上使用串行控制台引脚,如果他们在原型阶段之外完成的话。至少需要物理访问设备。

如果您必须拥有远程控制连接,请使用经过充分验证的内容。例如,SSH或SSL加密的TCP或HTTP连接。