diff options
author | Tomas Hozza <thozza@redhat.com> | 2012-11-08 04:53:29 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-11-15 18:38:34 -0500 |
commit | 95a69adab9acfc3981c504737a2b6578e4d846ef (patch) | |
tree | a1723dbb78e14389441d0911e7a53398dfffa590 /tools/hv | |
parent | aeba4a06f28fad11b1e61d150bd3cde3008b80c8 (diff) |
tools: hv: Netlink source address validation allows DoS
The source code without this patch caused hypervkvpd to exit when it processed
a spoofed Netlink packet which has been sent from an untrusted local user.
Now Netlink messages with a non-zero nl_pid source address are ignored
and a warning is printed into the syslog.
Signed-off-by: Tomas Hozza <thozza@redhat.com>
Acked-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'tools/hv')
-rw-r--r-- | tools/hv/hv_kvp_daemon.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c index 13c2a142331d..c1d910243d49 100644 --- a/tools/hv/hv_kvp_daemon.c +++ b/tools/hv/hv_kvp_daemon.c | |||
@@ -1486,13 +1486,19 @@ int main(void) | |||
1486 | len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0, | 1486 | len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0, |
1487 | addr_p, &addr_l); | 1487 | addr_p, &addr_l); |
1488 | 1488 | ||
1489 | if (len < 0 || addr.nl_pid) { | 1489 | if (len < 0) { |
1490 | syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", | 1490 | syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", |
1491 | addr.nl_pid, errno, strerror(errno)); | 1491 | addr.nl_pid, errno, strerror(errno)); |
1492 | close(fd); | 1492 | close(fd); |
1493 | return -1; | 1493 | return -1; |
1494 | } | 1494 | } |
1495 | 1495 | ||
1496 | if (addr.nl_pid) { | ||
1497 | syslog(LOG_WARNING, "Received packet from untrusted pid:%u", | ||
1498 | addr.nl_pid); | ||
1499 | continue; | ||
1500 | } | ||
1501 | |||
1496 | incoming_msg = (struct nlmsghdr *)kvp_recv_buffer; | 1502 | incoming_msg = (struct nlmsghdr *)kvp_recv_buffer; |
1497 | incoming_cn_msg = (struct cn_msg *)NLMSG_DATA(incoming_msg); | 1503 | incoming_cn_msg = (struct cn_msg *)NLMSG_DATA(incoming_msg); |
1498 | hv_msg = (struct hv_kvp_msg *)incoming_cn_msg->data; | 1504 | hv_msg = (struct hv_kvp_msg *)incoming_cn_msg->data; |