Skip to content

Built-in rules ​

The built-in rules ship in the binary, in src/rules/builtin.conf. They are high-confidence signatures, and each one is a block rule with an id of the form vh-<category>-<nnn>. Most of them run on every site unless builtin_rules off; turns the set off, and a single id can be turned off with disable_rule. The rules marked off in the Default column run only where enable_rule names them; see Opt-in rules.

nginx
builtin_rules on;                        # top level or site; default on
disable_rule vh-scanner-001 vh-xss-003;  # top level or site; built-in ids only
enable_rule vh-cve-2026-9103;            # top level or site; turns on a rule that is off by default

A rule is written to miss an attack rather than block ordinary traffic. A pattern that could appear in a code paste, a post about SQL or HTML, a base64 blob or Japanese text is left out, and such traffic goes to the decision model or to a user rule. The table below shows what each rule inspects. query, path, body and header are the normalized parts of the request described in Rules. any is the path, the query, every header value, and the body prefix. The rules are measured in the evaluation.

An unknown id in disable_rule is a configuration error. The documentation test checks that this table lists exactly the ids of builtin.conf.

IdCategoryDefaultWhat the rule matchesInspects
vh-sqli-001SQL injectiononUNION SELECT in a query stringquery
vh-sqli-002SQL injectiononA quote followed by a tautology and a comment terminatorany
vh-sqli-003SQL injectiononA quote followed by a stacked destructive statement (drop, shutdown, exec, execute, truncate)any
vh-sqli-004SQL injectiononA time-based SQL function (sleep, pg_sleep, benchmark) or WAITFOR DELAY after a quote or a closing parenthesisany
vh-xss-001XSSonA <script tag in a query stringquery
vh-xss-002XSSonA javascript: URL in a query stringquery
vh-xss-003XSSonAn inline event handler (on...=) in markup in a query stringquery
vh-traversal-001Path traversalonA ../ sequence, with plain or encoded dots and slashes, in a query stringquery
vh-traversal-002Path traversalonetc/passwd, etc/shadow, win.ini, boot.ini or /proc/self/ in a query stringquery
vh-traversal-003Path traversalonetc/passwd, etc/shadow, win.ini, boot.ini or /proc/self/ in the pathpath
vh-cmdi-001Command injectiononA shell separator (;, `, & or a backtick) followed by a common command (cat, id, whoami, uname, wget, curl, nc, bash, sh) in a query string, where the command is followed by whitespace, the end of the value, or a separator. A parameter such as &id-from=3or&cat-name=x` is not matched
vh-cmdi-002Command injectiononA $( command substitution in a query stringquery
vh-cmdi-003Command injectiononA backtick followed by cat, id, whoami, uname, wget or curl in a query stringquery
vh-lfi-001File inclusiononA PHP stream wrapper (php://filter, input, memory, temp or fd) in any inputany
vh-lfi-002File inclusiononA base64 data URI with a MIME type in a query stringquery
vh-lfi-003File inclusiononAn expect:// wrapper in a query stringquery
vh-lfi-004File inclusiononA remote http, https or ftp URL in a file, template, include, inc, require or page parameter of a query stringquery
vh-ssrf-001SSRFonThe cloud metadata address 169.254.169.254any
vh-ssrf-002SSRFonA file, gopher, dict, ldap or tftp URL in a query stringquery
vh-expr-001Template and expression injectiononA JNDI lookup in the Log4Shell form (${jndi:)any
vh-expr-002Template and expression injectiononThe 49 or ${7*7} template probeany
vh-expr-003Template and expression injectiononThe Spring class loader property path (class.module.classloader)any
vh-xxe-001XML external entitiesonAn entity declared with SYSTEM in the body prefixbody
vh-scanner-001Known scannersonThe user agent of a known scanner (sqlmap, nikto, nuclei, masscan, zgrab, acunetix, havij, commix, wpscan, dirbuster, gobuster or nmap)header user-agent
vh-cve-2026-9103Opt-in virtual patch (CVE-2026-9103, IBM Langflow OSS)offAny request to /api/v1/login/auto_login in any letter case, which issues superuser tokens without authentication when AUTO_LOGIN is enabled, which is the defaultpath
vh-cve-2026-8481Opt-in virtual patch (CVE-2026-8481, IBM Langflow OSS)offA POST to /api/v1/validate/code in any letter case, which runs user-supplied Python through exec() without a sandbox; an authenticated user can exploit it, so the rule also covers a stolen or self-registered accountmethod and path

Opt-in rules ​

A rule with off in the Default column is a virtual patch for a known flaw in a product. It blocks a whole endpoint, and that endpoint may be used legitimately by the product's own users, so it is not on everywhere. Enable it on the sites that run the affected product, and only there:

nginx
site langflow.example.com {
    upstream http://langflow:7860;
    enable_rule vh-cve-2026-9103 vh-cve-2026-8481;
}

The two rules cover IBM Langflow OSS 1.0.0 through 1.10.0:

  • vh-cve-2026-9103: IBM bulletin. IBM recommends upgrading to 1.10.1.
  • vh-cve-2026-8481: IBM bulletin. Upgrade past 1.10.0, and check the bulletin for the fixed release.

Both rules block until the product is upgraded. Later Langflow bulletins can list newer fixed releases, so run the latest release. The policy for these rules, and how to write rules of your own for other advisories, is in From CVE advisories to rules.

CVE-2026-8505 (a webhook that runs a flow without an API key when WEBHOOK_AUTH_ENABLE is false) has no shipped rule, because the rule language cannot express a missing header. The fix IBM gives is an upgrade to 1.10.1; see its bulletin and From CVE advisories to rules.

Released under the MIT License.