我目前正在开展一个项目,我使用MongoDB来存储我的数据。这两个集合具有以下格式:
CVE
{
"Modified" : "2014-09-27T06:55:04.867-04:00",
"Published" : "2014-09-27T06:55:04.867-04:00",
"_id" : ObjectId("542923711bb35a10e3053986"),
"cvss" : "9.3",
"cwe" : "Unknown",
"id" : "CVE-2014-3062",
"last-modified" : "2014-09-29T09:00:35.803-04:00",
"references" : [
"http://xforce.iss.net/xforce/xfdb/93540",
"http://www-01.ibm.com/support/docview.wss?uid=swg21683609"
],
"summary" : "Unspecified vulnerability in IBM Security QRadar SIEM 7.1 MR2 and 7.2 MR2 allows remote attackers to execute arbitrary code via unknown vectors.",
"vulnerable_configuration" : [
"cpe:/a:ibm:qradar_security_information_and_event_manager:7.1.0",
"cpe:/a:ibm:qradar_security_information_and_event_manager:7.2.0"
]
}
mgmt_whitelist
{
"_id" : ObjectId("548855641bb35a2dc5675244"),
"id" : "cpe:/a:ibm:qradar_security_information_and_event_manager:7.2.0"
}
我希望在mgt_whitelist中找到易受配置的CVE中的所有项目,我可以通过以下方式轻松实现:
db.cves.find(
{'vulnerable_configuration':
{'$in': db.mgmt_whitelist.distinct('id')}
}
).sort({Modified: -1}).limit(10)
但是,白名单还包含
等记录{
"_id" : ObjectId("54885ff41bb35a2f57a7c567"),
"id" : "cpe:/a:7-zip:7-zip"
}
这是一种没有版本的CPE格式。我希望能够进行类似正则表达式的搜索,以便在搜索中找到这些列入白名单的项目。
我试过
db.cves.find(
{'vulnerable_configuration':
{'$in':
{'$regex':db.mgmt_whitelist.distinct('id')
}
}
).sort({Modified: -1}).limit(10)
但那不起作用......我该怎么做呢?
提前致谢,
Pidgey
答案 0 :(得分:0)
我发现了问题。要添加包含:和/的正则表达式,我需要使用新的RegExp()。 所以最后,我使用这样的东西:
db.cves.find(
{'vulnerable_configuration':
{'$in':
[new RegExp("cpe:/a:gnu:bash"),new RegExp("cpe:/a:adobe:acrobat_reader")]
}
}
).sort({Modified: -1}).limit(10)
遗憾的是,我不能在一个声明中做任何事情(如果我错了请纠正我),但我可以用我的代码来解决这个问题。感谢您的建议,BatScream
答案 1 :(得分:0)
RegExp.quote = function (str) {
return (str + '').replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
};
function startsWithExp(string) {
return new RegExp("^" + RegExp.quote(string));
}
// -----------------------------------------------------------------
db.cves.find({
vulnerable_configuration: {
$in: db.mgmt_whitelist.distinct('id').map(startsWithExp)
}
}).sort({Modified: -1}).limit(10);
在更高级的场景中,您可能希望返回一个混合的字符串和正则表达式列表,以提高性能(如果必要的话 - 测量增加的复杂性是否有任何实际好处):
function cpeStartsWithOrMatches(cve_id) {
var cpeWithVersion = /:\d+(?:\.\d+)+$/;
return cpeWithVersion.test(string) ? string : startsWithExp(string);
}
// -----------------------------------------------------------------
db.cves.find({
vulnerable_configuration: {
$in: db.mgmt_whitelist.distinct('id').map(cpeStartsWithOrMatches)
}
}).sort({Modified: -1}).limit(10);
或者你可以构建一个大表达式:
function startsWithAnyExp(strings) {
return new RegExp("^(?:" + strings.map(RegExp.quote).join("|") + ")");
}
db.cves.find({
vulnerable_configuration: {
$regex: startsWithAnyExp(db.mgmt_whitelist.distinct('id'))
}
}).sort({Modified: -1}).limit(10);