eresus-codeql-heuristics — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited eresus-codeql-heuristics (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Provide a language-specific reference of dangerous sinks, sources, and patterns that security auditors should prioritize during manual code review. These heuristics are derived from the CodeQL Community Packs — the same query suites used by GitHub Advanced Security to find real vulnerabilities at scale.
Use this skill as a checklist companion during manual audit. It tells you what to look for in each language. The actual manual reasoning is done by eresus-manual-security-audit.
Runtime.exec(), ProcessBuilder.command()Runtime.getRuntime().exec(userInput)InitialContext.lookup(userInput)Context.lookup() with attacker-controlled LDAP/RMI URLsSpELExpressionParser.parseExpression(userInput)OGNL.getValue(userInput)MVEL.eval(userInput)Statement.execute(query) with string concatenationStatement.executeQuery("SELECT ... " + userInput)createNativeQuery() with interpolated strings${} (raw) vs #{} (parameterized)ObjectInputStream.readObject()XStream.fromXML()Kryo.readObject()@JsonTypeInfo with MINIMAL_CLASS / CLASSDocumentBuilderFactory without setFeature(XMLConstants.FEATURE_SECURE_PROCESSING)SAXParserFactory without disabling external entitiesXMLInputFactory without disabling DTDsClass.forName(userInput).newInstance()Method.invoke() with user-controlled method namesnew File(basePath + userInput) without canonicalizationPaths.get(userInput) without restricting to base directoryos.system(userInput)subprocess.Popen(userInput, shell=True)subprocess.call(userInput, shell=True)os.popen(userInput)eval(userInput)exec(userInput)compile(userInput, ...)pickle.loads(userInput)pickle.load(untrustedFile)yaml.load(userInput) — safe: yaml.safe_load()shelve.open(userInput)marshal.loads(userInput)jinja2.Template(userInput).render()jinja2.Environment(autoescape=False)mako.template.Template(userInput)cursor.execute("SELECT ... " + userInput)extra(), raw(), RawSQL() with user inputtext(userInput)open(basePath + userInput)send_file(userInput)FileResponse(userInput)os.path.join(base, userInput) without os.path.realpath() checkrequests.get(userInput)urllib.request.urlopen(userInput)eval(userInput)Function(userInput)()setTimeout(userInput, ms) (string form)setInterval(userInput, ms) (string form)vm.runInNewContext(userInput)vm.runInThisContext(userInput)child_process.exec(userInput)child_process.execSync(userInput) child_process.exec(cmd ${userInput}) `element.innerHTML = userInputelement.outerHTML = userInputdocument.write(userInput)insertAdjacentHTML('beforeend', userInput)dangerouslySetInnerHTML={{ __html: userInput }}v-html="userInput"bypassSecurityTrustHtml(userInput)lodash.merge({}, userInput)lodash.set(obj, userInput.key, userInput.value)Object.assign(target, JSON.parse(userInput))__proto__, constructor.prototype keys$where: userInputcollection.find({ field: userInput }) when userInput is { $gt: "" }collection.find(JSON.parse(userInput))path.join(base, userInput) without path.resolve() + prefix checkfs.readFile(userInput)res.sendFile(userInput)window.addEventListener('message', handler) without event.origin checkfetch(userInput), axios.get(userInput), got(userInput)fetch(\/api/${userInput}\)exec.Command(userInput)exec.CommandContext(ctx, userInput)os.StartProcess(userInput, ...)db.Query("SELECT ... " + userInput)db.Exec("INSERT INTO ... " + userInput)fmt.Sprintf("SELECT ... %s", userInput) passed to db.Query()text/template (NO auto-escaping) vs html/template (auto-escapes)template.HTML(userInput) explicitly marking user input as safefilepath.Join(base, userInput) — does NOT prevent ../os.Open(userInput) without validationfilepath.Rel() or prefix check after filepath.Clean()InsecureSkipVerify: trueMinVersion: tls.VersionTLS10http.Get(userInput)http.NewRequest("GET", userInput, nil)system(userInput) #{userInput} ` (backticks)IO.popen(userInput)Open3.capture3(userInput)Kernel.exec(userInput)Marshal.load(userInput) — RCE via universal gadget chainYAML.load(userInput) — RCE via Psych → safe: YAML.safe_load()Oj.load(userInput, mode: :object) — safe: mode: :strictOx.load(userInput, mode: :object) — safe: mode: :genericActiveRecord: .where("column = '#{userInput}'")ActiveRecord: .order(userInput)ActiveRecord: .pluck(userInput)ActiveRecord: .select(userInput)object.send(userInput) — calls any methodobject.public_send(userInput) — calls any public methodERB.new(userInput).result(binding)Slim::Template.new { userInput }File.read(params[:file])send_file(params[:path])BinaryFormatter.Deserialize(stream) — banned in .NET 9+SoapFormatter.Deserialize(stream)NetDataContractSerializer.ReadObject(reader)ObjectStateFormatter.Deserialize(input)LosFormatter.Deserialize(input)XmlSerializer with polymorphic [XmlInclude] typesProcess.Start(userInput)Process.Start("cmd.exe", "/c " + userInput)new SqlCommand("SELECT ... " + userInput)cmd.CommandText = "SELECT ... " + userInputFromSqlRaw("SELECT ... " + userInput)HtmlString(userInput) — bypasses Razor encodingHtml.Raw(userInput)Type.GetType(userInput)Activator.CreateInstance(Type.GetType(userInput))Path.Combine(basePath, userInput) without canonicalizationFile.ReadAllText(userInput)strcpy(dst, src) — safe: strncpy(), strlcpy()strcat(dst, src) — safe: strncat()sprintf(buf, fmt, ...) — safe: snprintf()gets(buf) — never safe, removed in C11printf(userInput) — safe: printf("%s", userInput)fprintf(fp, userInput)syslog(priority, userInput)malloc(count * size) without overflow checksize_t arithmetic wrapping to zerofree()free() twice on same pointermalloc()system(userInput)popen(userInput, "r")execvp(userInput, args)When performing depth-first manual review, prioritize:
Use ONLY these tools for code inspection:
view_file — read source codegrep_search — find pattern matchesDo NOT use terminal commands like grep, rg, cat, sed, or any shell-based tools.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.