我有以下代码:
void parseOptions(int argc, char* argv[]) {
std::string mob;
int option, index;
struct option long_options[] = {{"version", no_argument, 0, 'V'},
{"mobile-interface", required_argument, 0, 'm'},
{0, 0}};
while ((option = getopt_long(argc, argv, "Vm:", long_options, &index)) != -1) {
switch (option) {
case 'V':
printVersion();
break;
case 'm':
if (strlen(optarg) == HASHED_MOB_SIZE) {
mob = optarg;
}
break;
default:
std::cerr << "Getopt switch default case shouldn't be reached... aborting program.\n";
exit(ERR_GETOPT_FAILURE);
}
}
}我运行Flawfinder并得到以下错误:
main.cpp:48:3. getopt_long:一些旧的实现无法防止内部缓冲区溢出(CWE-120,CWE-20)。检查安装时的实现,或限制所有字符串输入的大小。
如何限制字符串输入大小?
发布于 2020-12-21 13:20:46
所以Flawfinder是对的。
getopt中存在一个漏洞:CVE-1999-0966。
libc中Solaris getopt中的缓冲区溢出允许本地用户通过一个长的argv获得根权限。
我的解决方案是验证argc大于1,而argv[0]不是太长。
https://stackoverflow.com/questions/64305167
复制相似问题