Security 如何防止基于UDP的通道变为;后门;?

Security 如何防止基于UDP的通道变为;后门;?,security,sockets,networking,udp,embedded,Security,Sockets,Networking,Udp,Embedded,最近,一些路由器设备被发现包含后门,可以利用单个UDP数据包进行攻击。我意识到其中一些后门不一定是恶意的,因为我在自己的产品中也做了同样的事情来进行故障排除:打开套接字向服务器发送心跳数据包,并侦听来自服务器的命令(如“ping”)。有些命令实际上可以在设备上执行任意代码,让我的心怦怦直跳 我的问题是,作为一种原始的身份验证形式,如果我将收到的UDP数据包的远程地址和端口与套接字向其发送数据包的服务器的实际地址和端口相比较,事情是否足够安全(即,不能利用任何攻击)?示例代码如下所示: if ((

最近,一些路由器设备被发现包含后门,可以利用单个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()的代码:


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

依我看,您应该设计系统,假设攻击者知道连接详细信息。中间的那个人知道你的联系细节。你可以试试下面的方法 -在接受数据包之前验证数据包中的字段。确保数据包中各个字段的输入在可接受的范围内 -验证内容。用一些东西来签署数据 -加密并验证连接

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


这份清单并非详尽无遗。大多数商业产品都能做到这一切,甚至更多,但仍然很脆弱

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

依我看,您应该设计系统,假设攻击者知道连接详细信息。中间的那个人知道你的联系细节。你可以试试下面的方法 -在接受数据包之前验证数据包中的字段。确保数据包中各个字段的输入在可接受的范围内 -验证内容。用一些东西来签署数据 -加密并验证连接

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


这份清单并非详尽无遗。大多数商业产品都能做到这一切,甚至更多,但仍然很脆弱

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

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

您不能在UDP中安全地执行此操作。您根本不应该这样做-它将被发现并恶意使用。大多数设备设计人员使用主板上的串行控制台插脚来实现这一点,如果他们在原型阶段之后就这样做的话。至少这需要对设备进行物理访问


如果你必须有一个远程控制连接,用一些经过验证的东西。例如,SSH或SSL加密的TCP或HTTP连接。

您不能在UDP中安全地执行此操作。您根本不应该执行此操作-它将被发现并恶意使用。大多数设备设计人员使用主板上的串行控制台插脚来实现这一点,如果他们在原型阶段之后就这样做的话。至少这需要对设备进行物理访问


如果你必须有一个远程控制连接,用一些经过验证的东西。例如SSH,或SSL加密的TCP或HTTP连接。

我不明白-你怎么能在端点上接收到任何不发送到该端点的数据包?@MarkMennell我想确保的是,我接收到的命令实际上来自我正在交谈的服务器,因此,我会将发送者的地址和端口与服务器的地址和端口进行比较,以确保发送者实际上就是服务器本身。但正如Rajesh所指出的,伪造地址和端口很容易。我明白你的意思是将其与已知地址进行比较,而不是与接收到的地址进行比较。我不明白-你怎么能在端点上接收到任何不是dest的数据包
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;
}