49 lines
2.4 KiB
Python
49 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from redflare.core.models import Target
|
|
from redflare.core.standards import enrich_finding
|
|
from redflare.modules.base import ModuleContext
|
|
from redflare.modules.http import HTTPResponse
|
|
from redflare.modules.vulnerabilities import CVEIntelligenceModule, fingerprint_response
|
|
|
|
|
|
class CVEIntelligenceTests(unittest.TestCase):
|
|
def test_fingerprints_only_explicit_versions(self):
|
|
body = b'<meta name="generator" content="WordPress 6.4.2"><script src="jquery-3.6.0.min.js"></script>'
|
|
values = fingerprint_response({"server": "nginx/1.24.0", "x-powered-by": "Express"}, body)
|
|
products = {(item.product, item.version) for item in values}
|
|
self.assertEqual(products, {("nginx", "1.24.0"), ("WordPress", "6.4.2"), ("jQuery", "3.6.0")})
|
|
self.assertNotIn("Express", {item.product for item in values})
|
|
|
|
@patch("redflare.modules.vulnerabilities.query_nvd")
|
|
@patch("redflare.modules.vulnerabilities.request")
|
|
def test_emits_cve_findings_with_clickable_reference(self, get, nvd):
|
|
get.return_value = HTTPResponse("https://example.test", 200, {"server": "nginx/1.24.0"}, b"")
|
|
nvd.return_value = [{
|
|
"id": "CVE-2026-12345",
|
|
"published": "2026-01-02T00:00:00Z",
|
|
"lastModified": "2026-01-03T00:00:00Z",
|
|
"vulnStatus": "Analyzed",
|
|
"descriptions": [{"lang": "en", "value": "Fixture vulnerability."}],
|
|
"metrics": {"cvssMetricV31": [{"cvssData": {"baseScore": 9.8, "baseSeverity": "CRITICAL", "vectorString": "CVSS:3.1/AV:N"}}]},
|
|
"references": [{"url": "https://vendor.example/advisory"}],
|
|
}]
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
context = ModuleContext("run_test", Path(directory), timeout=1)
|
|
result = CVEIntelligenceModule().run(Target("https://example.test", "example.test", "https", 443), context)
|
|
self.assertEqual(len(result.findings), 1)
|
|
finding = enrich_finding(result.findings[0])
|
|
self.assertEqual(finding.test_id, "RFV2-COMP-001")
|
|
self.assertEqual(finding.severity, "critical")
|
|
self.assertEqual(finding.standards["CVE"][0]["id"], "CVE-2026-12345")
|
|
self.assertTrue(finding.standards["CVE"][0]["url"].startswith("https://nvd.nist.gov/"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|