From 73145de618e29032816eb753be8763b6710ea30b Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Tue, 13 Oct 2015 14:27:30 -0400 Subject: [PATCH] Added some parameter checks from linux kernel syscall source --- netcon/NetconEthernetTap.cpp | 18 +++++++----------- netcon/intercept.c | 35 +++++++++++++++++++++++++++++++---- netcon/libintercept.so.1.0 | Bin 0 -> 52552 bytes netcon/make-intercept.mk | 2 +- 4 files changed, 39 insertions(+), 16 deletions(-) create mode 100755 netcon/libintercept.so.1.0 diff --git a/netcon/NetconEthernetTap.cpp b/netcon/NetconEthernetTap.cpp index 88cd3d97b..824f1734a 100644 --- a/netcon/NetconEthernetTap.cpp +++ b/netcon/NetconEthernetTap.cpp @@ -700,17 +700,13 @@ void NetconEthernetTap::nc_err(void *arg, err_t err) */ err_t NetconEthernetTap::nc_poll(void* arg, struct tcp_pcb *tpcb) { - uint64_t now = OSUtils::now(); - //fprintf(stderr, "nc_poll(): now = %u\n", now); - //fprintf(stderr, "nc_poll\n"); - - + /* Larg *l = (Larg*)arg; TcpConnection *conn = l->conn; NetconEthernetTap *tap = l->tap; if(conn && conn->idx) // if valid connection and non-zero index (indicating data present) tap->handle_write(conn); - + */ return ERR_OK; } @@ -736,7 +732,6 @@ err_t NetconEthernetTap::nc_sent(void* arg, struct tcp_pcb *tpcb, u16_t len) //uint64_t now = OSUtils::now(); //fprintf(stderr, "nc_sent(): now = %u\n", now); l->tap->_phy.whack(); - //l->tap->handle_write(l->conn); } return ERR_OK; } @@ -856,10 +851,10 @@ void NetconEthernetTap::handle_bind(PhySocket *sock, void **uptr, struct bind_st * @param structure containing the data and parameters for this client's RPC * - [ ] EADDRINUSE - Another socket is already listening on the same port. + [?] EADDRINUSE - Another socket is already listening on the same port. [X] EBADF - The argument sockfd is not a valid descriptor. - [ ] ENOTSOCK - The argument sockfd is not a socket. - [ ] EOPNOTSUPP - The socket is not of a type that supports the listen() operation. + [i] ENOTSOCK - The argument sockfd is not a socket. + [i] EOPNOTSUPP - The socket is not of a type that supports the listen() operation. */ void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct listen_st *listen_rpc) @@ -886,6 +881,7 @@ void NetconEthernetTap::handle_listen(PhySocket *sock, void **uptr, struct liste } } else { + // We can't find a connection mapped to the socket fd provided fprintf(stderr, "handle_listen(): can't locate connection for PCB\n"); send_return_value(conn, -1, EBADF); } @@ -954,7 +950,7 @@ void NetconEthernetTap::handle_socket(PhySocket *sock, void **uptr, struct socke [i] EACCES - For UNIX domain sockets, which are identified by pathname: Write permission is denied ... [ ] EACCES, EPERM - The user tried to connect to a broadcast address without having the socket broadcast flag enabled ... [i] EADDRINUSE - Local address is already in use. - [?] EAFNOSUPPORT - The passed address didn't have the correct address family in its sa_family field. + [i] EAFNOSUPPORT - The passed address didn't have the correct address family in its sa_family field. [ ] EAGAIN - No more free local ports or insufficient entries in the routing cache. [ ] EALREADY - The socket is nonblocking and a previous connection attempt has not yet been completed. [ ] EBADF - The file descriptor is not a valid index in the descriptor table. diff --git a/netcon/intercept.c b/netcon/intercept.c index ee2a479b9..41ad804c8 100755 --- a/netcon/intercept.c +++ b/netcon/intercept.c @@ -66,12 +66,19 @@ char *progname = ""; #include #ifdef USE_SOCKS_DNS -#include + #include #endif #include "intercept.h" #include "common.h" +#ifdef CHECKS + #include /* for NPROTO */ + + #define SOCK_MAX (SOCK_PACKET + 1) + #define SOCK_TYPE_MASK 0xf +#endif + /* Global Declarations */ #ifdef USE_SOCKS_DNS static int (*realresinit)(void); @@ -504,8 +511,21 @@ void sock_domain_to_str(int domain) /* int socket_family, int socket_type, int protocol socket() intercept function */ + int socket(SOCKET_SIG) { +#ifdef CHECKS + /* Check protocol is in range */ + if (socket_family < 0 || socket_family >= NPROTO) + return -EAFNOSUPPORT; + if (socket_type < 0 || socket_type >= SOCK_MAX) + return -EINVAL; + /* Check that type makes sense */ + int flags = socket_type & ~SOCK_TYPE_MASK; + if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) + return -EINVAL; +#endif + #ifdef DUMMY dwr("socket(fam=%d, type=%d, prot=%d)\n", socket_family, socket_type, protocol); return realsocket(socket_family, socket_type, protocol); @@ -520,9 +540,6 @@ int socket(SOCKET_SIG) return realsocket(socket_family, socket_type, protocol); } - /* FIXME: Check type, protocol, return EINVAL errno */ - /* FIXME: Check family, return EAFNOSUPPORT errno */ - /* Assemble and route command */ struct socket_st rpc_st; rpc_st.socket_family = socket_family; @@ -573,6 +590,9 @@ int socket(SOCKET_SIG) connect() intercept function */ int connect(CONNECT_SIG) { + + /* FIXME: Check that address is in user space, return EFAULT ? */ + #ifdef DUMMY dwr("connect(%d)\n", __fd); return realconnect(__fd, __addr, __len); @@ -728,6 +748,10 @@ int bind(BIND_SIG) /* int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags */ int accept4(ACCEPT4_SIG) { +#ifdef CHECKS + if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) + return -EINVAL; +#endif #ifdef DUMMY dwr("accept4(%d)\n", sockfd); return accept(sockfd, addr, addrlen); @@ -816,6 +840,9 @@ int accept(ACCEPT_SIG) listen() intercept function */ int listen(LISTEN_SIG) { + /* FIXME: Check that this socket supports listen(), return EOPNOTSUPP */ + /* FIXME: Check that the provided fd is a socket, return ENOTSOCK */ + #ifdef DUMMY dwr("listen(%d)\n", sockfd); return reallisten(sockfd, backlog); diff --git a/netcon/libintercept.so.1.0 b/netcon/libintercept.so.1.0 new file mode 100755 index 0000000000000000000000000000000000000000..221d24287c13813e7f2a8e5d05e15f71769a409c GIT binary patch literal 52552 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 C@beo0 literal 0 HcmV?d00001 diff --git a/netcon/make-intercept.mk b/netcon/make-intercept.mk index c4c0da32b..e70b0e6cc 100644 --- a/netcon/make-intercept.mk +++ b/netcon/make-intercept.mk @@ -27,7 +27,7 @@ SHCC=gcc -intercept_CFLAGS = -c -fPIC -g -O2 -Wall -std=c99 -D_GNU_SOURCE -DNETCON_INTERCEPT +intercept_CFLAGS = -c -fPIC -g -O2 -Wall -std=c99 -D_GNU_SOURCE -DCHECKS -DNETCON_INTERCEPT LIB_NAME = intercept SHLIB_EXT=dylib SHLIB_MAJOR = 1