/* TEMPLATE GENERATED TESTCASE FILE Filename: CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63a.c Label Definition File: CWE78_OS_Command_Injection.no_path.label.xml Template File: sources-sink-63a.tmpl.c */ /* * @description * CWE: 78 OS Command Injection * BadSource: listen_socket Read data using a listen socket (server side) * GoodSource: Benign input * Sinks: w32spawnvp * BadSink : execute command with wspawnvp * Flow Variant: 63 Data flow: pointer to data passed from one function to another in different source files * * */ #include "std_testcase.h" #include #ifdef _WIN32 # define COMMAND_INT_PATH L"%WINDIR%\\system32\\cmd.exe" # define COMMAND_INT L"cmd.exe" # define COMMAND_ARG1 L"/c" # define COMMAND_ARG2 L"dir" # define COMMAND_ARG3 data #else /* NOT _WIN32 */ # define COMMAND_INT L"sh" # define COMMAND_ARG1 L"ls" # define COMMAND_ARG2 data # define COMMAND_ARG3 NULL #endif #ifdef _WIN32 # include # include # include # define PATH_SZ 100 # pragma comment(lib, "ws2_32") /* include ws2_32.lib when linking */ # define CLOSE_SOCKET closesocket #else # define PATH_SZ PATH_MAX # define INVALID_SOCKET -1 # define SOCKET_ERROR -1 # define CLOSE_SOCKET close # define SOCKET int #endif #define TCP_PORT 27015 #define LISTEN_BACKLOG 5 #include #ifndef OMITBAD /* bad function declaration */ void CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63b_bad_sink(wchar_t * * data_ptr); void CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63_bad() { wchar_t * data; wchar_t data_buf[100] = L""; data = data_buf; { #ifdef _WIN32 WSADATA wsa_data; int wsa_data_init = 0; #endif int recv_rv; struct sockaddr_in s_in; wchar_t *replace; SOCKET listen_socket = INVALID_SOCKET; SOCKET accept_socket = INVALID_SOCKET; size_t data_len = wcslen(data); do { #ifdef _WIN32 if (WSAStartup(MAKEWORD(2,2), &wsa_data) != NO_ERROR) break; wsa_data_init = 1; #endif listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_socket == INVALID_SOCKET) break; memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = AF_INET; s_in.sin_addr.s_addr = INADDR_ANY; s_in.sin_port = htons(TCP_PORT); if (bind(listen_socket, (struct sockaddr*)&s_in, sizeof(s_in)) == SOCKET_ERROR) break; if (listen(listen_socket, LISTEN_BACKLOG) == SOCKET_ERROR) break; accept_socket = accept(listen_socket, NULL, NULL); if (accept_socket == SOCKET_ERROR) break; /* Abort on error or the connection was closed */ recv_rv = recv(accept_socket, (char *)data+data_len, (int)(100-data_len-1), 0); if (recv_rv == SOCKET_ERROR || recv_rv == 0) break; /* Append null terminator */ data[recv_rv] = L'\0'; /* Eliminate CRLF */ replace = wcschr(data, L'\r'); if (replace) *replace = L'\0'; replace = wcschr(data, L'\n'); if (replace) *replace = L'\0'; } while (0); if (listen_socket != INVALID_SOCKET) CLOSE_SOCKET(listen_socket); if (accept_socket != INVALID_SOCKET) CLOSE_SOCKET(accept_socket); #ifdef _WIN32 if (wsa_data_init) WSACleanup(); #endif } CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63b_bad_sink(&data); } #endif /* OMITBAD */ #ifndef OMITGOOD /* goodG2B uses the GoodSource with the BadSink */ void CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63b_goodG2B_sink(wchar_t * * data); static void goodG2B() { wchar_t * data; wchar_t data_buf[100] = L""; data = data_buf; /* FIX: Benign input preventing command injection */ wcscat(data, L"*.*"); CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63b_goodG2B_sink(&data); } void CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63_good() { goodG2B(); } #endif /* OMITGOOD */ /* Below is the main(). It is only used when building this testcase on its own for testing or for building a binary to use in testing binary analysis tools. It is not used when compiling all the testcases as one application, which is how source code analysis tools are tested. */ #ifdef INCLUDEMAIN int main(int argc, char * argv[]) { /* seed randomness */ srand( (unsigned)time(NULL) ); #ifndef OMITGOOD printLine("Calling good()..."); CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63_good(); printLine("Finished good()"); #endif /* OMITGOOD */ #ifndef OMITBAD printLine("Calling bad()..."); CWE78_OS_Command_Injection__wchar_t_listen_socket_w32spawnvp_63_bad(); printLine("Finished bad()"); #endif /* OMITBAD */ return 0; } #endif