问题描述
我有以下代码:
void parseOptions(int argc,char* argv[]) {
std::string mob;
int option,index;
struct option long_options[] = {{"version",no_argument,'V'},{"mobile-interface",required_argument,'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)。检查安装的执行情况,或限制大小 所有字符串输入。
如何限制字符串输入大小?
解决方法
所以 Flawfinder
是对的。
getopt
中存在一个漏洞:CVE-1999-0966。
Solaris getopt 中的缓冲区溢出问题允许本地用户通过长 argv[0] 获得 root 权限。
我的解决方案是验证 argc
是否大于 1 并且 argv[0]
不会太长。