diff --git a/resolve-cveassert/src/CVEAssert.cpp b/resolve-cveassert/src/CVEAssert.cpp index 59d3df65..fc6cbc6e 100644 --- a/resolve-cveassert/src/CVEAssert.cpp +++ b/resolve-cveassert/src/CVEAssert.cpp @@ -69,6 +69,7 @@ struct LabelCVEPass : public PassInfoMixin { std::vector vulnerabilities; enum VulnID { + ALL = 0, STACK_BASED_BUF_OVERFLOW = 121, HEAP_BASED_BUF_OVERFLOW = 122, WRITE_WHAT_WHERE = 123, @@ -174,6 +175,15 @@ struct LabelCVEPass : public PassInfoMixin { } } + void applyAutomaticSanitizers(Function &F, Vulnerability::RemediationStrategies strategy) { + /// applies all automatic sanitizers (operation masking excluded) + sanitizeFreeOfNonHeap(&F, strategy); + sanitizeMemInstBounds(&F, strategy); + sanitizeNullPointers(&F, strategy); + sanitizeDivideByZero(&F, strategy); + sanitizeIntOverflow(&F, strategy); + } + /// For each function, if it matches the target function name, insert calls to /// the vulnerability handlers as specified in the JSON. Each call receives /// the triggering argument parsed from the JSON. @@ -259,6 +269,11 @@ struct LabelCVEPass : public PassInfoMixin { result = PreservedAnalyses::none(); break; + case VulnID::ALL: + applyAutomaticSanitizers(F, vuln.Strategy); + result = PreservedAnalyses::none(); + break; + default: errs() << "[CVEAssert] Error: CWE " << vuln.WeaknessID << " not implemented\n"; diff --git a/resolve-cveassert/src/Vulnerability.hpp b/resolve-cveassert/src/Vulnerability.hpp index 8ef9178f..85066288 100644 --- a/resolve-cveassert/src/Vulnerability.hpp +++ b/resolve-cveassert/src/Vulnerability.hpp @@ -52,8 +52,8 @@ struct Vulnerability { return std::nullopt; } - auto vulnType = jsonObj->getString("cwe-id"); - if (!vulnType) { + auto vulnID = jsonObj->getString("cwe-id"); + if (!vulnID) { llvm::errs() << "[CVEAssert] Error: No 'cwe-id' field found in JSON.\n"; return std::nullopt; } @@ -95,7 +95,7 @@ struct Vulnerability { Vulnerability vuln{ targetFile->str(), targetFunction->str(), - static_cast(std::stoi(vulnType->str())), + static_cast(std::stoi(vulnID->str())), undesirableFunction, strategy, }; return std::make_optional(vuln);