apache
"WIN32/OS2 shell characters not escaped correctly when cross-compiling
The define NEED_ENHANCED_ESCAPES needs to be used for WIN32 or OS2 operating systems, regardless if the whole apache httpd is cross-compiled or not. The utility gen_test_char generates the header file test_char.h, which defines a table test_char_table that is used to escape special characters, for instance, in shell command strings. If the special WIN32/OS2 characters \r and % are not escaped correctly, this could potentially be exploited."
Bug fixed by commit c76df14dfb4
Type | OSCommandInjection |
Config | "CROSS_COMPILE && (WIN32 || OS2)" (2nd degree) |
Fix-in | mapping |
Location | server/ |
#include <stdio.h> #include <string.h> #define T_ESCAPE_SHELL_CMD (0x01) #ifdef CROSS_COMPILE #define APR_HAVE_STDIO_H 1 #else #include <stdlib.h> //apr-related headers #if defined(WIN32) || defined(OS2) #define NEED_ENHANCED_ESCAPES #endif #endif int main(void) { unsigned c = 0; unsigned char flags; for (c = 0; c < 256; ++c) { flags = 0; if (c % 20 == 0) printf("\n "); /* escape_shell_cmd */ #ifdef NEED_ENHANCED_ESCAPES /* Win32/OS2 have many of the same vulnerable characters * as Unix sh, plus the carriage return and percent char. * The proper escaping of these characters varies from unix * since Win32/OS2 use carets or doubled-double quotes, * and neither lf nor cr can be escaped. We escape unix * specific as well, to assure that cross-compiled unix * applications behave similiarly when invoked on win32/os2. * * Rem please keep in-sync with apr's list in win32/filesys.c */ if (c && strchr("&;`'\"|*?~<>^()[]{}$\\\n\r%", c)) { flags |= T_ESCAPE_SHELL_CMD; } #else if (c && strchr("&;`'\"|*?~<>^()[]{}$\\\n", c)) { flags |= T_ESCAPE_SHELL_CMD; } #endif } return 0; }
diff --git a/apache/simple/c76df14.c b/apache/simple/c76df14.c --- a/apache/simple/c76df14.c +++ b/apache/simple/c76df14.c @@ -7,10 +7,11 @@ #define APR_HAVE_STDIO_H 1 #else #include <stdlib.h> //apr-related headers +#endif + #if defined(WIN32) || defined(OS2) #define NEED_ENHANCED_ESCAPES #endif -#endif int main(void) {
. server/gen_test_char.c:17: #ifdef CROSS_COMPILE . // NEED_ENHANCED_ESCAPES will not be defined by server/gen_test_char.c:35 . // Special WIN32/OS2 shell characters will not be escaped !!! . ERROR server/gen_test_char.c:101: if (c && strchr("&;`'\"|*?~<>^()[]{}$\\\n", c)) {