最近发现一些路由器设备包含后门,其中一些可以通过单个 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;
}