//This is the function that results in the vulnerability from buffer.c : int unpack_string(buffer_ptr b, char *s) { int i; int len; byte *bp; if ((b->read_index + INT32_SIZE) > b->len) { fprintf(stderr, "unpack_string(): %s\n", BUFF_ERR2); return (-1); } len = unpack_int(b); if ((b->read_index + len) > b->len) { fprintf(stderr, "unpack_string(): %s\n", BUFF_ERR2); return (-1); } bp = (byte *) s; for (i = 0; i < (len-1); i++) { *(bp++) = b->data[b->read_index++]; } *(bp) = 0; b->read_index++; return (0); } //It unpacks a string from pack_string : int pack_string(buffer_ptr b, const char *s) { int i; int len; byte *bp; len = strlen((char *) s); if (pack_int(b, len)) { fprintf(stderr, "pack_string(): pack_int() failed\n"); return -2; } if ((b->len + len + 1) >= BUF_SIZE) { fprintf(stderr, "pack_string(): %s\n", BUFF_ERR1); return (-1); } b->data[b->len++] = ' '; bp = (byte *) s; for (i = 0; i < len; i++) { b->data[b->len++] = *(bp++); } b->data[b->len] = 0; return (0); } //This is how the function is used (unpack_string = msg_unpack_string) void nio_app_init_1(void) { char nio_ver[STR_LEN]; char server[STR_LEN]; char app_name[STR_LEN]; char app_ver[STR_LEN]; char cwd[STR_LEN]; // printf("Initializing remote application...\n"); msg_unpack_string(nio_ver); msg_unpack_string(server); msg_unpack_string(app_name); msg_unpack_string(app_ver); msg_unpack_string(cwd); init_file_loader(app_name, app_ver, cwd); // turn antialiasing on antialiasing_control(TRUE); // printf("nio_init_1:\n"); // printf(" nio_ver = %s\n", nio_ver); // printf(" server = %s\n", server); // printf(" app_name = %s\n", app_name); // printf(" app_ver = %s\n", app_ver); // printf(" cwd = %s\n", cwd); } //That's just one vulnerability I've showed, resulting from the nio_app_init() api : void nio_app_init(const char *app_name, const char *app_ver) { char nio_ver[8] = NIO_LIB_VER; char hostname[MAXHOSTNAMELEN]; char cwd[256]; char s[BUFSIZ]; // path nio_log; /* get_home_dir(nio_log); // Get home dir pathcat(nio_log, NIO_DIR); // append nio dir check_dir(nio_log); // make sure we can write to it // create log file name */ snprintf(s, BUFSIZ, "%s.%s.log", app_name, app_ver); nio_log_open(s); /* // append log file name to path pathcat(nio_log, s); // open the log file nio_log_open(nio_log); */ #ifdef UNIX if (signal(SIGUSR1, sig_usr) == SIG_ERR) nio_log_print("can't catch SIGUSR1\n"); #endif // nio_log_print("nio_app_init(): log file |%s| opened.\n", nio_log); nio_log_print("nio_app_init(): log file |%s| opened.\n", s); #ifdef WIN32 init_winsock(); #endif nio_StartEventQueue(); nio_log_print("nio_app_init(): Event queue started.\n", s); msg_init_server(STDIN, STDOUT); nio_log_print("nio_app_init(): msg_init_stdio_server() done.\n"); gethostname(hostname, MAXHOSTNAMELEN); getcwd(cwd, 256); msg_set_num(NIO_OUT_INIT); nio_log_print("nio_app_init(): msg_set_num() done.\n"); msg_pack_string(nio_ver); msg_pack_string(hostname); msg_pack_string(app_name); msg_pack_string(app_ver); msg_pack_string(cwd); // msg_send(); nio_log_print("nio_app_init(): Done packing message.\n"); randomize(); }