Skip to contentSkip to conversation

Tools: hv: verify origin of netlink connector message

PATCH In review Olaf Hering 2 participants 2 messages May 31, 2012 – Jun 1, 2012 Hyper-V/Azure core and drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Tools: hv: verify origin of netlink connector message

The SuSE security team suggested to use recvfrom instead of recv to be certain that the connector message is originated from kernel.

---
 tools/hv/hv_kvp_daemon.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
tools/hv/hv_kvp_daemon.c +7 -3
Index: linux-3.4/tools/hv/hv_kvp_daemon.c
===================================================================
@@ -701,14 +701,18 @@ int main(void)
 	pfd.fd = fd;
 
 	while (1) {
+		struct sockaddr *addr_p = (struct sockaddr *) &addr;
+		socklen_t addr_l = sizeof(addr);
 		pfd.events = POLLIN;
 		pfd.revents = 0;
 		poll(&pfd, 1, -1);
 
-		len = recv(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0);
+		len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0,
+				addr_p, &addr_l);
 
-		if (len < 0) {
-			syslog(LOG_ERR, "recv failed; error:%d", len);
+		if (len < 0 || addr.nl_pid) {
+			syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s",
+					addr.nl_pid, errno, strerror(errno));
 			close(fd);
 			return -1;
 		}
#1 lore raw
Quoted 11 lines

-----Original Message-----
From: Olaf Hering [mailto:[email protected]]
Sent: Thursday, May 31, 2012 10:40 AM
To: KY Srinivasan; Greg Kroah-Hartman
Cc: [email protected]
Subject: [PATCH] Tools: hv: verify origin of netlink connector message

The SuSE security team suggested to use recvfrom instead of recv to be certain that the connector message is originated from kernel.

Thanks Olaf.

Quoted 2 lines
Quoted 24 lines
---
 tools/hv/hv_kvp_daemon.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Index: linux-3.4/tools/hv/hv_kvp_daemon.c
==============================================================
=====

tools/hv/hv_kvp_daemon.c +3 -1
@@ -701,14 +701,18 @@ int main(void)
 	pfd.fd = fd;
 
 	while (1) {
+		struct sockaddr *addr_p = (struct sockaddr *) &addr;
+		socklen_t addr_l = sizeof(addr);
 		pfd.events = POLLIN;
 		pfd.revents = 0;
 		poll(&pfd, 1, -1);
 
-		len = recv(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0);
+		len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0,

tools/hv/hv_kvp_daemon.c int main(void) · line 718

Quoted 10 lines
tools/hv/hv_kvp_daemon.c +4 -2
+				addr_p, &addr_l);
 
-		if (len < 0) {
-			syslog(LOG_ERR, "recv failed; error:%d", len);
+		if (len < 0 || addr.nl_pid) {
+			syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s",
+					addr.nl_pid, errno, strerror(errno));
 			close(fd);
 			return -1;
 		}

���{.n�+�������+%�����ݶ��w��{.n�+����{��G�����{ay�ʇڙ�,j��f���h��������z_�(�階�ݢj"���m������G������?����&���~��iO��z��v�^�m���� ������?�I�