Posadis是一款开放源代码的无缓冲DNS服务程序,设计目标是方便使用和配置,运行在Linux、Unix、Microsoft操作系统下。 Posadis在日志函数中存在格式字符串漏洞,可导致攻击者利用此漏洞执行任意代码或者进行拒绝服务攻击。 问题存在于log.cpp的日志函数上: --- void log_print(message_log_level log_level, char *logmsg, ...) { char buff[4096]; long tsecs; struct tm *tstruct; va_list args; /* compile buffer */ tsecs = time(NULL); tstruct = localtime(&tsecs); sprintf(buff, \"\\%04d/\\%02d/\\%02d \\%02d:\\%02d|\", tstruct->tm_year + 1900, tstruct->tm_mon + 1, tstruct->tm_mday, tstruct->tm_hour, tstruct->tm_min); switch (log_level) { case LOG_LEVEL_INFO: strcat(buff, \"INFO: \"); break; case LOG_LEVEL_WARNING: strcat(buff, \"WARNING: \"); break; case LOG_LEVEL_ERROR: strcat(buff, \"ERROR: \"); break; case LOG_LEVEL_PANIC: strcat(buff, \"PANIC: \"); break; } va_start(args, logmsg); vsprintf(&buff[strlen(buff)], logmsg, args); va_end(args); strcat(buff, \"\n\"); /* and print it to various targets */ if (!no_stdout_log) printf(buff); <-- heh if (logfile) fprintf(logfile, buff); <-- heh #ifdef _WIN32...
Posadis是一款开放源代码的无缓冲DNS服务程序,设计目标是方便使用和配置,运行在Linux、Unix、Microsoft操作系统下。 Posadis在日志函数中存在格式字符串漏洞,可导致攻击者利用此漏洞执行任意代码或者进行拒绝服务攻击。 问题存在于log.cpp的日志函数上: --- void log_print(message_log_level log_level, char *logmsg, ...) { char buff[4096]; long tsecs; struct tm *tstruct; va_list args; /* compile buffer */ tsecs = time(NULL); tstruct = localtime(&tsecs); sprintf(buff, \"\\%04d/\\%02d/\\%02d \\%02d:\\%02d|\", tstruct->tm_year + 1900, tstruct->tm_mon + 1, tstruct->tm_mday, tstruct->tm_hour, tstruct->tm_min); switch (log_level) { case LOG_LEVEL_INFO: strcat(buff, \"INFO: \"); break; case LOG_LEVEL_WARNING: strcat(buff, \"WARNING: \"); break; case LOG_LEVEL_ERROR: strcat(buff, \"ERROR: \"); break; case LOG_LEVEL_PANIC: strcat(buff, \"PANIC: \"); break; } va_start(args, logmsg); vsprintf(&buff[strlen(buff)], logmsg, args); va_end(args); strcat(buff, \"\n\"); /* and print it to various targets */ if (!no_stdout_log) printf(buff); <-- heh if (logfile) fprintf(logfile, buff); <-- heh #ifdef _WIN32 w32dlg_add_log_item(buff); #endif #ifdef HAVE_SYSLOG_H syslog(log_level, \"\\%s\", strchr(buff, \'\'|\'\') + 1); #endif } --- 攻击者可以使用一个包含格式串的恶意字符串作为参数提供给printf函数,这可能导致攻击者任意修改任意内存的内容。这样,攻击者可能通过覆盖一个函数的返回地址,以DNS服务进程权限执行攻击者指定的任意代码。