VNX-1004 – Sensitive cookie set without the HttpOnly flag
Reports session, authentication and identity cookies set without HttpOnly in Go, Node.js, PHP, Python and Java, and framework settings that turn the session cookie's HttpOnly flag off.
VNX-1021 – Improper Restriction of Rendered UI Layers (Clickjacking)
Reports code and configuration that disables, weakens or removes the browser's frame protection (X-Frame-Options, CSP frame-ancestors, Spring Security, helmet, Django, Rails, Rack, Talisman, ASP.NET), so any site can frame the application.
VNX-1023 – Secret compared by prefix, suffix or truncation
Reports passwords, tokens, keys, signatures, digests, OTPs and PINs checked with startswith/endswith/regionMatches or compared after truncation in Python and Java, so an empty or short guess matches.
VNX-1025 – Comparison Using Wrong Factors
A comparison that examines the wrong property of its operands, so it can succeed or fail regardless of the values the author meant to compare. Reported: in Java, == or != between object references where a value comparison was meant (a String literal operand, a String-returning call such as getParameter/getHeader/trim/toString, a variable declared String a few dozen lines above, or two variables declared Integer/Long/BigDecimal and other boxed types), and classes compared by name (getClass().getName()/getSimpleName() with equals or ==); in Python, `is`/`is not` against a str, bytes, number, list, dict or empty-tuple literal in an if/elif/while/assert/return statement (also the first line of a condition that wraps) or an assignment, and type(x).__name__ or x.__class__.__name__ compared with ==/!=; in JavaScript/TypeScript, ==/=== against a fresh [] or {} literal (always a different object), x.constructor.name compared with ==/===, and typeof compared with a string typeof never returns ('array', 'null', 'date', ...); in Go, err.Error() text compared with ==/!= with a non-empty literal or another error's text instead of errors.Is (directly or through a variable assigned err.Error() a few lines above), and switch err.Error() {, and reflect.TypeOf(x).Name()/String() or fmt.Sprintf("%T") compared with ==; in PHP, loose ==/!= with an md5/sha1/hash/hash_hmac/crypt result, directly or through a variable assigned one a few lines above ("0e..." hashes compare as numbers), strcmp/strcasecmp(...) == 0 and !strcmp(...) (NULL == 0 when an argument is an array), and get_class() compared with a string literal. Not reported: err.Error() != "" (an emptiness test), comparisons with null/None/True/False, enums, primitives and char literals, equals()/Objects.equals/MessageDigest.isEqual/hash_equals/password_verify/errors.Is/instanceof/isinstance, strict === in PHP, a.intern() == b.intern(), get_class() against ::class or __CLASS__, timing-unsafe comparison of secrets (a different weakness), test code, comments and the pattern inside string literals. Two comparisons are reported by a more precise rule, so the line is reported once: a Java String compared with a string literal by == or != by VNX-597 (String compared with == instead of equals()), and a PHP loose comparison VNX-PHP-010 reports (a hash compared with ==, strcmp() == 0 on request data: PHP type juggling).
VNX-1044 – Architecture with Number of Horizontal Layers Outside of Expected Range
Reports the concrete case of too few layers: an HTTP controller, view, route handler or servlet that executes SQL against the database itself, once per file, in Java, Python and JavaScript/TypeScript.
VNX-1050 – Excessive Platform Resource Consumption within a Loop
Reports Python code that opens a database connection, pool, engine, HTTP session, cloud SDK client, broker or SMTP/FTP connection on every loop iteration with arguments that do not depend on the iteration. Per-target connections, retry loops, hoisted resources, open() and tests are not reported.
VNX-1051 – Initialization with Hard-Coded Network Resource Configuration Data
Reports a literal IPv4 address written into Python, JavaScript/TypeScript, Java or Go source as a URL host, a host/address setting, or the target of a socket or dial call. Loopback, 0.0.0.0, documentation ranges, the cloud metadata address, CIDR blocks, hostnames, comments and tests are not reported.
VNX-1054 – Commented-out code
Detects blocks of comment lines that read as code (statements, control flow, calls) rather than prose, in Go, Java, JavaScript/TypeScript, PHP, Python and Ruby.
VNX-1055 – Multiple Inheritance from Concrete Classes
Reports a Python class that inherits from two or more concrete classes defined in the same file, each with its own methods or attributes. Mixins, ABCs, interfaces, empty marker classes, imported bases and test files are not reported.
VNX-1056 – Invokable Control Element with Variadic Parameters
Reports a C or C++ printf-style variadic function definition (a format string followed by ..., forwarded to the v*printf or v*scanf family) that has no format attribute on its definition or any prototype, so the compiler cannot check its arguments. Prototypes, macros, function pointers, variadic templates, count- or sentinel-driven variadics and attributed wrappers are not reported.
VNX-1057 – Data Access Operations Outside of Expected Data Manager Component
Reports raw database access (driver connect, cursor(), cursor.execute, Model.objects.raw, execute() or fetch() with SQL text) in a Python view, route, handler or controller module of a project that has a models/repositories/dao/db component. ORM queries, calls into the data layer, SQL inside the data layer, projects without one and tests are not reported.
VNX-1058 – Invokable Control Element in Multi-Thread Context with non-Final Static Storable or Member Element
Reports a non-final, non-volatile static field of a non-thread-safe type in a multi-threaded Java class (servlet, filter, Spring bean, JAX-RS resource, ContentProvider, Runnable/Thread or executor user) that a method writes without holding a lock, or a static formatter or calendar it uses unguarded. Constants, atomic and concurrent types, static-initialiser-only writes and tests are not reported.
VNX-1060 – Excessive Number of Inefficient Server-Side Data Accesses
Python database queries (cursor.execute, session.query, Model.objects.get/filter, asyncpg fetch) issued inside a loop or comprehension with the loop variable, or a name derived from it, as an argument: an N+1 query pattern. Chunked IN batches are not reported.
VNX-1070 – Serializable Data Element Containing non-Serializable Item Elements
An instance field of a JDK type that is never serializable (Thread, Socket, streams, JDBC Connection, ExecutorService, Optional, Logger and similar), neither static nor transient, in a Java class whose own header implements Serializable.
VNX-1071 – Empty Code Block
A Java if, else, for, while, synchronized, try, finally or do block with nothing between its braces, or an if or for whose body is a stray semicolon.
VNX-1092 – Use of Same Invokable Control Element in Multiple Architectural Layers
A Python data-layer module (models.py, repositories/, dao/) that imports or reads the web layer's request and response objects (Flask request/session/redirect, django.http, django.shortcuts, FastAPI Request).
VNX-1101 – Reliance on Runtime Component in Generated Code
A generated Java or Kotlin source file (one carrying, before its first type declaration, a generator header such as 'This file was generated by', 'Auto-generated', 'Code generated ... DO NOT EDIT', or a @Generated annotation) imports or names a package from the Java EE modules that were removed from the JDK in Java 11 (JEP 320): javax.xml.bind (JAXB), javax.xml.ws, javax.jws and javax.xml.soap (JAX-WS/SAAJ), javax.activation, javax.annotation.Generated/PostConstruct/PreDestroy/Resource, and CORBA (org.omg.*, javax.rmi.CORBA). The generated code then cannot run without a runtime component the platform no longer ships. Reported: each import or fully qualified use. Not reported: when the project's pom.xml or Gradle build declares the replacement runtime (jaxb-api, jaxb-runtime, jaxws-api, jaxws-rt, javax.annotation-api, javax.activation, saaj, the jakarta.* API artifacts), hand-written code (no generator marker in the header; a comment further down that mentions generated classes does not count), the jakarta.* and javax.annotation.processing.Generated replacements, other generator runtimes a build declares explicitly (protobuf, Thrift, ANTLR), and the package names inside strings or comments.
VNX-1102 – Reliance on Machine-Dependent Data Representation
C and C++ code writes or reads the in-memory representation of a multi-byte value or a struct straight to or from a socket, file or stream: send/sendto/recv/recvfrom/write/read/pwrite/pread, fwrite/fread (including the fwrite(&x, 1, sizeof x, f) form and std:: or :: qualified calls), or an iostream .write/.read through reinterpret_cast, where the buffer is the address of a variable (&n) or a pointer and the size is sizeof of that variable, of a multi-byte scalar type (int, long, short, uint16_t/uint32_t/uint64_t, float, double, size_t) or of a struct. The bytes on the wire or on disk then depend on the host's byte order, type widths, alignment and struct padding, so another machine reads a different value. Reported: the call line. Not reported: a byte-order conversion of the same variable within a few lines (htonl/ntohl, htobe64/le64toh, bswap, cpu_to_le32, memrev), single-byte values (char, uint8_t, bool, sizeof(char)), byte buffers sized by sizeof(buf), constant counts such as write(fd, &c, 1), host-local kernel interfaces read and written in native order by design (eventfd, signalfd, timerfd, inotify, self-pipe wakeups, judged by the descriptor's name, and descriptors the same file creates with pipe()/pipe2() or socketpair()), and calls inside comments or strings.
VNX-1103 – Use of Platform-Dependent Third Party Components
Java or Kotlin code imports or names a JDK-implementation-internal package that is not part of the Java SE platform and is not guaranteed to exist, or to behave the same, on another JVM, JDK vendor or release: sun.* (sun.misc.Unsafe, sun.misc.BASE64Encoder, sun.security.*, sun.nio.ch.*), jdk.internal.*, the com.sun.*.internal.* and com.sun.org.apache.* repackaged copies, and the unexported implementation packages com.sun.crypto.provider, com.sun.jndi, com.sun.imageio, com.sun.media.sound and com.sun.java.swing. Code built on them breaks on a JDK upgrade or a different runtime (BASE64Encoder was removed in Java 9; jdk.internal is closed by the module system). Reported: each import, static import and fully qualified use in code. Not reported: the supported, exported com.sun APIs (com.sun.net.httpserver, com.sun.management, com.sun.jna), the standard replacements (java.util.Base64, VarHandle), class names inside string literals (the reflective probe-and-fall-back pattern), third-party libraries that merely live under com.sun (com.sun.mail, com.sun.jersey, the com.sun.xml.bind and com.sun.xml.ws reference implementations), lookalike packages (sunrise, sunflower) and comments.
VNX-1104 – Use of Unmaintained Third Party Components
A dependency manifest declares a third-party component whose maintainers have deprecated, archived or end-of-lifed it, so security fixes no longer arrive: npm request/request-promise(-native), node-uuid, jade, node-sass, tslint, gulp-util, coffee-script, istanbul, babel-eslint, nomnom, bower, phantomjs(-prebuilt), protractor, swig and the npm 'crypto' stub in package.json dependency blocks; pycrypto, nose, PyPDF2, MySQL-python, pep8, sklearn and distribute in requirements*.txt (and requirements/*.txt), pyproject.toml (PEP 621 arrays and Poetry dependency tables) and Pipfile package sections; paperclip, therubyracer and Ruby Sass (gem 'sass') in a Gemfile; and log4j 1.x (log4j:log4j), commons-httpclient 3.x and Jackson 1.x (org.codehaus.jackson) in pom.xml and Gradle builds. Reported: the declaring line, with the maintained successor in the message. Not reported: the successors themselves (uuid, pug, sass, eslint, nyc, pycryptodome, pypdf, nose2, scikit-learn, mysqlclient, kt-paperclip, log4j 2, httpclient 4), lookalike names (request-ip, sass-rails, log4j-api, log4j-1.2-api), the names used as npm script keys or descriptions, Poetry and Pipfile [scripts] entries, and commented-out entries (including entries inside XML comments in pom.xml). A component that is merely old, or unmaintained without an upstream announcement, is not inferred.
VNX-1105 – Insufficient Encapsulation of Machine-Dependent Functionality
C or C++ inline assembly (asm(...), asm volatile(...), __asm__ __volatile__(...), MSVC __asm/_asm { ... } blocks and single-line __asm/_asm instructions) appears in a file that is not a dedicated machine-dependent module, so CPU-specific code is mixed into general logic instead of being isolated behind a portable interface. Every port to a new architecture or compiler then has to find and rewrite it in place. A file counts as a dedicated module when it lives in a directory named for an architecture or platform layer (arch/, asm/, platform/, port/, hal/, cpu/, x86/, x86_64/, x86-64/, arm64/, aarch64/, riscv/, simd/, intrinsics/, atomic/ and similar) or its name says so (*atomic*, *intrin*, *simd*, barrier*, spinlock*, cpu*, *_x86, *_arm, *_avx2, *_neon, rdtsc*, platform*, osdep*, and the time-source modules monotonic*, clock*, timer*). Reported: the line opening each assembly statement. Not reported: inline assembly in such modules, calls to wrapper functions and compiler intrinsics, the asm keyword inside strings, identifiers that merely contain 'asm', and comments. Machine dependence other than inline assembly (system calls, intrinsics, preprocessor platform checks) is not judged.
VNX-1106 – Insufficient Use of Symbolic Constants
A Java source file repeats the same non-trivial numeric literal (three or more digits, or a hexadecimal literal of three or more digits, such as 15000, 5242880, 413 or 0xCAFEBABE) in three or more separate statements instead of naming it once as a constant. Timeouts, size limits, status codes and magic values written out at each use drift apart when one copy is changed and the others are not, which is how a limit enforced in one place is forgotten in another. Reported: every statement that repeats the literal. Not reported: a literal used once or twice, a literal on a final/static final constant declaration (the symbolic constant itself), serialVersionUID, annotation arguments, lines that are tables of three or more numbers (array initialisers, lookup tables), round and bit-width values (powers of ten, 128 to 65536 and their masks 255/0xFF/0xFFFF/0xFFFFFFFF), decimals, numbers inside strings, Java text blocks and comments, generated sources (a generator header before the first type declaration, or @Generated), and test files. Literals that are each used only once are not judged: a single magic number is a style choice this line-oriented rule cannot weigh.
VNX-1107 – Insufficient Isolation of Symbolic Constant Definitions
The same symbolic constant, with the same name and the same literal value, is defined separately in two or more Java source files (static final fields, or interface fields) instead of once in a shared constants class that the others reference. Each copy is changed on its own, so a timeout, retry limit, URL or key length that is meant to be one value drifts between classes. Reported: every duplicate definition, on the line that names the constant. Not reported: constants defined once and imported elsewhere, same names with different values (TAG, per-class limits), loggers and other non-literal initialisers, serialVersionUID, trivial values (true/false, 0, 1, -1, empty string, null), definitions repeated inside one file, generated sources (Android BuildConfig, protoc output and other files with a generator header before the first type declaration, or @Generated; an IDE's 'Auto-generated method stub' comment does not count), and test files. Only literal values are compared; constants computed from expressions are not.
VNX-1108 – Excessive Reliance on Global Variables
A Python or PHP module relies on mutable global state from inside its functions to an excessive degree: the file contains three or more `global` statements (Python `global name`, PHP `global $name`), or a single `global` statement that rebinds four or more names. Functions coupled through shared globals cannot be reasoned about or tested in isolation, and in a long-lived web worker the values leak between requests and users. Reported: each `global` statement in such a file. Not reported: a file with one or two narrow `global` statements (the lazy singleton or module cache), the word global in strings, docstrings and comments, identifiers such as global_counter or GLOBAL_TIMEOUT, nonlocal, $GLOBALS array access, PHP statements that name only WordPress core globals ($wpdb, $post, $wp_query and the like, which WordPress exposes only that way), global statements shown as examples inside Python docstrings, and test files.
VNX-1117 – Callable with Insufficient Behavioral Summary
Reports Python functions whose docstring is empty or a placeholder ("""""", """TODO""", """...""", a _summary_ stub or a bare TODO note), and public top-level functions or methods of 50 or more code lines with no docstring. Short or private helpers, nested functions and test files are not reported.
VNX-1118 – Insufficient Documentation of Error Handling Techniques
Reports a Python function whose docstring documents arguments and returns in sections (Google, NumPy or Sphinx style) but that raises a named exception its docstring never mentions. Bare re-raises and re-raised exception values, SystemExit, NotImplementedError, undocumented or summary-only functions and test files are not reported.
VNX-112 – Missing XML Validation
XML received in an HTTP request is parsed (DocumentBuilder, JAXB, StAX, lxml/ElementTree, minidom, xmltodict, xml2js, libxmljs, DOMParser, fast-xml-parser) in a file with no schema or structural validation.
VNX-1121 – Excessive McCabe Cyclomatic Complexity
Reports a Python top-level function or method whose McCabe cyclomatic complexity is 26 or more (one plus every if, elif, for, while, except and case statement and every and/or in their conditions). Simpler functions, comprehension decisions, docstring prose and test files are not counted or reported.
VNX-1122 – Excessive Halstead Complexity
Reports a single Python statement line whose expression packs 16 or more arithmetic, bitwise, comparison and boolean operators, a line-level proxy for Halstead difficulty. Type unions and flag sets built only from |, negative literals in tables, docstring rule lines, string literals, comments, signatures, decorators and test files are not counted or reported.
VNX-1123 – Excessive Use of Self-Modifying Code
Reports code that rewrites itself at run time: a Python or Node.js program writing to its own source file (__file__, sys.argv[0], __filename, process.argv[1], import.meta.url), replacing a function's __code__, or building or patching code objects. Reading one's own source and exec(compile(...)) of another file are not reported.
VNX-1124 – Excessively Deep Nesting
Reports the first Python control-flow statement in a function that sits inside five or more enclosing control blocks, measured from the enclosing def with the function's own indent step. Shallower nesting, nested defs, continuation lines, comments, docstrings and test files are not reported.
VNX-1125 – Excessive Attack Surface
Reports Python RPC servers configured to expose far more than their own handlers: XML-RPC register_instance with allow_dotted_names=True, RPyC classic services or allow_all_attrs/allow_setattr/allow_delattr, Pyro4 REQUIRE_EXPOSE = False, and eval, exec, open, os.system or subprocess functions registered as remote procedures, directly or wrapped in a lambda.
VNX-1126 – Declaration of Variable with Unnecessarily Wide Scope
Reports a Python global statement inside a function or method body (global counter, global a, b), which makes the function rebind a module-level variable: every caller, thread and request then shares and mutates that one binding, so state set for one caller leaks into the next. The finding is the global line itself. Not reported: a global statement at module level (it has no effect), nonlocal (closure scope), globals that are only module dunders such as __doc__ or __all__, the word 'global' in a comment, a string or prose, and test files (including conftest.py). A global line inside a triple-quoted string is not a statement and is not reported. Whether a particular module-level variable should be wider than its function is a design judgement; the rule reports the statement that widens it.
VNX-1127 – Compilation with Insufficient Warnings or Errors
Reports C and C++ code and build files that switch off the compiler warnings which catch memory-safety and format-string defects. In C/C++ sources: #define _CRT_SECURE_NO_WARNINGS / _CRT_SECURE_NO_DEPRECATE / _SCL_SECURE_NO_WARNINGS, #pragma warning(disable: ...) naming C4996 (unsafe CRT functions such as strcpy) or the uninitialised-variable and buffer-overrun warnings (C4700, C4701, C4703, C4789), and #pragma GCC/clang diagnostic ignored (or the _Pragma("GCC diagnostic ignored ...") operator in a macro) for -Wall, -Wextra, -Weverything, -Wformat, -Wformat-security, -Wformat-nonliteral, -Wimplicit-function-declaration, -Wint-conversion, -Wincompatible-pointer-types or -Wreturn-type. In CMakeLists.txt, *.cmake, meson.build, Makefiles and MSBuild .vcxproj/.props files: a compiler flag that disables all warnings (-w, /W0, -Wno-everything, meson warning_level=0), -Wno-format / -Wno-format-security, MSVC /wd4996 (and /wd for C4700, C4701, C4703, C4789) and -D_CRT_SECURE_NO_WARNINGS, on a flags line (CFLAGS, CXXFLAGS, CMAKE_*_FLAGS, the COMPILE_FLAGS/COMPILE_OPTIONS properties, add_compile_options, target_compile_options, add_definitions, add_project_arguments, or a cc/gcc/clang/$(CC) command); _CRT_SECURE_NO_WARNINGS / _CRT_SECURE_NO_DEPRECATE / _SCL_SECURE_NO_WARNINGS named as a definition on any line (target_compile_definitions, add_compile_definitions, PreprocessorDefinitions) other than a message/echo; and MSBuild <WarningLevel>TurnOffAllWarnings or <DisableSpecificWarnings> listing 4996, 4700, 4701, 4703 or 4789. Not reported: a pragma or flag scoped to a GCC memory diagnostic such as -Warray-bounds, -Wstringop-overread or -Wuse-after-free (well-maintained projects silence these locally for known compiler false positives), suppression of a specific stylistic warning (fallthrough, unused parameter, constant conditional), strict flags such as -Wall -Werror, -w in a non-compiler command (sysctl -w), comments and strings in C sources.
VNX-114 – Process Control: request chooses the library or module loaded
HTTP request data names the native library, plugin or module loaded by plugin.Open, System.load, URLClassLoader, require/import(), dl(), FFI, importlib, ctypes, Ruby require/load or Fiddle.
VNX-115 – Misinterpretation of Input
A request value is converted or compared in a way that reads it as something other than what the requester sent, so the program acts on a different value than the one it checked or meant (CWE-115). Reported: JavaScript/TypeScript parseInt/Number.parseInt of request data with no radix argument ("0x10" is read as 16); JavaScript Boolean(x) or !!x and Python bool(x) of a string request value (req.query/params/headers/cookies; request.args/form/values/GET/POST/cookies/headers .get() or [...]), which is true for "false" and "0"; PHP loose comparison (== or !=) of request data with a token, password, hash, secret, signature, key, code or PIN ("0e..." magic hashes and type juggling make unequal values equal), strcmp() of request data tested with == 0 or ! (an array argument returns NULL, which equals 0), and in_array() of request data without the strict third argument. Request data is used inline or through a variable assigned from it in the 25 lines above. Not reported: parseInt with a radix, Number(), explicit comparisons such as === 'true' or .lower() == 'true', bool() of a whole collection (bool(request.args)), JSON body values in the Boolean checks (already typed), ===, hash_equals and password_verify, in_array(..., true), loose comparison with an ordinary string, and code in comments. Two shapes are reported by a more precise rule, so the line is reported once: a radix-less parseInt of request data used inline or through a variable assigned within the 10 lines above by VNX-1389 (incorrect parsing of numbers with different radices), and a PHP loose comparison or strcmp() test that VNX-PHP-010 reports (PHP type juggling); this rule keeps the longer 25-line flows, the Boolean/bool checks and non-strict in_array().
VNX-1173 – Improper Use of Validation Framework
Reports Java code that has a validation framework available but leaves an input path out of it. Reported: in a Spring @Controller/@RestController that validates request bodies with @Valid elsewhere in the same file, a handler parameter bound with @RequestBody (including @RequestBody(required = false) and with other annotations such as @NotNull beside it) to an application type (a DTO, or a List/Set of one) without @Valid or @Validated (fully qualified @jakarta.validation.Valid counts), so that endpoint accepts the object unchecked; Bean Validation constraints (@Size, @Pattern, @Max, @NotBlank and the rest) on a @RequestParam, @PathVariable or @RequestHeader parameter in a controller with no @Validated anywhere in the file, which Spring before Framework 6.1 silently ignores (skipped when the project pins Spring Boot 3.2+ or Spring Framework 6.1+ in pom.xml (parent, spring-boot.version property or spring-boot-dependencies import), build.gradle(.kts), a Gradle version catalog or gradle.properties, where controller method validation is built in); and a Struts 1 <action> mapping with validate="false", which skips the ActionForm and Validator checks. Not reported: bodies bound to String, Map, JsonNode and other raw types, controllers that never use @Valid (the rule cannot tell which DTOs carry constraints), a @Validated controller, validate="true", XML comments, and test files. A BindingResult that is declared and never read is VNX-20's finding.
VNX-1188 – Initialization of a Resource with an Insecure Default
Reports a security setting that is initialised to its insecure value whenever nobody configures it. Python: a top-level DEBUG = True in a settings module that is not a development/local/test settings file, and an environment or config read (os.environ.get, os.getenv, os.environ.setdefault, decouple config(), django-environ env()/env.bool()) whose fallback value turns on a debug/insecure switch (DEBUG as the last word of the name, DEBUG_MODE, ALLOW_INSECURE, SKIP_TLS_VERIFY, DISABLE_AUTH, DISABLE_CSRF, NO_AUTH, CORS_ALLOW_ALL ...) or turns off a protection (VERIFY_SSL, TLS_VERIFY, CHECK_CERT, REQUIRE_AUTH, AUTH_ENABLED, CSRF_ENABLED, SECURE_COOKIES, SESSION_COOKIE_SECURE, SECURE_SSL_REDIRECT, HTTPS_ONLY, COOKIE_SECURE, REJECT_UNAUTHORIZED ...). Pydantic BaseSettings: a bool field declared directly in a class deriving from BaseSettings whose default is the insecure value (debug: bool = True, verify_ssl: bool = False). JavaScript/TypeScript: process.env.NAME || value or ?? value with the same insecure fallback, a destructuring default from process.env (const { DEBUG = 'true' } = process.env), process.env.INSECURE_SWITCH !== 'false' (on unless disabled) and process.env.PROTECTION === 'true' (off unless enabled). Not reported: a secure fallback (DEBUG defaulting to False, VERIFY_SSL defaulting to True), a read with no fallback, non-boolean settings, names that configure a debug tool rather than a debug mode (DEBUG_COLORS, DEBUG_PORT), a read quoted inside a string literal, a BaseSettings subclass of a project base class (the base is not followed), DEBUG = True in dev/local/test settings files or indented inside a class or docstring, comments, strings and test files. DEBUG turned on in a Django deployment settings module (DEBUG = True, or DEBUG read from the environment with a true default) is reported by VNX-PY-006, not here.
VNX-1204 – Generation of Weak Initialization Vector (IV)
Reports Java code that builds a cipher IV or nonce (IvParameterSpec, GCMParameterSpec, ChaCha20ParameterSpec) from bytes that are not freshly random: a zero-filled new byte[N] passed straight to the spec; a byte[] allocated with new byte[N] and handed to the spec within the next 40 lines without anything filling it (no nextBytes, read, readFully, ByteBuffer.get, System.arraycopy, element assignment or other call that takes the array); a byte[] initialised from a literal ({...}, new byte[]{...}, "...".getBytes()) that the file uses as an IV; a string literal's bytes passed to the spec; and an IV filled by java.util.Random or ThreadLocalRandom.nextBytes. A zero, constant or predictable IV repeats across messages, which leaks plaintext equality under CBC and breaks confidentiality and authentication under CTR and GCM. Not reported: IVs filled by SecureRandom, IVs read from the message being decrypted, cipher.getIV(), byte arrays never used as an IV, strings and comments. Overlaps VNX-JAVA-020 (static IV) and VNX-329 (predictable IV); VNX-CRYPTO-010 (hard-coded IV, nonce or salt) leaves the Java IV lines this rule reports to it.
VNX-1230 – Exposure of Sensitive Information Through Metadata
Reports a handler that stores a user-uploaded image byte for byte, so the EXIF block it carries (GPS coordinates, device make and serial, capture time, sometimes the owner's name) is published with it when the image is served. Reported, in a file that handles images (an image/ MIME check, an image extension, or avatar/photo/picture naming) and never re-encodes or strips them (no sharp, jimp, gm, Pillow Image.open/ImageOps, piexif, exif or strip-metadata call in the file; Python's str.strip() does not count, and comment lines are ignored when judging image context): Node fs.writeFile/writeFileSync of an uploaded buffer (req.file.buffer, or a variable taken from req.file/req.files or a .buffer), express-fileupload .mv() on a req.files entry, multer({ dest }) and multer.diskStorage(); Python Flask request.files[...] .save() (directly, through a variable, or in a for loop over request.files.getlist()), Django default_storage/FileSystemStorage .save() of a request.FILES entry, and a chunks() loop copying one to disk. Not reported: images decoded and re-encoded or stripped in the same file, uploads in files with no image context (documents, CSV), comments and test files. Stripping performed in another module is not visible to this line-oriented rule.
VNX-1235 – Incorrect Use of Autoboxing and Unboxing for Performance Critical Operations
Reports Java arithmetic on a boxed numeric type inside a loop, where every iteration unboxes the value, computes, and allocates a new wrapper object: a for loop whose counter is declared as Integer, Long, Short, Byte, Double, Float or Character (for (Integer i = 0; i < n; i++)), and a local variable declared as one of those wrapper types with a numeric initial value (Long sum = 0L) that is then updated with ++, --, +=, -=, *=, /= or x = x + ... inside a for, while or do loop opened after it within the next 40 lines, including a single-statement loop body on the loop header line. Not reported: primitive counters and accumulators, enhanced-for loops over a List<Integer> (the element must be boxed anyway), wrapper variables that are only compared or reassigned, updates outside the loop, fields declared with an access modifier, comments and strings. This is a performance weakness: in a hot path the allocations raise GC pressure and latency, which is how it becomes a denial-of-service concern.
VNX-1236 – Improper Neutralization of Formula Elements in a CSV File
Reports a CSV export served to users (the file sets a text/csv content type, a .csv attachment or download name) that writes data rows through a CSV library without neutralising cells beginning with =, +, -, @, tab or carriage return, so a stored value such as =HYPERLINK(...) or =cmd|... runs as a formula when the download is opened in a spreadsheet. Reported: Python csv.writer/csv.DictWriter .writerow()/.writerows() and pandas .to_csv(); JavaScript json2csv (new Parser().parse, json2csv.parse), csv-stringify stringify(), fast-csv write/format, and papaparse Papa.unparse() without escapeFormulae; Java OpenCSV CSVWriter.writeNext()/writeAll() and Apache Commons CSV CSVPrinter.printRecord()/printRecords(). Not reported: header rows made only of string literals, files that neutralise formula cells (a sanitise/escape-formula helper, a check against the formula characters, defusedcsv, escapeFormulae: true), CSV written to local files with no HTTP download context, comments and test files. The download context and the neutralisation are judged on code with comment lines removed, so a Javadoc mentioning text/csv is not a download and a TODO saying sanitise is not a sanitiser. Building CSV lines by string concatenation from request data is VNX-140's finding.
VNX-1240 – Use of a Cryptographic Primitive with a Risky Implementation
A Java javax.crypto.Cipher is created for a block cipher in ECB mode, which encrypts equal plaintext blocks to equal ciphertext blocks and so leaks the structure of the data and allows blocks to be cut, replayed and reordered. Reported: Cipher.getInstance() whose transformation names ECB for a block cipher ("AES/ECB/PKCS5Padding", "DESede/ECB/NoPadding", any case, with or without a provider argument), a bare block-cipher name ("AES", "DES", "DESede", "Blowfish", "RC2" and the like) for which the JCE provider default is ECB, the transformation written on the line after the opening parenthesis, and a Cipher.getInstance(NAME) whose NAME is a constant assigned such a transformation in the same file. Not reported: GCM, CCM, CBC, CTR and other modes, ChaCha20, AESWrap, RSA/ECB/... (RSA has no chaining; padding is judged by VNX-780), KeyGenerator.getInstance("AES") and SecretKeySpec(..., "AES"), a transformation passed in a variable whose value is not visible in the file, the text in comments or inside other string literals, and every call VNX-CRYPTO-003 (AES in ECB mode, CWE-327) reports: an explicit /ECB/ transformation, a bare block-cipher name, a constant or a getProperty default holding one, and a call split after getInstance( (reported there on the call line). Those are reported by VNX-CRYPTO-003, so a Java ECB cipher is one finding rather than two. What that rule does not report stays here: a mode concatenated onto the algorithm (alg + "/ECB/PKCS5Padding"), a getOrDefault default, and ECB in test sources, which VNX-CRYPTO-003 leaves out.
VNX-1241 – Use of Predictable Algorithm in Random Number Generator
A java.util.Random, whose linear congruential algorithm is fully determined by its 48-bit seed, is given an explicit seed in production Java code, so every value it produces can be reproduced by anyone who knows or guesses the seed (a constant, the clock, a counter or a value derived from user data). Reported: new Random(<seed>) and new java.util.Random(<seed>) with any argument (a literal, a constant, System.currentTimeMillis()/nanoTime(), an expression), and <name>.setSeed(...) on a variable or field the same file declares as Random or assigns new Random(...). Not reported: new Random() with no seed (whether its use is security-sensitive is judged by VNX-JAVA-016), SecureRandom and its setSeed (which adds entropy rather than replacing it; seeding SecureRandom is VNX-335), other classes whose name merely contains Random, a method that is itself named setSeed, test code, comments and string literals.
VNX-1254 – Incorrect Comparison Logic Granularity
A secret (a MAC, HMAC, signature, digest, hash, token, key, password, OTP, nonce or session value) is compared one element at a time in a Java loop that returns false at the first mismatch, so the comparison is performed in steps and its running time reveals how many leading bytes or characters of a forged value are correct (the software form of CWE-1254). Reported: inside a for/while loop, if (a[i] != b[i]) or if (a.charAt(i) != b.charAt(i)) followed by return false on the same line or the next code line, when the compared names or the enclosing method's signature name a secret. Not reported: an accumulate-and-test loop (diff |= a[i] ^ b[i]), MessageDigest.isEqual, a loop that returns the index of the first difference, the same loop over values whose names and method do not say they are secret, and comments. Whole-value comparisons with equals/Arrays.equals/== are reported by VNX-CRYPTO-008 and VNX-385.
VNX-1265 – Unintended Reentrant Invocation of Non-reentrant Code Via Nested Calls
strtok() keeps its position in hidden static state, so it is not reentrant: starting a second tokenization while one is in progress silently replaces the first, and the outer loop's next strtok(NULL, ...) continues through the wrong string or stops early. Reported, in C: inside the body of a for/while loop that iterates a strtok() tokenization (the loop begins on, or within three lines after, a strtok() call with a non-NULL string, and its header or body calls strtok(NULL, ...)), a line that starts another strtok() on a non-NULL string, or that calls a function defined in the same file whose body starts a strtok() tokenization (the nested call re-enters strtok). Not reported: strtok_r()/strtok_s(), a second tokenization that begins after the first loop has ended, a helper that does not call strtok(), a function calling itself, calls into other files (not visible to a line-oriented rule), text in comments and string literals. Signal handlers that call non-reentrant functions are reported by VNX-479 and VNX-828.
VNX-1269 – Product Released in Non-Release Configuration
A Python debugger hook is left in production code, so the shipped program stops at an interactive debugger prompt (hanging the worker, or handing a shell to whoever owns the terminal) or opens a remote-debug port that executes arbitrary code for anyone who connects. Reported, unconditionally reached (not inside an if that tests a debug, pdb, environment, settings, config, args or flag value): pdb/ipdb/pudb/rpdb/remote_pdb/web_pdb.set_trace(), pdb.post_mortem()/pm(), the built-in breakpoint(), a bare set_trace() or embed() imported from one of those debuggers or from IPython, __import__("pdb").set_trace(), IPython.embed(), debugpy.listen()/wait_for_client()/breakpoint(), ptvsd.enable_attach()/wait_for_attach(), pydevd/pydevd_pycharm.settrace() and code.interact(). Not reported: a debugger behind a debug flag or environment check, a method or function of the program's own named set_trace or breakpoint (obj.set_trace(), self.breakpoint()), test files, an interactive console that is the program's own feature (code.interact() or embed() inside a function named for a shell, repl or console, as flask shell is), and the names in comments and strings. DEBUG = True framework settings are reported by VNX-215.
VNX-1275 – Sensitive Cookie with Improper SameSite Attribute
A cookie is configured with SameSite=None, or with the SameSite attribute switched off, so the browser attaches it to cross-site requests and a session cookie becomes usable for cross-site request forgery. Reported in JavaScript/TypeScript: a sameSite: 'none' (any case, any quote, quoted or bare key) or sameSite: false property in cookie options (res.cookie, express-session, cookie-session, cookie.serialize and similar option objects, on the call line or on its own line), an assignment such as req.session.cookie.sameSite = 'none', and a Set-Cookie header or document.cookie string containing SameSite=None. Python: SESSION_COOKIE_SAMESITE, CSRF_COOKIE_SAMESITE, LANGUAGE_COOKIE_SAMESITE or REMEMBER_COOKIE_SAMESITE set to None, False or "None" in any case (Django settings, Flask app.config[...] or config.update(...)), and set_cookie()/set_signed_cookie() calls with samesite=None or samesite="none" (on the call line or a continuation line of it), and Starlette/FastAPI SessionMiddleware with same_site="none". Not reported: Lax, Strict or true, a value computed at run time, a TypeScript type that lists 'none' among the allowed values, a set_cookie method signature whose parameter defaults to None, comparisons, the text inside comments and string literals, and test files. SameSite=None is sometimes required for a cookie used in a cross-site embed; such a cookie must not carry a session or credential.
VNX-128 – Wrap-around Error
Reports C/C++ allocations (malloc, alloca, realloc, new T[]) whose size multiplies a count read from input (atoi/strtoul, ntohl, getenv, scanf/fread into &n) with no overflow check, so a large count wraps the size around.
VNX-1284 – Improper Validation of Specified Quantity in Input
A quantity the client chose (a request field named quantity, qty, amount, units, credits, points, coins, num_items, deposit or withdraw/withdrawal) is used in a balance, stock or price calculation, or stored on an order, cart or wallet record, with no check that it is positive and within limits, so a negative or huge value moves money the wrong way, creates stock or overflows a total. Reported in Python (Flask/Django/DRF request.args/form/values/json/GET/POST/data/query_params) and JavaScript/TypeScript (req.body/query/params, including const { quantity } = req.body): the value, inline or through a variable assigned from it in the 20 lines above (including a TypeScript-annotated const), used in x += / -= / *= arithmetic, a $inc update, a multiplication, an x = y + / - arithmetic assignment, or as a quantity-named field (or shorthand property) of an ORM create/update/insert/save/build/upsert, $inc or $set. Not reported: a comparison of the value (<, <=, >, >=, in range(...)) or a max()/abs()/clamp/positive check between the read and the use, a file that validates with a schema (Joi/yup/zod .positive() or .min(0|1), pydantic conint/confloat/PositiveInt/gt=0/ge=1, express-validator isInt/isFloat({ min | gt })), the local assignment that reads the value, a value that is only displayed, counts and page sizes (judged by VNX-400 and VNX-606), a client amount credited to a balance or booked as an order total that VNX-840 reports (Client-Controlled Monetary Value, such as dst.balance += int(request.form["amount"]) or { $inc: { balance: -amount } } in a payment or wallet handler): that line is reported by VNX-840, so the negative-amount transfer is one finding rather than two, and text in comments and strings.
VNX-1285 – Improper Validation of Specified Index, Position, or Offset in Input
A position the client chose is used to index a list or array with no bounds check, so a negative value silently selects from the end (Python), an out-of-range value raises or yields undefined, and the client can read or remove an element it was never offered. Reported in Python: int(...) of a Flask/Django/DRF request value (request.args/form/values/json/GET/POST/data/query_params/view_args) used as a subscript x[v], or as the position of .pop(v)/.insert(v, ...), inline or through a variable assigned from it in the 15 lines above. JavaScript/TypeScript: parseInt/Number/parseFloat/unary + of req.body/query/params, or a req field named index, idx, pos, position, offset, slot, choice, row or column, used as a subscript x[v] or as the position of .splice(v, ...)/.at(v)/.charAt(v), inline, through a variable assigned in the 15 lines above, or through a position-named field destructured from the request (const { index } = req.body). Not reported: a comparison of the value (<, <=, >, >=, or a check against len()/.length) between the read and the use, slices (rows[offset:offset+20], .slice()), lookups keyed by a string (users[req.params.id], THEMES[name]), and text in comments and strings. Upper-bound-only checks are reported by VNX-839.
VNX-1289 – Improper Validation of Unsafe Equivalence in Input
Detects an uploaded file name checked against a denylist of dangerous extensions (php, exe, jsp, html, svg...) with a case-sensitive comparison, so shell.PHP passes. Python and JavaScript/TypeScript.
VNX-1304 – Security state restored from unprotected saved state
Detects Android Java/Kotlin code that restores a security decision (logged in, admin, role, PIN verified, unlocked, premium) from plain SharedPreferences or a saved-instance Bundle instead of re-establishing it. The software analogue of CWE-1304.
VNX-1322 – Use of Blocking Code in Single-threaded, Non-blocking Context
Reports synchronous Node.js APIs (fs.*Sync, execSync/spawnSync, pbkdf2Sync/scryptSync, zlib *Sync, bcrypt hashSync/compareSync) called inside an HTTP request handler, where they stall the event loop for every client. Startup code, helpers outside handlers, async APIs, scripts and tests are not reported.
VNX-1324 – Hardware debug interface (JTAG/SWD) enabled in firmware outside a debug build
Reports firmware C/C++ code that enables or keeps alive a hardware debug port (STM32 DBGMCU, Cortex-M DHCSR C_DEBUGEN, SWJ remap, AVR JTD cleared, nRF APPROTECT disabled, JTAG/SWD enable flags) outside a #ifdef DEBUG / #ifndef NDEBUG block.
VNX-1325 – Improperly Controlled Sequential Memory Allocation
Detects allocations (Go make, Java new byte[]/ByteBuffer.allocate, C/C++ malloc/calloc/realloc/new T[]) sized by a value that arrives from outside the program, such as a parsed number, a length prefix or a request header, with no upper bound checked first, and loops bounded by such a value that allocate on every pass. Sizes from len()/sizeof, constants, values compared against a maximum or clamped with min() are not reported.
VNX-1327 – Binding to an Unrestricted IP Address
Reports servers bound to a hard-coded wildcard address (0.0.0.0, ::, [::], Python's empty host) in Python, Node.js and Go: socket bind, app.run/uvicorn host=, .listen(port, '0.0.0.0'), net.Listen("tcp", "0.0.0.0:port"), http.Server{Addr:}, directly or through a constant. Loopback, configured addresses and Go's ":port" form are not reported.
VNX-1335 – Incorrect Bitwise Shift of Integer
Reports C/C++ shifts by a constant at or past the operand's width, or by a negative constant, which are undefined behaviour: 1 << 40, 1u << 32, 1ULL << 64, (uint32_t)v >> 32, a uint32_t/int variable shifted by 32, x << -1. Suffixed or widened operands within their width are not reported.
VNX-1336 – Server-side template injection: template source built from request data
Reports Python and Node.js code that compiles a template whose source comes from request data (render_template_string, Jinja2 from_string/Template, Django and Mako Template, Handlebars.compile, ejs/pug render and compile, nunjucks renderString, lodash _.template), directly or through one or two assignments. Literal or file templates with request data passed as context are not reported.
VNX-1339 – Insufficient Precision or Accuracy of a Real Number
Reports exact equality or inequality comparisons (==, !=, ===, !==) with a decimal literal that binary floating point cannot represent exactly (0.1, 0.3, 19.99f) in Python, JavaScript/TypeScript, Java and Go. Exact literals (0.5, 1.0), tolerance comparisons, ordering comparisons, strings and test files are not reported.
VNX-1341 – Multiple Releases of Same Resource or Handle
Reports C/C++ code that releases the same pointer, descriptor or handle twice on one path (free, fclose, close, CloseHandle, delete, *_free/*_destroy/*_close/*_cleanup), including an error path that frees and then jumps with goto to a cleanup label that frees again. Releases followed by x = NULL, exclusive branches and early returns are not reported.
VNX-1389 – Incorrect Parsing of Numbers with Different Radices
Reports parsers that guess the radix from the text (parseInt without a radix on request data, int(x, 0), strconv.ParseInt(s, 0, n), Integer.decode, strtol(s, end, 0), std::stoi(s, nullptr, 0), scanf %i, inet_aton/inet_addr), so '010' or '0x10' parse to a different value than a check expects.
VNX-1390 – Weak Authentication: HTTP Digest or NTLM
Reports code that selects a weak HTTP authentication scheme, HTTP Digest (MD5) or NTLM (MD4), in Python, JavaScript/TypeScript, Java/Kotlin, C# and Go clients and servers.
VNX-1391 – Use of Weak Credentials
Reports a password set to a trivially guessable value (123456, qwerty, letmein, password123, admin123, p@ssw0rd, ...) in code, configuration files, docker-compose, Dockerfiles, or as the fallback of an environment lookup.
VNX-1392 – Use of Default Credentials
Reports a default account (admin, root, sa, guest, postgres, elastic, tomcat, pi, ...) configured with a default, guessable or empty password: in a URL or DSN, a connection string, as adjacent call arguments, or as neighbouring user and password keys in code and configuration.
VNX-1393 – Use of Default Password
Reports a password set to a well-known default (password, admin, root, changeme, changeit, guest, secret, postgres, ...) in code, configuration files, docker-compose, Dockerfiles, or as the fallback of an environment lookup.
VNX-1395 – Dependency on a Vulnerable Third-Party Component
Offline floor for CWE-1395: reports manifests, lockfiles and pages that pin a well-known vulnerable or compromised release of lodash, minimist, jsonwebtoken, handlebars, jQuery, AngularJS, Bootstrap, PyYAML, Jinja2, event-stream, ua-parser-js, node-ipc, vm2 or node-serialize.
VNX-178 – Improper Handling of Case Sensitivity
Reports an uploaded file's name or extension compared case-sensitively against a dangerous extension (php, jsp, aspx, exe, sh, html, svg, htaccess...), a deny check that "shell.PHP" bypasses.
VNX-179 – Incorrect Behavior Order: Early Validation
Reports a check for a dangerous sequence (.., /, <script, a quote) that runs before the same value is URL-, HTML- or Unicode-decoded, and a check on the raw query string before a decoded parameter is read.
VNX-183 – Permissive List of Allowed Inputs
Reports allow-list checks on a URL, host, origin or redirect target that accept more than they name (a domain suffix without a leading dot, a host prefix without a trailing slash, a substring match, url.includes(allowedUrl), an unanchored or unescaped domain regex) and allow-lists whose entry is the wildcard "*".
VNX-186 – Overly Restrictive Regular Expression
Reports denylist filters for script, markup or SQL injection tokens (<script, javascript:, onerror, UNION) that match case-sensitively, so <SCRIPT> or JavaScript: slips through: removals with an empty replacement, regexes without a case-insensitive flag, and membership tests of a bare token, in Python, JavaScript/TypeScript, Java, PHP and Ruby.
VNX-194 – Unexpected Sign Extension
Reports C/C++ <ctype.h> calls (isspace, isdigit, tolower, ...) given a plain char, *p or p[i] of a char pointer without an (unsigned char) cast, and Java code that combines byte[] elements by shifting or by * 256 without & 0xff.
VNX-20 – Input validation performed but its result ignored or bypassed
Input validation is wired up but never decides anything: an unread Spring BindingResult, discarded Bean Validation violations, express-validator chains with no validationResult(), WTForms data read without validate(), pydantic construct() on request data, and discarded gin bind or validator errors.
VNX-201 – Insertion of Sensitive Information Into Sent Data
Reports HTTP responses that send a stored record's password, hash, secret, API key or similar field, a whole user/account record fetched from the database and serialised as is, and Django REST ModelSerializers of User with fields = '__all__'.
VNX-205 – Observable Behavioral Discrepancy
Reports Python and JavaScript/TypeScript login code that returns before hashing the password when the account does not exist (if user is None: return, if (!user) return, except User.DoesNotExist: return, if not user or not check_password(...), if user and checkpw(...)), so response time reveals which accounts exist.
VNX-209 – Generation of Error Message Containing Sensitive Information
Detects stack traces and database error messages sent to the client: traces in Python, Java, JavaScript/TypeScript, Go and C# responses, PHP die/echo of mysqli_error and friends, caught database exception messages in Python, Java and C# output, and configuration that turns detailed error pages on (Spring include-stacktrace, PHP display_errors, ASP.NET customErrors Off).
VNX-210 – Self-generated Error Message Containing Sensitive Information
Detects errors the program raises itself whose message carries a secret value (password, secret, API key, private key, token, credential, DSN, connection string): Go fmt.Errorf/errors.New/http.Error/panic, Python raise/abort/HTTPException, Java throw new/sendError, JavaScript new Error/createError/res.status(4xx|5xx).
VNX-212 – Improper Removal of Sensitive Information Before Storage or Transfer
Detects user and account records serialised whole, password hash included: Express/Prisma handlers that res.json() a user fetched a few lines above (or res.json(await User.findById(...)) directly) with no projection or removal, Flask/Django responses built from user.__dict__ or vars(user), Django REST serializers exposing a User's password, Django serialize() of User.objects and model_to_dict(user), Laravel user models without $hidden, and Go model structs whose JSON tag exposes a password or its hash.
VNX-213 – Exposure of Sensitive Information Due to Incompatible Policies
Detects health, status and debug endpoints that return the whole process environment or application configuration (process.env, os.environ, app.config, os.Environ(), System.getenv()), publishing every secret an operator put there.
VNX-214 – Invocation of Process Using Visible Sensitive Information
Detects passwords, tokens and secrets passed to child processes on the command line (--password=$x, mysql -p$x, sshpass -p $x, docker login -p $x, curl -u user:$x, redis-cli -a $x, openssl pass:$x, kubectl create secret --from-literal=password=$x, aws configure set aws_secret_access_key $x, htpasswd -b, a password inside a URL argument) from Python, JavaScript/TypeScript, Go, Java, PHP and C# exec calls, and from shell scripts, Makefiles and Dockerfiles.
VNX-215 – Insertion of Sensitive Information Into Debugging Code
Detects debugging facilities left switched on for every visitor: Python cgitb.enable(), a Django Debug Toolbar shown to everyone, Express errorhandler outside a development check, the Node.js inspector bound to 0.0.0.0, and ASP.NET Core UseDeveloperExceptionPage/UseDatabaseErrorPage outside IsDevelopment().
VNX-222 – Truncation of Security-relevant Information
Detects C and C++ bounded copies and formats (snprintf, strncpy, strlcpy, strncat, ...) whose truncation is never checked, when the truncated buffer is then used to open, remove or execute a file, run a command, contact a host, compare a name or write the audit log.
VNX-223 – Omission of Security-relevant Information
Detects Python code that discards the record of a security event: a failed token, signature or permission check swallowed by an except clause that only passes or by contextlib.suppress(), logging.disable(), a disabled security/audit logger, and Django's django.security loggers routed to the null handler.
VNX-224 – Obscured Security-relevant Information by Alternate Name
A log call writes a credential (password, secret, token, API key) base64-encoded, inline or through a variable, in JavaScript, TypeScript or Python. Base64 is a reversible alternate name for the value, not a protection.
VNX-242 – Use of Inherently Dangerous Function
C/C++ calls to gets(), std::gets(), _getws(), getws(), _getts() or getwd(), and C++ operator>> from a stream into a char array with no std::setw(): functions that write input of any length into a buffer they have no size for.
VNX-243 – Creation of chroot Jail Without Changing Working Directory
A chroot() call (C/C++, Python os.chroot, Go syscall/unix.Chroot, Rust fs::chroot, Ruby Dir.chroot) is not followed in the same function by a chdir, so the working directory stays outside the jail.
VNX-244 – Secret left in heap memory when it is released
Reports C/C++ free(), delete and realloc() of a buffer named as a password, passphrase, PIN, secret or key with no wipe in the lines before, and Java code that turns a char[] password into an immutable String.
VNX-257 – Storing Passwords in a Recoverable Format
Reports a password passed as the data of a reversible transform (base64, hex, rot13, Fernet/AES/cipher encryption, CryptoJS, openssl_encrypt, AEAD Seal) and any decrypt_password/decryptPassword function.
VNX-259 – Hard-coded password passed to an authentication or connection API
Reports a string literal passed positionally as the password of an authentication or connection call (smtplib login, HTTPBasicAuth, JNDI SECURITY_CREDENTIALS, DriverManager.getConnection, new Sequelize, LDAP bind, mysqli_connect, new PDO, Net::SMTP.start, smtp.PlainAuth, SetBasicAuth, NetworkCredential and similar).
VNX-260 – Password in Configuration File
Reports literal passwords in XML configuration (Maven settings.xml, Spring and Hibernate XML, Tomcat context.xml/tomcat-users.xml/server.xml password attributes, .NET Web.config appSettings and connection strings), PHP config files (define('DB_PASSWORD', ...), $config[...]['password']) and credential dotfiles (.netrc, .pgpass, .pypirc, .npmrc).
VNX-266 – Incorrect Privilege Assignment
Root is assigned as a process's whole identity (setuid(0), setresuid(0, 0, 0), os.setuid(0)) in a function that never drops it, or a file is given the set-user-ID or set-group-ID bit.
VNX-267 – Privilege Defined With Unsafe Actions
A root-equivalent Linux capability (CAP_SYS_ADMIN, CAP_SYS_MODULE, CAP_SYS_PTRACE, CAP_SYS_RAWIO, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH, CAP_SETFCAP, CAP_BPF or all) is granted through libcap, libcap-ng, ambient capabilities, setcap, capsh or a systemd AmbientCapabilities= line.
VNX-272 – Least Privilege Violation
Detects root privilege kept after the privileged operation that needed it: a chroot in a project that never drops its identity afterwards, and a return to root (seteuid(0), setuid(0) in a setuid helper, os.seteuid(0)) that is never lowered again. C, C++, Python and Go.
VNX-274 – Improper Handling of Insufficient Privileges
Detects privilege changes whose failure is noticed and then ignored: an if on a failed setuid/setgid/setresuid/setgroups/chroot or impersonation call that only logs (C, C++), an except OSError/PermissionError that passes or logs around os.setuid/os.chroot (Python), an err != nil after syscall/unix Setuid that only logs (Go), and an if on a failed posix_setuid/posix_setgid that only logs (PHP).
VNX-276 – Incorrect Default Permissions
Detects files and directories given a world-writable mode by a call the umask does not filter: chmod-family calls in C, C++, Python, Go, PHP, JavaScript/TypeScript, Ruby, Java and Rust, chmod/install -m/mkdir -m/COPY --chmod in shell scripts, Makefiles and Dockerfiles, mode: in Ansible tasks, and chmod commands run through system/exec/subprocess.
VNX-277 – Insecure Inherited Permissions
Detects permission sets that everything created afterwards inherits and that let anyone write: a process umask that leaves others-write open (umask(0), os.umask(0), process.umask(0), shell or Dockerfile umask 000, systemd UMask=0000), a Windows NULL DACL, an inheritable SDDL allow ACE for Everyone, and a .NET FileSystemAccessRule/RegistryAccessRule granting Everyone or Users write with inheritance.
VNX-279 – Incorrect Execution-Assigned Permissions
Detects a program or install step that sets the setuid bit on a file at run time: chmod-family calls with 04xxx, S_ISUID or perms::set_uid in C and C++, os.chmod with 0o4xxx or stat.S_ISUID in Python, os.ModeSetuid in Go, chmod-family calls with a setuid mode in PHP, JavaScript/TypeScript, Ruby and Rust, mode: '4755' in Ansible tasks, and chmod u+s/4755, install -m 4755 and COPY --chmod=4755 in shell scripts and Dockerfiles.
VNX-280 – Improper Handling of Insufficient Permissions or Privileges
Detects code that is refused access to or control over a resource and carries on as if it had it: an owner-only chmod (0600, S_IRUSR|S_IWUSR) whose failure is ignored in C, C++, Python and Go, and a refused directory replaced by a broader one (chdir("/") after a failed chdir, a /tmp, gettempdir() or os.TempDir() fallback after a permission error).
VNX-290 – Authentication Bypass by Spoofing
Detects trust decisions on a client IP taken from a client-controlled header (X-Forwarded-For, X-Real-IP, True-Client-IP, HTTP_X_FORWARDED_FOR): comparison with an IP literal, allow-list membership, an is_trusted-style helper, an address-class test (is_private, isLoopbackAddress), or a rate limiter keyed on the header.
VNX-315 – Cleartext Storage of Sensitive Information in a Cookie
A password, card number, CVV, SSN, PIN, bank account number or key written into a cookie in cleartext, by name or by value, across Python, Node, Java, PHP, Ruby and Go cookie APIs.
VNX-324 – Use of a Key Past its Expiration Date
Reports code that accepts an expired certificate or signed token: swallowed CertificateExpiredException/ExpiredJwtException, jsonwebtoken ignoreExpiration: true, PyJWT verify_exp: False, ruby-jwt verify_expiration: false, OpenSSL verify callbacks that accept X509_V_ERR_CERT_HAS_EXPIRED, and X509_V_FLAG_NO_CHECK_TIME.
VNX-325 – Missing Cryptographic Step
Reports AES in an unauthenticated mode (CBC, CTR, CFB, OFB) in Java, Kotlin, Node.js, PHP, Python and Ruby, in a file that never computes a MAC or signature, so the integrity step is missing. AEAD modes, ECB (VNX-CRYPTO-003) and files with an HMAC are not reported.
VNX-326 – Inadequate Encryption Strength (undersized DSA, DH, EC or symmetric key)
Reports keys generated too small: DSA and Diffie-Hellman below 2048 bits, AES keys below 128 bits, elliptic curves under 224 bits, and RSA/DSA/DH below 2048 bits in Ruby and PHP. RSA in Python, Go, Java and Node.js is VNX-CRYPTO-006's.
VNX-327 – Broken hash algorithm (MD5, SHA-1) protecting a password, token or signature
MD5 or SHA-1 is computed through a hash API on a security value: the call line, the three code lines above it or the next one (the next three for a Java/Kotlin MessageDigest, which is fed afterwards), never looking past a line that closes a block name a password, secret, token, session id, cookie, signature, salt, nonce, CSRF value, API key, credential or reset value. Both algorithms are broken for collision resistance and are fast to brute-force, so they must not hash passwords or derive tokens and signatures; use SHA-256 or stronger, HMAC-SHA256 for tokens and signatures, and argon2id/bcrypt/scrypt for passwords. Calls recognised: Python hashlib.md5()/sha1()/new('md5'|'sha1') and bare md5()/sha1() after from hashlib import, Node.js createHash('md5'|'sha1') and CryptoJS.MD5/SHA1, Java/Kotlin MessageDigest.getInstance("MD5"|"SHA-1"), commons-codec/Spring DigestUtils.md5Hex/sha1Hex/md5DigestAsHex and Guava Hashing.md5()/sha1(), PHP md5()/sha1()/md5_file()/sha1_file(), Ruby Digest::MD5/SHA1, OpenSSL::Digest::MD5/SHA1 and OpenSSL::Digest.new('MD5'|'SHA1'). Not reported: digests with no security name nearby (cache keys, ETags, checksums, content addresses), digests of a constant (static::class, __CLASS__, a string literal), Python calls marked usedforsecurity=False, HMAC-SHA1, names, fields, enums and comments that only mention the algorithms, and test files. A password passed straight into the digest (md5($pass), hashlib.md5(password.encode()), createHash('md5').update(password), DigestUtils.md5Hex(password), Digest::MD5.hexdigest(password)) is reported by VNX-CRYPTO-007, a password hashed with a fast hash, and not here; this rule keeps tokens, session ids, cookies, signatures, salts, nonces and keys, and a password named only around the call. Other MD5 and SHA-1 calls are reported by VNX-CRYPTO-001 and VNX-CRYPTO-002; Go is covered there.
VNX-331 – Insufficient Entropy
Reports secrets generated from fewer than 16 random bytes (secrets.token_*, os.urandom, crypto.randomBytes, PHP random_bytes, Ruby SecureRandom.hex, short byte[]/ByteArray salts and keys) or from uuid1() and truncated uuid4(), when the value is named as a token, secret, key, salt or session id.
VNX-334 – Small Space of Random Values
Reports secrets drawn as a random integer from fewer than 2^32 values (random.randint, secrets.randbelow, nextInt, crypto.randomInt, Math.random() * N, PHP random_int/mt_rand, Ruby rand/SecureRandom.random_number) when the value is named as a token, secret, key, session id or reset value. OTPs and PINs are not reported.
VNX-336 – Same Seed in Pseudo-Random Number Generator (PRNG)
Detects a PRNG seeded with a constant (a literal, an ALL_CAPS constant or a variable assigned one) when its output is security-relevant, and any seeded SecureRandom or ChaCha8. Python, Java, Kotlin, Go, C, C++, PHP, Ruby and JavaScript.
VNX-337 – Predictable Seed in Pseudo-Random Number Generator (PRNG)
Detects a PRNG seeded from the clock or the process id when its output is security-relevant, and any time-seeded SecureRandom or ChaCha8. Python, Java, Kotlin, Go, C, C++, PHP, Ruby and JavaScript.
VNX-338 – Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG)
Detects a value drawn from a non-cryptographic PRNG (Math.random, rand/mt_rand/str_shuffle, Ruby rand/sample, Go math/rand) that is stored under, keyed by or returned as a secret. JavaScript/TypeScript, PHP, Ruby and Go.
VNX-339 – Small Seed Space in Pseudo-Random Number Generator (PRNG)
Detects a PRNG seeded with a value narrowed to a small range (a modulus, a 16-bit mask or cast, a length or count, a small random range) when its output is security-relevant, and any narrowed seed on SecureRandom or ChaCha8. Python, Java, Kotlin, Go, C, C++, PHP, Ruby and JavaScript.
VNX-340 – Generation of Predictable Numbers or Identifiers
Detects secrets produced by predictable identifier generators: time-based UUIDs (v1/v6), name-based UUIDs (v3/v5) and PHP uniqid(), when stored under, keyed by or returned as a secret. Python, JavaScript/TypeScript, PHP, Go, Java, Kotlin and Ruby.
VNX-341 – Predictable from Observable State
Detects secrets built from state an attacker can observe or estimate (the clock, the process id, the client address or the host name), raw or hashed, when stored under, returned as or set as the cookie value of a secret. C, C++, Python, JavaScript/TypeScript, PHP, Java, Kotlin, Go and Ruby.
VNX-342 – Predictable Exact Value from Previous Values
Detects secrets that are the next value of a counter (sessionId++, ++lastToken, incrementAndGet(), atomic.AddInt64, next(counter), .succ) when the counter is named for a secret or its result is stored, returned or set as a cookie value of one. Java, Kotlin, Python, JavaScript/TypeScript, PHP, Ruby and Go.
VNX-343 – Predictable Value Range from Previous Values
Detects secrets that are the previous value plus a small random step (token += random.randint(...), session_id = last + rng.nextInt(500), isn = last_isn + (rand() % 64000)). Python, Java, Kotlin, JavaScript/TypeScript, PHP, Ruby, Go, C and C++.
VNX-344 – Use of Invariant Value in Dynamically Changing Context
A Content-Security-Policy nonce or an OAuth state parameter that must be fresh per response or per login is written into the source as a constant, in Go, Java, JavaScript/TypeScript, Python, PHP and HTML.
VNX-346 – Origin Validation Error
A request's Origin or Referer, or a postMessage event.origin, is validated with a substring, prefix, dot-less suffix or unanchored-regex test that a hostile site passes, or a WebSocket CheckOrigin accepts every origin.
VNX-348 – Use of Less Trusted Source
A client address read from X-Forwarded-For, X-Real-IP, a similar client-written header or Flask request.access_route, falling back to the socket address, in Python, JavaScript/TypeScript, Go, Java, Kotlin, PHP, Ruby and C#.
VNX-350 – Reliance on Reverse DNS Resolution for a Security-Critical Action
An access decision made on the host name a reverse DNS lookup returned for the peer's address, without forward confirmation, in Python, Java, Go, JavaScript/TypeScript, PHP and Ruby.
VNX-352 – Cross-Site Request Forgery protection disabled
Reports a web framework's built-in CSRF protection switched off: Django @csrf_exempt and a MIDDLEWARE list without CsrfViewMiddleware, Flask-WTF WTF_CSRF_ENABLED = False and csrf exemptions, Node.js csrf: false / checkOrigin: false / Apollo csrfPrevention: false / csurf ignoreMethods with POST, and Rails skip_before_action :verify_authenticity_token, protect_from_forgery except:, allow_forgery_protection = false or an ApplicationController with no protect_from_forgery.
VNX-354 – Integrity check value validated so that a missing, partial or truncated value passes
Reports signature, MAC and checksum comparisons that can be passed without the right value: verification that runs only when the value is present (if sig and not compare_digest(...)), prefix/suffix/substring tests against a computed digest, and digests truncated before comparison, in Python, JavaScript/TypeScript and Java.
VNX-359 – Private personal information written to logs or standard output
Reports logging and print calls in Python, JavaScript/TypeScript and Java whose arguments name a social security number, passport number, date of birth, national ID, tax ID, driver's licence or medical record number.
VNX-364 – Signal Handler Race Condition
A function registered as a signal handler in the same C or C++ file (signal(SIG..., h), std::signal, sigset, or a struct sigaction whose sa_handler/sa_sigaction is h, or a captureless C++ lambda registered in place) writes to a file-scope variable that is not declared volatile sig_atomic_t or atomic (_Atomic, atomic_*, std::atomic): an assignment, increment, compound assignment, a write to a member or element of it, or free() of it. The signal can arrive while the interrupted code is half way through using the same variable, so the handler corrupts it (a pointer freed under the main loop and freed again, a counter update lost, a struct reset mid-read)
VNX-366 – Race Condition within a Thread
Mutable state shared by every thread is written without synchronisation, in Java. Two shapes are reported. First, a request handler of a shared singleton writes an instance field: a servlet (a class extending HttpServlet or GenericServlet) assigning, incrementing or compound-assigning a non-static, non-final field (also through this.) inside doGet/doPost/doPut/doDelete/doPatch/doHead/service, or a Spring @Controller/@RestController doing the same inside a method annotated @GetMapping/@PostMapping/@PutMapping/@DeleteMapping/@PatchMapping/@RequestMapping. One instance serves all concurrent requests, so one user's value leaks into another's response. Second, in a file that runs on several threads (implements Runnable, extends Thread, new Thread, an ExecutorService, submit, CompletableFuture, parallelStream, ForkJoinPool, or a servlet or Spring controller), a static, non-final, non-volatile numeric field is incremented, decremented or compound-assigned (++, --, +=) outside any synchronized method or block and without a Lock, so concurrent updates are lost
VNX-368 – Context Switching Race Condition
A temporary switch into the root context (seteuid(0), setegid(0), setreuid(-1, 0), setregid(-1, 0), setresuid(-1, 0, -1) or setresgid(-1, 0, -1), also ::-qualified) that is not an atomic, contained step, in C or C++
VNX-385 – Covert Timing Channel
A password, or a password hash, is checked with an ordinary equality comparison, which returns as soon as the first byte differs, so the time a login takes tells an attacker how much of a guess is right (an observable timing channel; storing or comparing the plaintext password is a further weakness). Reported in Python, JavaScript/TypeScript and Java: ==, !=, === or !== where one operand is named as a password (password, passwd, passphrase, pwd, including user.password, row['password'], getPassword(), passwordHash, hashed_password, adminPassword) and the other operand is a real value; Java a.equals(b)/equalsIgnoreCase, Objects.equals and Arrays.equals with such an operand. Comparisons that continue onto the next line are joined, including a line break before the operator or .equals(. Not reported: presence checks against an empty string, None, null, undefined, a boolean or a number; a string literal or ALL_CAPS constant operand (hard-coded credentials are reported by other rules); confirmation, policy, length, field, type and similar names (password_confirmation, passwordPolicy, password.length); a new-versus-old password reuse check; `pwd` naming the working directory (assigned from a cwd call, user.dir or PWD in the same file); lines that already use a constant-time or hashing comparison (hmac.compare_digest, secrets.compare_digest, crypto.timingSafeEqual, MessageDigest.isEqual, bcrypt/check_password/PasswordEncoder.matches); the text in strings and comments; and test code. MAC, signature and token comparisons are reported by VNX-CRYPTO-008. Two comparisons on the same timing channel are reported by a more precise rule, so the line is reported once: both operands naming the password (user.password == request.form["password"]) by VNX-309, a login decided by a plain password comparison, and a password compared with a value named as a secret, token, digest, signature or MAC next to the hash call or request read that produced it by VNX-CRYPTO-008.
VNX-392 – Missing Report of Error Condition
A Python web handler catches an exception and returns an error body (jsonify, JsonResponse, HttpResponse, Response, Sanic json or a dict) without an error status, so the client receives 200 OK for a failed request.
VNX-400 – Uncontrolled Resource Consumption from a request-supplied size
A number read from the HTTP request (Flask, Django, DRF, or an unbounded FastAPI int/float route parameter) sets a Python loop count, sleep, allocation, repetition or exponent with no upper bound, so one request can exhaust CPU, memory or a worker.
VNX-401 – Missing Release of Memory after Effective Lifetime
A C/C++ heap block held in a local variable (malloc, calloc, strdup, kzalloc, new and friends) is abandoned by a later return or throw before it is freed, stored, handed off or returned; or `p = realloc(p, n)` overwrites the only pointer to the old block, which leaks when realloc fails.
VNX-403 – Exposure of File Descriptor to Unintended Control Sphere ('File Descriptor Leak')
A long-lived descriptor is opened without close-on-exec (open/openat/creat without O_CLOEXEC, socket without SOCK_CLOEXEC, fopen without "e") and not closed nearby, in a C/C++ file that starts other programs (exec*, posix_spawn, popen, system), so every child inherits it.
VNX-404 – Improper Resource Shutdown or Release
A Java file or database handle bound to a local variable is never released before the method ends: streams, readers, writers (including Files.newBufferedReader/newInputStream and friends), ZipFile/JarFile and JDBC connections opened outside try-with-resources and never closed, returned or wrapped. Python handles are reported by VNX-775.
VNX-408 – Incorrect Behavior Order: Early Amplification
A number taken from the request sets, with no upper bound, how much work the server does: a range()/for/while-loop bound, a string or array repeat/size, Buffer.alloc, or a bcrypt/PBKDF2 cost chosen by the client (Python Flask/Django, Node Express/Koa).
VNX-409 – Improper Handling of Highly Compressed Data (Data Amplification)
Decompression with no bound on the output size: Python zipfile extractall() or per-member extract(), or tarfile extractall(), without a member size check, shutil.unpack_archive, gzip/zlib/bz2/lzma.decompress of request or network data; Node zlib gunzip/inflate/unzip/brotliDecompress without maxOutputLength, request streams piped through createGunzip, adm-zip extractAllTo, and unzipper.Extract or unzipper.Open entries streamed without an uncompressedSize check.
VNX-410 – Insufficient Resource Pool
A shared server pool capped at one or two members by a literal: HikariCP setMaximumPoolSize, DBCP setMaxTotal/setMaxActive, Tomcat/Jetty setMaxThreads and QueuedThreadPool, Spring hikari maximum-pool-size, dbcp2 max-total and tomcat threads.max (any relaxed-binding spelling) in .properties or application.yml, and newFixedThreadPool/ThreadPoolExecutor of size 1-2 in request-serving code.
VNX-414 – Missing Lock Check
Reports a non-blocking lock attempt whose result is discarded, so the shared resource is touched whether or not the lock is held: pthread_mutex_trylock, sem_trywait, flock with LOCK_NB, lockf F_TLOCK, fcntl F_SETLK, C++ try_lock and unchecked std::try_to_lock, Go TryLock, Java tryLock, Python acquire(False). Checked results, explicit discards, blocking locks and test code are not reported.
VNX-416 – Use After Free: Stale Pointer After realloc, Pointer Into a Temporary
Reports the old pointer used after a successful realloc into a different variable, and C++ pointers or string_views kept into a temporary string (c_str()/data() of std::to_string, std::string(...) or std::string{...}, .str(), .substr(), a concatenation, Qt toUtf8().constData()). The realloc failure branch, p = realloc(p, n), full-expression uses and named strings are not reported.
VNX-419 – Unprotected Primary Channel
Reports an administrative or management interface served over a plaintext network listener: Go http.ListenAndServe, Server.ListenAndServe/Serve and net.Listen naming an admin/management/mgmt address, handler or server, and Java/Kotlin ServerSocket, ServerSocketChannel and HttpServer.create for one. TLS listeners, loopback (including a Go address variable assigned only loopback literals) and Unix-socket listeners, non-admin listeners and test code are not reported.
VNX-420 – Unprotected Alternate Channel
Reports a side channel left open while the main channel is protected: a Unix control socket made world-writable (chmod to a mode with the other-write bit, or umask(0) before bind with no chmod after) in C, C++, Go and Python, and a Go plaintext http.ListenAndServe on a network address running at the same time as a TLS listener (one of them in a goroutine) that does not only redirect to HTTPS.
VNX-421 – Race Condition During Access to Alternate Channel
Reports a Unix domain socket or FIFO created at a fixed path in a shared world-writable directory (/tmp, /var/tmp, /dev/shm) in C, C++, Go and Python, as a literal, a constant or a C buffer filled by snprintf, and a Windows CreateNamedPipe in a file that never passes FILE_FLAG_FIRST_PIPE_INSTANCE, where another local user can claim the channel's name first.
VNX-425 – Direct Request ('Forced Browsing')
Reports an administrative route (a path segment admin, administration, backoffice, superuser, sysadmin, staff or manage/management) registered with no authentication in front of it: Express/Koa/Fastify routes with no middleware, and Go handlers or gin/echo admin route groups with no middleware or in-handler check. The same defect on a Python route is VNX-306.
VNX-428 – Unquoted Search Path or Element
Reports C, C++ and C# code that hands an unquoted Windows executable path containing a space to CreateProcess (NULL application name), WinExec, CreateService, a service ImagePath value or sc.exe binPath=, so Windows first runs C:\Program.exe or another space-truncated prefix.
VNX-430 – Deployment of Wrong Handler
Reports a static-file handler deployed on the application's own directory (express.static/serve-static/serve-index/koa-static/@fastify/static on __dirname or '.', Flask static_folder, StaticFiles, send_from_directory, add_static or STATICFILES_DIRS on the project root), which makes server source, configuration and secrets downloadable.
VNX-432 – Dangerous Signal Handler not Disabled During Sensitive Operations
Reports SA_NODEFER on a C/C++ sigaction whose handler does non-reentrant work (free, malloc, printf, syslog, exit, ...), so a second delivery of the same signal re-enters the handler while it runs.
VNX-447 – Unimplemented or Unsupported Feature in UI
Detects Java security operations that are offered but do nothing (an empty or return-true setter/enable/change/verify for passwords, MFA, encryption, TLS, audit, sessions, roles, tokens) and request handlers whose whole body throws UnsupportedOperationException or NotImplementedException.
VNX-448 – Obsolete Feature in UI
Detects a Java web endpoint marked obsolete but still served: @Deprecated (or OpenAPI deprecated = true) in the same annotation block as a Spring @*Mapping, JAX-RS @GET/@POST/@Path, Micronaut @Get/@Post, or on a @Controller/@RestController class, unless it answers 410 Gone or redirects.
VNX-450 – Multiple interpretations of input: text flag read by truthiness
Detects a configuration or request flag that arrives as text and is made boolean by truthiness, so 'false', '0' and 'no' all mean on: Python bool() of os.environ/getenv, request parameters, sys.argv or input(), os.environ.get with a True/False default, argparse type=bool, and Node Boolean()/!! of process.env/req.query or process.env.X || true/false.
VNX-453 – Insecure default: a security parameter defaults to its unsafe value
Detects Python and JavaScript/TypeScript function signatures whose security parameter defaults to the weaker setting (verify/verify_ssl/check_hostname/rejectUnauthorized/strictSSL = false, secure/httponly = false, autoescape or CSRF off, insecure/skip_verify/shell/debug = true), so every caller that omits it gets the insecure behaviour.
VNX-454 – External Initialization of Trusted Variables or Data Stores
Reports Python (Flask, Django, Starlette) code that sets authorisation state from a cookie, header or request parameter the client controls: an is_admin/role cookie or header, a privilege flag tested straight from the query string, or a session role or trust flag assigned from request data.
VNX-455 – Non-exit on Failed Initialization
Reports C/C++ code that tests an initialisation call (sodium_init, curl_global_init, pthread_mutex_init, a project's own *_init) for failure and then only logs, so execution continues with an uninitialised library, context or lock.
VNX-457 – Use of Uninitialized Variable
Reports a C/C++ local scalar or char array declared without an initialiser whose first mention in the same block reads it (return v, v++, v += ..., a condition, a printf argument, strcat(buf, ...)) before anything is stored in it.
VNX-468 – Incorrect Pointer Scaling
Reports pointer arithmetic in C/C++ that multiplies an offset by sizeof() on a pointer or array whose element is wider than one byte (int, long, double, *_t, struct), which the compiler already scales, so the offset lands sizeof(T) times too far. Byte pointers (char, uint8_t, void), allocation and length arguments, and member expressions are not reported.
VNX-469 – Use of Pointer Subtraction to Determine Size
Reports C/C++ pointer subtraction between pointers that provably point into different objects: two distinct sized arrays, two separate allocations (malloc, calloc, strdup, new[]), or iterators of two different containers. The result is undefined and cannot serve as a size. Pointers that may share an object, members, element values, linked-list nodes and comments are not reported.
VNX-470 – Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')
Reports request data that chooses the class, module, method or constant reflection loads or calls: Java Class.forName, loadClass and getMethod/getField; Python import_module, __import__, getattr, pydoc.locate and globals()[...]; Ruby constantize, const_get and send/public_send. Constant names, configuration values, request.method, allow-listed values and fixed-table lookups are not reported.
VNX-471 – Modification of Assumed-Immutable Data (MAID)
Reports Java public static final fields that hold a mutable value (a new ArrayList/HashMap/HashSet/Date/StringBuilder and similar, or Arrays.asList), where final freezes only the reference. Immutable collections, non-public fields, test sources and comments are not reported. A public static final array is the same weakness in its array-specific form and is reported by VNX-582, not here.
VNX-472 – External Control of Assumed-Immutable Web Parameter
Reports server-owned values taken from the client: a price, total, discount or privilege field (role, isAdmin) read from the request body, query, params or cookies in JavaScript/TypeScript, and hidden form inputs in templates that carry a price, privilege or user id. Admin back-office routes, price fields that are only compared, user-chosen fields such as amount or quantity, CSRF tokens, tests and comments are not reported.
VNX-474 – Use of Function with Inconsistent Implementations
Reports C/C++ calls whose behaviour differs between platforms in a way that changes correctness: signal() installing a handler (once per file), strerror_r() outside a variant-selecting #if, realloc(p, 0), the MSVC _snprintf/_vsnprintf family, and vfork(). SIG_IGN/SIG_DFL, sigaction, snprintf, fork, test sources and comments are not reported.
VNX-475 – Undefined Behavior for Input to API
Reports C/C++ calls whose arguments make the library behaviour undefined: memcpy/strcpy/strcat with the same object as source and destination, sprintf/snprintf whose destination is also an argument, fflush(stdin), and a literal NULL passed to a %s conversion or a mem*/str* pointer argument. memmove, snprintf(NULL, 0, ...), distinct objects or array elements, element-sized copies within an array, output-stream flushes, tests and comments are not reported.
VNX-477 – Use of Obsolete Function
Detects calls to and imports of Java and Python standard-library APIs that are deprecated (most for removal) or already removed (Thread.stop, boxed-primitive constructors, one-argument URLEncoder.encode, Class.newInstance, finalize, the PEP 594 modules, ssl.wrap_socket, cgi.escape, collections ABC aliases and more), each with its replacement.
VNX-479 – Signal Handler Use of a Non-reentrant Function
Detects a call to a function that is not async-signal-safe (stdio, malloc/free, syslog, exit, strtok, localtime, longjmp, new/delete, std::cout, mutex locks) inside a C/C++ crash handler, a handler the same file installs only for fault signals such as SIGSEGV.
VNX-480 – Use of Incorrect Operator
Reports operators that compile but do not do what the line means. Java: a String compared with == or != against a string literal (reference identity, not content) and a BigDecimal compared by reference with BigDecimal.ZERO/ONE/TEN. C: a char pointer compared with == or != against a string literal (address comparison; use strcmp). C/C++: a bit mask tested as flags & MASK == value, which parses as flags & (MASK == value). C/C++/Java: the transposed compound assignment x =+ n / x =- n (an assignment of +n, not an increment). Not reported: equals()/compareTo()/strcmp, comparisons with null, char literals, std::string compared with a literal in C++ (operator== compares content; a .h header that uses std::, class, namespace or template counts as C++), parenthesised masks ((flags & MASK) == value), x = -n written with a space, and operators inside strings and comments. Assignment used as a condition (if (x = y)) is VNX-481. A Java String compared with a string literal is reported by VNX-597 (String compared with == instead of equals()) and not here, unless the file never names the String type, which that rule needs.
VNX-482 – Comparing instead of Assigning
Detects a statement that only compares, x == y; (or a Python test line cart.total == 0 with no assert), and a for loop whose initialiser compares (for (i == 0; ...)), in C, C++, JavaScript, TypeScript and Python. The result is discarded, so the intended assignment or assert never happens.
VNX-484 – Omitted Break Statement in Switch
A case or default label of a C, C++ or Java switch whose statements run into the next label of the same switch: the label has a body of its own, and its last statement is not a break, return, throw, continue, goto, yield or a call that does not return (exit, abort, System.exit), so control falls through into the next case. Not reported: stacked labels with no statements between them (case 1: case 2:), a fall-through marked as deliberate (a /* fall through */ or FALLTHROUGH comment, [[fallthrough]], __attribute__((fallthrough))), Java arrow labels (case X ->), which never fall through, the last label of a switch, and labels in comments or string literals. A body whose last statement is a bare if guarding the exit (if (x) return -1;, with no else) is reported, because the other branch falls through. A body ending in an inner block (an if/else or loop closed by a brace) is not judged.
VNX-486 – Comparison of Classes by Name
An object's type is decided by comparing its class name: in Java, getClass().getName(), getSimpleName() or getCanonicalName() (or Foo.class.getName()) compared with equals/equalsIgnoreCase/== in either order; in C#, GetType().Name or GetType().FullName compared with ==, != or Equals; in Python, type(x).__name__ or x.__class__.__name__ compared with ==, != or in. A switch (C# switch expression, Python match) on such a name is reported, as is a class name stored in a local and compared with a literal within the next eight lines. Different classes can share a name (another package, another class loader, an attacker-supplied subclass or plugin), so a trust or dispatch decision made this way can be satisfied by the wrong type. Not reported: instanceof, isinstance, is, isAssignableFrom and class-object identity (getClass() == Foo.class, GetType() == typeof(Foo), type(x) is Foo), a class name read for logging or display, and the pattern in comments or string literals.
VNX-487 – Reliance on Package-level Scope
A credential is held in a Java field with no access modifier, so the only thing protecting it is package scope: a field of a top-level class, declared at member level without private/protected/public, that is either a key type (SecretKey, PrivateKey, Key, KeyPair, Credentials, any name) or a String/char[]/byte[] whose name says it is a password, passphrase, secret, API key, token, credential or private key. Java packages are open (any class that declares the same package, or a jar on the class path that splits it, can read the field), so this is not access control. Not reported: private, protected and public fields (public exposure is VNX-493), fields of an interface (implicitly public), injected fields carrying an annotation, constants that name a parameter, header, field, attribute or length rather than holding a value (PASSWORD_PARAM, TOKEN_HEADER), local variables, nested classes, test code and comments.
VNX-488 – Exposure of Data Element to Wrong Session
Per-request or per-user data stored in a field of a Java component that one instance serves every request: a class that extends HttpServlet/GenericServlet, is annotated @WebServlet, @Controller or @RestController, or extends a Struts Action. A request handler assigns a non-final field (instance or static) from the request (getParameter, getHeader, getAttribute, getSession, getRemoteUser, getUserPrincipal, getCookies, getInputStream/getReader, getQueryString), directly or through a local variable assigned from the request a few lines above. Concurrent requests share the field, so one user's data is served to another. Not reported: locals, final fields, assignments in init() or a constructor, fields of classes that are not request singletons (including Spring beans annotated @RequestScope, @SessionScope or @Scope request/session/prototype), fields set from servlet configuration, and the pattern in comments or string literals.
VNX-491 – Public cloneable() Method Without Final ('Object Hijack')
A Java class that is not final declares a public clone() that is not final and builds its copy with super.clone() within the next few lines. super.clone() creates the object without running a constructor, and because neither the class nor the method is final, a subclass can override clone() and hand out copies that skip the constructor's checks or share mutable internals. Not reported: a final clone() (including one that only throws CloneNotSupportedException), a clone() in a final class or record, a clone() that copies through a constructor rather than super.clone(), a clone overload with parameters, non-public clone methods, and the pattern in comments or string literals.
VNX-492 – Use of Inner Class Containing Sensitive Data
A Java inner class (a non-static member class, or an anonymous class created with new X() { ... }) reads a private field of its outer class whose name says it holds a password, passphrase, secret, API key, token, credential, private, master, signing, encryption or HMAC key, or PIN. Inner classes compile to separate top-level classes, so the compiler (before Java 11 nestmates) widens access to the outer class's private field through package-visible accessors any class in the package can call, and the inner instance keeps the outer instance, and the secret, reachable. Reported at the inner class's declaration. Not reported: static nested classes, inner classes that do not use a sensitive field, lambdas, sensitive fields that are not private, test code and comments.
VNX-493 – Critical Public Variable Without Final Modifier
A public field that any code can overwrite holds security- or business-critical data: in Java a public field without final, in C# a public field without readonly or const, whose name says it is a password, passphrase, secret, API key, private key, token, credential, an admin flag, role, permission or privilege, or a price, balance, amount or salary. Any class can change it, so a check that reads it can be steered. Static and instance fields are both reported. Not reported: final, readonly and const fields, C# properties ({ get; ... } or =>), private, protected and package-private fields (package scope is VNX-487), constants that name a parameter or header rather than hold the value, methods, test code, and the pattern in comments or string literals.
VNX-495 – Private Data Structure Returned From A Public Method
A public Java method that returns an array type returns a private array field itself (return field; or return this.field;), so the caller receives a reference to the object's internal state and can change its elements. final on the field does not help: it fixes the reference, not the contents. Reported at the return statement. Not reported: a defensive copy (field.clone(), Arrays.copyOf, System.arraycopy into a new array, List.of/unmodifiableList), a private field initialised to an empty array (new T[0], {}), which cannot be changed, a local variable or method parameter that shadows the field, non-public methods, public fields (VNX-493 judges those), collections, and the pattern in comments or string literals.
VNX-497 – Exposure of Sensitive System Information to an Unauthorized Control Sphere
Detects JVM, OS, path, environment and host information (System.getProperty of platform keys, System.getenv, System.getProperties, InetAddress.getLocalHost, MXBeans) written to an HTTP response, returned from a REST handler, added to a view model or printed in a JSP.
VNX-501 – Trust Boundary Violation
Detects HTTP request data (parameters, headers, cookies, query string, Spring request arguments, Flask/Django request fields) stored in the server-side session without validation, inline, through a few assignments or a list or map; operands the enclosing method proves constant are not reported. Java and Python.
VNX-506 – Embedded Malicious Code: execution of decoded payload
Detects code that decodes an encoded blob (base64, hex, rot13, zlib, marshal, atob, Buffer.from, String.fromCharCode) and executes it with exec/eval, new Function, vm or child_process. Python, JavaScript and TypeScript.
VNX-515 – Covert Storage Channel: Secret Placed in the Process Environment
Detects Python code that stores a password, secret, token, API key or credential in its own process environment (os.environ[...] =, os.putenv, os.environ.setdefault/update), where every child process inherits it and other processes of the same user can read it.
VNX-521 – Weak Password Requirements
Detects password policies in code that accept passwords shorter than 8 characters: length checks on password values, minimums declared on password fields (Joi/zod/yup, express-validator, jQuery Validate, Mongoose, @Size, C# StringLength/MinLength, ASP.NET Identity RequiredLength, Django MinimumLengthValidator) and an empty Django AUTH_PASSWORD_VALIDATORS.
VNX-522 – Insufficiently Protected Credentials: Credential File Readable by Other Users
Detects a password, API key, token, private key or credentials file written to a file that other local users can read: Go WriteFile/OpenFile with a group- or world-readable mode or os.Create of a credential path, Python os.open/os.chmod with such a mode, pathlib write_text/write_bytes or open() of a credential file with no owner-only mode, Node fs.writeFile without mode 0o600, and Java Files.write/FileWriter without owner-only POSIX permissions.
VNX-523 – Unprotected Transport of Credentials
Detects credentials sent to a remote host over plain http://: URLs with a user:password pair, HTTP client calls to http:// URLs that carry auth=, an Authorization header or a password/token field, requests built on http:// that get SetBasicAuth or an Authorization header, and login forms that post to an http:// action.
VNX-524 – Use of Cache Containing Sensitive Information: Plaintext Password Cached
Detects plaintext passwords put into a cache: lru_cache/cache/@cached/@memoize/@Cacheable/memoize() on a function that takes a password, and cache/redis/memcache writes (set, setex, put, hset...) whose key or value is a password variable or a request's password field.
VNX-532 – Insertion of Sensitive Information into Log File: Whole Request Logged
Detects log and print calls that write a whole HTTP request part (all headers, the body, the form, the cookies) or its Authorization/Cookie header, in Python, JavaScript/TypeScript, Go (including logged httputil.DumpRequest output) and Java.
VNX-536 – Servlet Runtime Error Message Containing Sensitive Information
Detects Java servlets and JSPs that catch an exception and write its message or stack trace to the HTTP response: printStackTrace into the response writer, print/write of the exception or its getMessage()/toString() on response.getWriter() or a writer taken from it, response.sendError(code, e.getMessage()), and <%= exception.getMessage() %> in JSP.
VNX-538 – Insertion of Sensitive Information into Externally-Accessible File or Directory
Detects a password, secret, token, key, credential or the whole environment written into a web-served directory (public/, static/, www/, /var/www/) or a fixed /tmp path, in JavaScript/TypeScript and Python.
VNX-539 – Use of Persistent Cookies Containing Sensitive Information
Detects persistent cookies that carry a credential or personal secret, and session or authentication cookies given a literal lifetime longer than 31 days, in JavaScript/TypeScript (Express, Koa), Python, Java (Servlet Cookie, Spring ResponseCookie), PHP and Ruby on Rails.
VNX-540 – Inclusion of Sensitive Information in Source Code
Detects production front-end builds configured to publish source maps (webpack devtool, Vue productionSourceMap, Vite build.sourcemap, Next.js productionBrowserSourceMaps, Angular production sourceMap, GENERATE_SOURCEMAP=true), which serve the original source to every visitor.
VNX-546 – Suspicious Comment
Detects TODO, FIXME, HACK, XXX and BUG comments that admit a security gap (missing authorization, unsanitised input, disabled TLS verification, plain-text passwords...) in Python, JavaScript/TypeScript, Java, Go, C and C++.
VNX-547 – Use of Hard-coded, Security-relevant Constants
Detects a buffer whose literal length is repeated as a bare number in a bounded read, copy or format call (fgets(line, 256, ...) for char line[256]) in C, C++ and Java, instead of sizeof(buf), buf.length or a named constant.
VNX-548 – Exposure of Information Through Directory Listing
Detects directory listing switched on: serve-index in Node, Django show_indexes, aiohttp show_index and Flask-AutoIndex in Python, Tomcat listings and Jetty dirAllowed/setDirectoriesListed in Java, @fastify/static list: true, nginx autoindex on and Apache Options Indexes or All.
VNX-549 – Missing Password Field Masking
Detects password fields that display what is typed: <input>, Blazor InputText and MUI TextField elements for a password with type text or no type, ASP.NET Html.TextBoxFor, Rails text_field, Django CharField without PasswordInput, WTForms StringField, and Android EditText with inputType text.
VNX-555 – J2EE Misconfiguration: Plaintext Password in Configuration File
A literal password is written into a Java EE / Jakarta EE deployment descriptor or application-server configuration file (web.xml, context.xml, server.xml, tomcat-users.xml, persistence.xml, *-ds.xml and similar).
VNX-562 – Return of Stack Variable Address
A C or C++ function returns the address of a local array, local variable or by-value parameter, a local string's c_str(), a string_view of a local string, or a reference to a local object, leaving the caller with a dangling pointer.
VNX-565 – Reliance on Cookies without Validation and Integrity Checking
A security decision is taken on a plain, unsigned cookie that names identity or privilege (role, admin, user_id, username...), or such a cookie is written without a signature, in JavaScript/TypeScript, Python and PHP.
VNX-570 – Expression is Always False
Reports C, C++, Go and Java comparisons that can never be true: a size compared below zero, an unsigned variable compared below zero, one operand equal to two different constants, and an empty numeric range.
VNX-571 – Expression is Always True
Reports C, C++, Go and Java comparisons that always hold: a size compared >= 0, an unsigned variable compared >= 0, x != A || x != B, two ranges covering every value, and an operand compared with itself (other than the NaN tests x != x and a float v == v).
VNX-595 – Boxed number or value object compared by reference (== / !=)
Reports Java == and != between two variables declared as boxed numbers or value objects (Integer, Long, BigDecimal, UUID, Date...), and comparisons of an object with a freshly constructed wrapper or a boxed valueOf(), which compare references instead of values.
VNX-598 – Credential or secret sent in a GET query string
Reports URLs that carry an interpolated password, API key, client secret or token as a query parameter (including ?key= given a variable named for an API key), request helpers given such a key in their params object, and HTML forms that submit a password field by GET.
VNX-602 – Server trusts a client-supplied role or admin flag
Reports server code (Express/Koa, Django/Flask, PHP) that bases an authorisation decision on a role or admin flag taken from the request body, query, URL parameters, headers or unsigned cookies.
VNX-606 – Unchecked Input for Loop Condition
Reports a counted or count-down loop (C/C++, Java, Go) whose bound is a number parsed from argv, getenv, scanf, a request parameter or header, with no upper limit checked or clamped before the loop.
VNX-607 – Public Static Final Field References Mutable Object
Reports a Java public static final field (or interface constant) initialised with a mutable collection, Date, SimpleDateFormat, StringBuilder, Arrays.asList, EnumSet or a Guava Lists/Maps/Sets.newXxx call, whose contents any code can change.
VNX-614 – Sensitive Cookie Without 'Secure' Attribute
Reports session, token and auth cookies sent without Secure: Django/Flask *_COOKIE_SECURE = False, set_cookie without secure=True, res.cookie, reply.setCookie or cookie.serialize without secure: true, secure: false in cookie options, document.cookie without ; Secure, Java cookies and Spring ResponseCookie without setSecure/secure(true), and server.servlet.session.cookie.secure=false.
VNX-615 – Sensitive Information in Source Code Comments
Reports a comment (whole-line, block or trailing) in Go, Java, JavaScript/TypeScript or Python that records a credential value (password, secret, API key, token) rather than describing one.
VNX-635 – Unresolved Security TODO/FIXME
Detects TODO, FIXME, XXX and HACK comments whose text admits an unresolved security gap (missing authentication, CSRF protection, validation or escaping, disabled TLS verification, a hard-coded secret, code called insecure or vulnerable) in Go, Java, Kotlin, JavaScript/TypeScript, PHP, Python and Ruby.
VNX-636 – Not Failing Securely ('Failing Open')
Detects access checks that grant access when they fail: an except/catch handler in an auth, permission, verify, token or policy function that returns true, calls next() without the error, or swallows the exception and falls through to return true. Java, JavaScript/TypeScript and Python.
VNX-639 – Authorization Bypass Through User-Controlled Key
Detects insecure direct object references: an ORM or repository lookup by an id taken from the request (req.params, request.GET, Rails params, @PathVariable) with no owner or authorization check nearby, and owner keys such as UserId filled from the request body. Java, JavaScript/TypeScript, Python and Ruby.
VNX-640 – Weak Password Recovery Mechanism for Forgotten Password
Detects weak forgotten-password flows: reset tokens, OTPs and temporary passwords from a non-cryptographic source (random, Math.random, java.util.Random, time), reset links built from the Host header, and resets decided by a security question. JavaScript/TypeScript, Python and Java.
VNX-641 – Improper Restriction of Names for Files and Other Resources
Detects upload file names classified by something other than their final extension: the extension taken from the first dot (split('.')[1], indexOf('.'), explode('.')[1]) or an allowlist tested as a substring ('.png' in name, includes('.jpg'), contains(".pdf"), unanchored regexes), so shell.php.jpg passes. Java, JavaScript/TypeScript, Python and PHP.
VNX-642 – Authorization state kept in a client-controlled cookie
Reports a plain (unsigned) cookie whose name is a privilege flag or role, such as isAdmin, role or access_level, being set or read back in JavaScript/TypeScript, Python, Java or Kotlin. Signed cookies and server-side sessions are not reported.
VNX-644 – HTTP response header set from request data without neutralisation
Reports a response header (Flask/Django headers, Express/Fastify setHeader/set/header/append, Node writeHead, Koa ctx.set) whose value is a request value, directly or through a variable, with no encoder or sanitiser. Constant and encoded values are not reported.
VNX-646 – Uploaded file accepted or classified by its client-supplied name or extension
Reports upload handlers (multer, formidable, express-fileupload, Flask/Werkzeug, FastAPI, Django request.FILES and FileExtensionValidator) that decide on a file from the extension of the name the client sent, in a file that never inspects the content.
VNX-647 – Authorization decided on a non-canonical request path
Reports an access-control check that compares the raw request path or URL (getRequestURI or Kotlin requestURI, req.path/url/originalUrl, request.path) with a '/...' literal or a regex test anchored on '/' and then denies or allows access, in Java, Kotlin, JavaScript/TypeScript and Python. Normalised paths and route registration are not reported.
VNX-649 – Client-held state decoded or decrypted and trusted without an integrity check
Reports a request value (cookie, header, query or body field) that is base64/hex-decoded and parsed, or decrypted with AES in CBC/ECB/CTR mode, in a Python or JavaScript/TypeScript file with no MAC, signature or authenticated-encryption check.
VNX-656 – Reliance on Security Through Obscurity
Reports a hidden request parameter, header or cookie compared to a hard-coded value whose branch grants access, or whose name is itself a privilege (admin, role, backdoor, bypass).
VNX-663 – Use of a Non-reentrant Function in a Concurrent Context
Reports Java static fields of non-thread-safe types (SimpleDateFormat, DecimalFormat, MessageDigest, Cipher, Mac, Matcher...) and C/C++ calls to static-buffer libc functions (strtok, localtime, gmtime, getpwuid, gethostbyname...) in files that start threads.
VNX-672 – Operation on a file, socket, stream or connection after it was closed
Reports Python and Node.js code that reads, writes, queries or sends on a file, socket, stream, descriptor or database connection after closing or releasing it in the same block, including use of a file after its with-block ends.
VNX-675 – Single-use operation repeated on the same handle (double close, relock, double unlock)
Reports C and C++ code that closes the same FILE*, descriptor or DIR* twice, locks a pthread mutex again before unlocking it, or unlocks it twice, in straight-line code.
VNX-687 – Function Call With Incorrectly Specified Argument Value
Detects calls given a wrong argument value: strncat bounded by the whole buffer, strncpy bounded by strlen of its source, sizes of sizeof(buf) + N, invalid fopen modes, and file permissions written in decimal instead of octal (C, C++, Python, Go, PHP, JavaScript, TypeScript, Ruby).
VNX-688 – Function Call With Incorrect Variable or Reference as Argument
Detects C and C++ bounded writes whose size is sizeof a different array than the destination they write, such as snprintf(name, sizeof(path), ...) or read(fd, header, sizeof(body)).
VNX-690 – Unchecked Return Value to NULL Pointer Dereference
Reports the result of malloc, calloc, realloc, strdup, strndup, fopen or getenv dereferenced (p->f, p[i], *p, or passed to strcpy, memset, fprintf, strlen, atoi and similar) before any NULL test, including getenv() passed straight to such a call or used to construct a std::string.
VNX-695 – Low-Level Functionality Prohibited in an Enterprise Bean
Reports an EJB (@Stateless, @Stateful, @Singleton, @MessageDriven or a SessionBean/EntityBean/MessageDrivenBean) that creates threads, listens on sockets, uses java.io file streams, loads native code, synchronizes, calls System.exit, or replaces the standard streams, security manager or a class loader, all of which the EJB specification reserves to the container.
VNX-703 – Optional Value Read Without Checking Presence
Reports Java Optional values unwrapped with get()/getAsInt()/getAsLong()/getAsDouble() without a presence check: findById(...).get() and other Spring Data finders such as findByUsername(...).get(), findFirst().get(), stream max/min(...).get(), OptionalInt max().getAsInt(), and an Optional (or var assigned from a finder) whose get() is not preceded by isPresent()/isEmpty().
VNX-704 – File or Content Size Narrowed From long
Reports Java casts to int, short, char or byte of a long file or content size (File.length(), Files.size(), FileChannel.size(), getContentLengthLong(), HttpEntity.getContentLength(), MultipartFile/ZipEntry getSize(), getFilePointer()), directly or through a long variable that is not bounds-checked first.
VNX-708 – Incorrect Ownership Assignment
Reports chown(), lchown(), fchown() and fchownat() calls in C and C++ whose path, uid or gid comes from the command line or the environment, directly or through one or two assignments a few lines above, unless a condition validates the value first.
VNX-710 – Security-relevant compiler warning suppressed in source
Reports C and C++ source that disables a compiler warning built to catch memory-safety or format-string defects: MSVC C4996/C4789/C6386 and similar, GCC/clang -Wformat-security, -Wstringop-overflow, -Warray-bounds and similar, and _CRT_SECURE_NO_WARNINGS.
VNX-73 – External Control of File Name or Path
The path argument of a Python or PHP file-system call (open, send_file, os.remove, include, file_get_contents...) comes from the HTTP request, directly or through a variable assigned from it. Java path traversal is reported by VNX-JAVA-009 and Node.js path traversal by VNX-NODE-010.
VNX-749 – Dangerous capability exposed to WebView JavaScript
Reports dangerous operations (commands, file writes and deletes, reflection, SQL, SMS, component launches, device identifiers) performed inside Android @JavascriptInterface methods, which any script in the WebView can call.
VNX-756 – Framework traceback page served instead of a custom error page
Reports Python web applications configured to answer unhandled exceptions with the framework's debug traceback page: FastAPI/Starlette debug=True, Tornado debug/serve_traceback, Bottle debug, CherryPy show_tracebacks, Sanic/Quart run(debug=True) and web.py debugerror.
VNX-757 – TLS Algorithm Downgrade
Reports TLS configuration that lets peers negotiate SSL 2/3, TLS 1.0 or TLS 1.1, or offers an RC4, DES, NULL, EXPORT or anonymous cipher suite, in Go, Java and Python.
VNX-759 – Unsalted Password Hash
A password is passed straight into a fast general-purpose digest with no salt, so equal passwords get equal hashes and a precomputed table recovers them. Reported, when the hashed argument names a password (password, passwd, passphrase, pwd, pw, $pass, $pass_new, getPassword(), a subscript or .get() keyed by a password field such as form["new_password"] or request.json.get("password")) or a variable assigned from one a few lines above: Python hashlib.md5/sha1/sha224/sha256/sha384/sha512/sha3_*/blake2*/new(...) (also from-imported) and <hashlib object>.update(password); Java MessageDigest <md>.digest(password...)/<md>.update(password...) and MessageDigest.getInstance(...).digest(password...), commons-codec DigestUtils.md5Hex/sha1Hex/sha256Hex/... and Guava Hashing.md5()/sha1()/sha256()/sha512().hashString/hashBytes; PHP md5()/sha1()/crc32()/hash('<alg>', ...); Node crypto.createHash(...).update(password) on one line, as a chained call split over lines, or through a variable (const h = crypto.createHash(...); h.update(password)). A call argument split onto the next line is followed. Not reported: an argument or a neighbouring update() that mixes in a salt or pepper, password KDFs (pbkdf2_hmac, scrypt, bcrypt, argon2, PBEKeySpec, password_hash, scryptSync), HMAC, digests of tokens, nonces, password-reset values, file contents or other non-password data, string literals and comments. Weak iteration counts and broken algorithms are other rules (VNX-CRYPTO-007, VNX-327). A password passed straight into a fast digest call (md5($pass), hashlib.sha256(password.encode()), createHash('sha256').update(password), DigestUtils.sha256Hex(password)) is reported by VNX-CRYPTO-007, a password hashed with a fast hash, whose fix (a salted password KDF) is this rule's fix too; this rule keeps the shapes that rule does not read, such as a password reached through a variable, a subscript or a hasher fed on a later line.
VNX-76 – Improper Neutralization of Equivalent Special Elements
A dangerous multi-character sequence (an HTML tag other than script, vbscript:, &&, $(, a SQL or script keyword) is neutralised by deleting it once, so input that rebuilds it after the deletion passes through. Traversal, script-tag and javascript: removals are reported by VNX-182.
VNX-760 – Constant or Predictable Password Salt
Reports a password hash or KDF salted with a literal constant, a salt-named constant that reaches the hash call, a fixed bcrypt salt, or the user's own username or email, in Go, Java, JavaScript/TypeScript and Python.
VNX-762 – Mismatched Memory Management Routines
Reports memory released by a routine that does not match its allocator: new[] with free or delete, new with free or delete[], malloc memory with delete, alloca memory with free, and unique_ptr<T> owning new T[n], in C and C++.
VNX-766 – Critical Data Element Declared Public
Reports Java fields declared public that hold secret material: non-final public password, secret, API key, private key, token or credential fields of a string-like type, public PrivateKey/SecretKey/KeyPair/KeyStore fields, and public final char[]/byte[] secrets.
VNX-770 – Allocation of Resources Without Limits or Throttling
Reports configuration that disables or removes a framework limit on what one request can make the server allocate: Django upload limits set to None, Flask MAX_CONTENT_LENGTH None, Flask-Limiter disabled, sys.set_int_max_str_digits(0), unbounded express, body-parser, koa-body or koa-bodyparser limits, multer without limits, and a huge socket.io maxHttpBufferSize.
VNX-780 – Use of RSA Algorithm without OAEP
RSA encryption or decryption with PKCS#1 v1.5 or no padding in Java, Kotlin, Python, Node.js, Go, PHP, Ruby and C#.
VNX-783 – Operator Precedence Logic Error
Unparenthesised expressions whose precedence differs from their evident intent: assignment of a compared call, x & MASK == 0, x << 8 + y, !x === y, "a" + flag ? x : y, a + b ?? 0.
VNX-793 – Only Filtering One Instance of a Special Element
Path, command and header sanitising that replaces only the first ../, .., shell metacharacter or CR/LF: JavaScript replace() with a string or non-global regex, Python replace(..., 1).
VNX-796 – Only Filtering Special Elements Relative to a Marker
Path or command sanitising that strips special elements only at the start or end: strip('./'), lstrip('../'), _.trimStart(s, './'), re.sub(r'^(\.\./)+', '', p).
VNX-799 – Authentication endpoint without attempt-rate control
Reports the registration of a credential-checking HTTP route (a path segment login, log-in, signin, sign-in, logon, token, otp, verify-otp, 2fa, mfa, authenticate, reset-password, forgot-password or password-reset, or a segment ending in login/signin/logon such as devlogin or admin-login) that accepts POST: Express/Koa-style routers (app/router/server/fastify .post/.all, including an array of paths and a Koa named route), a chained router.route('/login').post(...), a hapi or fastify route object (server.route({ method: 'POST', path: '/login' })), NestJS @Post/@All, Flask @app.route(..., methods=[...POST...]) and @bp.post, FastAPI @app.post/@router.post, and Django path()/re_path() in urls.py. It is reported only when nothing limits how often it can be tried: no limiter, brute-force or throttle middleware on the route itself (loginLimiter, brute.prevent, @limiter.limit, @Throttle, RateLimiter dependency, a django-ratelimit @ratelimit decorator on the view the urls.py entry names), no app-wide limiter in the project (app.use(limiter|rateLimit(...)), koa-ratelimit, @fastify/rate-limit, rate-limiter-flexible, NestJS ThrottlerGuard, flask-limiter or slowapi default_limits, django-axes, django-ratelimit middleware), no path-scoped app.use('<prefix>', rateLimit(...)) covering the route, and no account-lockout bookkeeping (failedLoginAttempts, lockedUntil, lockout). Not reported: GET-only routes, other paths, commented or quoted routes, client calls (axios.post, api.post), test and example files. A limiter enforced by a reverse proxy or API gateway is invisible to this rule.
VNX-804 – Guessable CAPTCHA
Reports home-grown CAPTCHA code in JavaScript/TypeScript and Python that an automated client can solve without solving the challenge: (1) the challenge text or digits come from a predictable generator (Math.random(), or random.choice/choices/randint/randrange/random/sample/getrandbits) on a line that names a captcha, inside a function or class whose name contains captcha, or in a file whose name contains captcha; (2) the expected answer is sent to the client: res.json/res.send/ctx.body/jsonify/JsonResponse with an answer or solution key (including the shorthand { answer }), with a captcha object's .text/.answer/.solution/.code, or with a variable built a few lines above as an object holding an answer/solution key or returned by svgCaptcha.create; (3) verification fails open, so a request naming an unknown CAPTCHA id passes: an accept condition `if (!stored || given === stored.answer)` / `if not stored or ...` / `if stored is None or ... == ...`, or a reject condition that only fires when the stored CAPTCHA exists, `if (stored && stored.answer !== given)` / `if stored is not None and stored.answer != given`. Not reported: fail-closed checks (`if (!stored || stored.answer !== given)` rejecting), crypto.randomInt/randomBytes, secrets, random.SystemRandom, randomness outside captcha code, responses that omit the answer (svgCaptcha's .data), answers stored server side, third-party services (reCAPTCHA, hCaptcha, Turnstile), comments and test files.
VNX-805 – Buffer Access with Incorrect Length Value
A C/C++ call writes into a byte buffer with a length that does not come from that buffer. Reported: (1) memcpy, memmove, memset, strncpy, read, recv, pread, fgets, snprintf, vsnprintf or fread (element size 1) into a char/unsigned char/uint8_t/u_char array declared with a numeric size (a literal or a #define of a literal) in the 80 lines above, either in the same function or at file scope, whose length is a larger number or #define, or sizeof() of another, larger array that is not the copy's source (that shape is VNX-806); (2) memcpy, memmove, memset, strncpy, read, recv or pread whose length is a conversion result: a network or text conversion (ntohs, ntohl, be16toh/be32toh/le16toh/le32toh, atoi, atol, atoll, strtol, strtoul, strtoll, strtoull, std::stoi/stol/stoul/stoull) written inline as the length, or a variable (optionally plus, minus or times a constant) assigned from one in the ten lines above, with no clamp on the assignment itself (MIN/min/clamp or a ternary), no comparison of that variable (<, >, MIN/min) between the conversion and the call, and no allocation of the destination sized by it. Not reported: lengths written as sizeof(dst), equal or smaller numeric lengths, non-byte arrays (an int[10] memset by 40 bytes is correct), an array declared in another function (a pointer parameter of the same name), counts whose size cannot be resolved in the file, and comments.
VNX-806 – Buffer Access Using Size of Source Buffer
A C/C++ copy into a destination buffer is bounded by the size of the SOURCE instead of the destination, so a long source overruns the destination: memcpy, memmove, strncpy, strncat, strlcpy, strlcat, wcsncpy, wcsncat, wmemcpy or wmemmove whose count is strlen(src), wcslen(src) or sizeof(src) of the same expression passed as the source (optionally + 1), a variable assigned from one of those in the ten lines above, or, for a C++ string, s.size()/s.length() with s.c_str()/s.data() as the source. Calls broken across up to three lines are read whole. Not reported: a destination allocated in the twelve lines above (malloc/calloc/realloc/alloca/strdup/new[]/kmalloc, sized from the source), a destination that is itself a container's buffer (v.data(), &s[0]), a length compared with something (a <, >, <= or >= on strlen(src), the length variable or sizeof(dst)) in the twelve lines above or on the call line, a count wrapped in MIN/min, a string-literal or address-of (&x) source, calls spelled inside string literals, and comments. Reading from a source pointer, an unknown destination capacity and cross-function flows are out of scope.
VNX-807 – Reliance on Untrusted Inputs in a Security Decision
Reports an authorization decision taken on a value the client sends and can set to anything: an if/elif/else-if/switch condition, or a boolean assignment with a comparison, that reads a cookie, request header, query, body or path parameter (Express req.cookies/headers/query/body/params, with optional chaining, req.get()/req.header(); Flask/Django request.cookies/COOKIES/headers/META/args/GET/POST/form/values; Java request.getParameter/getHeader on any request or req variable, a Cookie from getCookies() compared by getName()/getValue(), Spring @RequestHeader/@CookieValue/@RequestParam parameters; FastAPI Header()/Cookie()/Query() parameters) where the input's name says what it decides (admin, role, root, superuser, staff, privilege, permission, access level, authenticated, authorized, logged-in) or it is compared with a privileged literal ('admin', 'administrator', 'root', 'superuser', 'staff', 'owner', 'moderator', 'auditor'). The value may be read on the same line, assigned to a variable up to 15 lines above, or destructured from the request object (const { role } = req.cookies). Not reported: server-side state (req.session, req.signedCookies, req.user, request.user, request.getSession(), isUserInRole), a condition that also consults server-side identity (req.body.role === 'admin' && !req.user.isAdmin, which guards against escalation), inputs that decide nothing privileged (theme, language, a non-empty check), logging or passing the value on without a decision, Referer/User-Agent checks, credential comparisons, string literals, comments and test files. A cookie named for a privilege or login state and decided on where it is read is reported by VNX-784 instead.
VNX-820 – Missing Synchronization
A Java object that one instance serves every request thread (a class extending HttpServlet/GenericServlet/HttpFilter, a servlet filter extending OncePerRequestFilter/GenericFilterBean or implementing javax/jakarta Filter, a Servlet or HandlerInterceptor implementation, or a Spring @RestController/@Controller/@Service/@Component/@Repository singleton) keeps mutable state in a field and a request-handling method writes it with no synchronization: an assignment, compound assignment or ++/-- of a non-final, non-volatile field, or a mutating call (put, add, remove, clear, merge, compute*, append...) on a field holding a HashMap, ArrayList, HashSet, LinkedList, TreeMap, LinkedHashMap, ArrayDeque or StringBuilder, declared with that type or declared final as a Map/List/Set and given one in a constructor. Concurrent requests then race on it (lost updates, corrupted collections, one user's data shown to another). Not reported: writes inside a synchronized method or synchronized block, writes while an explicit Lock taken in the method (lock()/writeLock().lock()) is still held, Atomic*, Concurrent*, CopyOnWrite*, ThreadLocal, Collections.synchronized* and volatile fields, injected fields (@Autowired/@Inject/@Value/@Resource), writes in constructors, static initialisers, init()/afterPropertiesSet()/@PostConstruct methods and setters, locals and parameters that shadow the field, classes that are not shared (entities, DTOs), beans scoped prototype/request/session, test files and comments.
VNX-821 – Incorrect Synchronization
Java code synchronizes, but on a monitor that does not give the intended mutual exclusion. Reported: synchronized (new X()) (a fresh lock each call, so nothing is excluded); synchronized on a local variable assigned new ... in the same method; synchronized (Thread.currentThread()) (each thread locks itself); synchronized on a string literal, Boolean.TRUE/FALSE, Integer/Long/String.valueOf or .intern(), or a String/Integer/Long/Short/Byte/Boolean/Character field or variable, final or not (interned and cached values are shared with unrelated code); synchronized (getClass()) (a subclass instance locks a different Class object); synchronized on a java.util.concurrent Lock/ReentrantLock/ReadWriteLock/StampedLock/Semaphore object, field or local (its intrinsic monitor is unrelated to lock()/unlock()); synchronized on a non-final field that a method other than a constructor reassigns (threads end up holding different monitors); and a write to a static non-final field inside a non-static synchronized method, which locks the instance while the data is shared by every instance. Not reported: synchronized (this), on a final Object or collection field, on X.class, on a non-final field assigned only in a constructor, on a local obtained from a shared map or a lock-stripe array, static synchronized methods, a static write inside a synchronized (X.class) block, comments and strings.
VNX-822 – Untrusted Pointer Dereference
A C/C++ pointer is built from data an attacker controls, so dereferencing it reads or writes an attacker-chosen address. Reported: (1) a cast to a pointer type (C-style, including function-pointer casts and (T *)(uintptr_t), or reinterpret_cast<T *>) applied directly to a text-to-integer conversion (strtoul, strtoull, strtol, strtoll, atoi, atol, atoll, std::stoul/stoull/stol/stoll/stoi); (2) the same cast, possibly through an integer cast ((T *)(uintptr_t)v) and including a dereferenced store (*(T *)v = x), applied to a variable assigned from such a conversion or filled by sscanf/fscanf/scanf (any conversion, such as %lx or SCNxPTR) in the ten lines above; (3) sscanf/fscanf/scanf reading a %p conversion; (4) a pointer read out of a buffer received from recv, recvfrom, read or fread in the 30 lines above through a pointer-to-pointer cast (*(T **)(buf + n)); (5) in a Linux ioctl handler (a function taking struct file * and unsigned long arg, the signature possibly spread over three lines), arg cast to a pointer type without __user, which dereferences a user-space address directly instead of copying it with copy_from_user. Not reported: integer conversions that stay integers, (void __user *)arg, an integer passed through a void * to pthread_create/thrd_create/g_idle_add-style callbacks, thread or callback arguments cast back to their context type, pointers to a validated table entry (&table[idx]), printf %p, and comments.
VNX-824 – Access of Uninitialized Pointer
Reports a C or C++ local pointer declared without an initialiser whose first mention in the function dereferences it (*p, p->f, p[i], strcpy(p, ...), memset(p, ...), delete p) before anything stores an address in it.
VNX-825 – Expired Pointer Dereference
Reports C and C++ pointers, references and iterators kept past the lifetime of their target: a local's address stored through an out-parameter, in a global or in a field of a pointer parameter, a pointer to a block-scoped local used after the block, and C++ iterators or references used after the container may have reallocated.
VNX-826 – Premature Release of Resource During Expected Lifetime
Reports a C or C++ file, descriptor, directory, SQLite connection or Windows handle that is closed while the code below still uses it (fclose then fprintf, close then recv, closedir then readdir, sqlite3_close then sqlite3_errmsg, CloseHandle then WriteFile).
VNX-827 – Improper Control of Document Type Definition
Reports XML parser settings that explicitly turn on DOCTYPE/DTD processing in Java, C#, Python (lxml), PHP (libxml, XMLReader) and Ruby (Nokogiri, libxml-ruby), letting a document declare its own entities or pull an external DTD.
VNX-828 – Signal Handler with Functionality that is not Asynchronous-Signal-Safe
Reports each line of a C or C++ signal handler that calls a function outside the POSIX async-signal-safe list (stdio, the heap, syslog, exit, localtime, pthread locking, std::cout, new/delete), directly or through a helper defined in the same file.
VNX-837 – Improper Enforcement of a Single, Unique Action
Detects Stripe calls that move money (charges, payment intents, refunds, transfers, payouts, top-ups) made without an idempotency key, so a retried or double-submitted request performs the action twice. Python and JavaScript/TypeScript.
VNX-840 – Business Logic Error: Client-Controlled Monetary Value
Reports a monetary value read from the HTTP request (amount, price, total, discount, cost, fee, balance) used as the amount charged, an order total or discount, or an account balance change, in JavaScript/TypeScript and Python.
VNX-841 – Improper Enforcement of Behavioral Workflow
Reports workflow state decided by the client: a status, paid, approved or verified field set from a request value, or an if that advances the workflow because a request parameter says so, in Java, JavaScript/TypeScript and Python.
VNX-926 – Android component exported with no permission protecting it
Reports an <activity>, <activity-alias>, <service>, <receiver> or <provider> in AndroidManifest.xml that declares android:exported="true" and no android:permission (a provider without android:permission needs both android:readPermission and android:writePermission; with only one, its other side is open and it is reported): any app on the device can start, bind, broadcast to or query it (CWE-926). The finding is on the android:exported line, and the start tag may span several lines. Not reported: the launcher activity (an intent-filter with category LAUNCHER or LEANBACK_LAUNCHER, which must be exported), components that are not exported or protected by a permission, components of an <application> that declares android:permission (the default for every component), components the manifest merger removes (tools:node="remove"), commented-out elements (single-line or inside a multi-line comment), and XML files other than AndroidManifest.xml. Components exported implicitly by an intent-filter on old target SDKs are not reported, because the target SDK is not known from the manifest line.
VNX-927 – Implicit Intent broadcast that any app can receive
Reports an Android broadcast that any installed app can receive (CWE-927) in Java and Kotlin: sendBroadcast(i), sendOrderedBroadcast(i, null[, resultReceiver, ...]) or sendBroadcastAsUser(i, user) with no receiver permission (the call's arguments may start on the next line), where i is built a few lines above as an implicit Intent (new Intent(), new Intent("action") or new Intent(ACTION_CONSTANT), Kotlin Intent(...)) and no setPackage/setComponent/setClass/setClassName (or package/component assignment) makes it explicit before the send; the same call with the implicit Intent built inline; and every sendStickyBroadcast/sendStickyOrderedBroadcast, whose extras any app can read back. Not reported: a broadcast with a permission argument, explicit Intents (new Intent(context, Receiver.class) or one given a package or component), LocalBroadcastManager sends, comments and strings. Intents built in another method or passed in as a parameter are not followed.
VNX-928 – Broken or obsolete cipher (DES, 3DES, RC4, RC2, Blowfish) in Kotlin
CWE-928 is the OWASP Top Ten 2013 view; this rule reports its most concrete Kotlin manifestation, a broken or obsolete symmetric cipher (A6 Sensitive Data Exposure). Java is reported by VNX-CRYPTO-004 (Broken or obsolete cipher, CWE-327), which reads the same JCA and Bouncy Castle forms, so a weak cipher in a .java file is one finding rather than two; this rule reads .kt files only. Reported in Kotlin: Cipher, SecretKeyFactory or KeyGenerator .getInstance with DES, DESede/TripleDES/3DES, RC4/ARCFOUR, RC2 or Blowfish (any mode and padding, the argument possibly on the next line) or a password-based scheme built on one (PBEWithMD5AndDES, PBEWithSHA1AndDESede, PBEWithSHAAnd40BitRC4), Bouncy Castle new DESEngine/DESedeEngine/RC4Engine/RC2Engine/BlowfishEngine(), the same algorithm passed through a String constant assigned in the same file, new SecretKeySpec(key, "DES"/"RC4"/...), and new DESKeySpec/DESedeKeySpec. Not reported: AES, ChaCha20 and RSA transformations, algorithm names in comments, log messages or other string literals not passed to a crypto API, and identifiers that only start with DES (DESCRIPTOR, DESIGN). A constant defined in another file is not followed.
VNX-929 – Broken hash algorithm (MD5, MD2, MD4, SHA-1) in Java or Kotlin
CWE-929 is an OWASP Top Ten 2013 category with no code shape of its own; this rule reports the concrete Java/Kotlin signal it was generated for, a collision-broken digest: MessageDigest.getInstance("MD5"/"MD2"/"MD4"/"SHA-1"/"SHA1"/"SHA"), with the argument possibly on the next line, the same name passed through a String constant assigned in the same file or as commons-codec MessageDigestAlgorithms.MD2/MD5/SHA_1, Apache commons-codec DigestUtils.md5/md5Hex/sha1/sha1Hex/sha/shaHex/md2 (and getMd5Digest/getSha1Digest), Spring DigestUtils.md5Digest/md5DigestAsHex, and Guava Hashing.md5()/Hashing.sha1(). Not reported: SHA-2 and SHA-3 digests, algorithm names in comments and strings, and digests whose surrounding code names a non-security purpose (an ETag, checksum, CRC, cache key, fingerprint, de-duplication, a Gravatar URL or the RFC 6455 WebSocket accept key). In a .java file only MD2 and MD4 are reported here: an MD5 or SHA-1 digest in Java is reported by VNX-CRYPTO-001 (MD5) and VNX-CRYPTO-002 (SHA-1), or by VNX-327 when it protects a password or token, which read every Java shape this rule reads. Kotlin, which those rules do not read, keeps all four algorithms here.
VNX-930 – Android app runs commands as root through su
CWE-930 is an OWASP Top Ten 2013 category (broken authentication and session management) with no code shape of its own; this rule reports the concrete device-level authorization signal it was generated for: Java or Kotlin code that launches the su binary to run commands as root, through Runtime.getRuntime().exec("su"), exec("su -c ..."), exec(new String[]{"su", ...}) or exec(arrayOf("su", ...)), new ProcessBuilder("su", ...), ProcessBuilder(listOf/Arrays.asList("su", ...)) or processBuilder.command("su", ...), with su named bare or by an absolute path (/system/xbin/su, /su/bin/su) and the argument list possibly starting on the next line; a command array whose first element is su assigned a few lines before the exec; and the libsuperuser Shell.SU.run(...) and early libsu Shell.su(...) root-shell helpers. Whatever the root shell runs bypasses the Android permission model. Not reported: root detection (which su, ls /system/xbin/su, File("/system/xbin/su").exists(), Shell.SU.available(), Superuser.apk checks), non-root shells (Shell.SH.run), other commands, comments and strings, and test code (src/test, src/androidTest, *Test.java).
VNX-931 – Authorization rule opens every request, an admin path or a state-changing endpoint to anyone
CWE-931 is an OWASP Top Ten 2013 category with no code shape of its own; this rule reports the concrete missing-authorization configuration it was generated for, in Java and Kotlin: Spring Security anyRequest().permitAll() and WebFlux anyExchange().permitAll() (also split across lines, and the Kotlin DSL authorize(anyRequest/anyExchange, permitAll)); a matcher (requestMatchers, antMatchers, mvcMatchers, regexMatchers, pathMatchers or the Kotlin authorize) for "/**", an admin, management or internal path segment at any depth (/admin/**, /api/admin/**, also inside new AntPathRequestMatcher(...)), the whole /actuator tree or EndpointRequest.toAnyEndpoint() directly followed by permitAll() (the matcher's arguments may span several lines); web.ignoring() on such a path, which takes it out of Spring Security altogether; and a JAX-RS/Jakarta @PermitAll on a method annotated @DELETE, @PUT or @PATCH. Not reported: permitAll on public paths (login, static assets, /actuator/health, and an admin area's own login page and assets such as /admin/login or /admin/css/**), a sensitive matcher that is given a role before a later permitAll on the same line, formLogin()/logout() permitAll, @PermitAll on GET or POST methods (login and registration are public by design), StrictMode policies, comments and strings.
VNX-932 – Source code switches off stack protection or FORTIFY_SOURCE
CWE-932 is an OWASP Top Ten 2013 category with no code shape of its own; this rule reports the concrete C/C++ hardening signal it was generated for, source that turns off a compiler memory-safety defence for the code that follows: #pragma GCC/clang optimize("no-stack-protector"/"-fno-stack-protector"), __attribute__((no_stack_protector)) and __attribute__((optimize(..., "no-stack-protector"))) (also after other attributes in the list, and inside #pragma clang attribute push), [[gnu::no_stack_protector]], #undef _FORTIFY_SOURCE that is not followed by a non-zero redefinition, #define _FORTIFY_SOURCE 0, and MSVC #pragma strict_gs_check(off) and __declspec(safebuffers). Not reported: optimisation-level pragmas and attributes (O0, O2, O3; optimize("O0") is the usual secure-zeroing idiom), _FORTIFY_SOURCE set to 1-3, comments (including a trailing comment after code) and string literals, and test or fuzzing code. Build-system flags (-fno-stack-protector in a Makefile) are out of scope.
VNX-933 – Script loaded over plain HTTP
CWE-933 is the OWASP Top Ten 2013 Security Misconfiguration category with no code shape of its own; this rule reports the concrete misconfiguration it was generated for, a page that loads executable script over plain http://, which anyone on the network path can replace with their own code. Reported: a <script> tag whose src is an http:// URL in HTML and server-side template files (.html, .htm, .php, .jsp, .erb, .ejs, .cshtml, .aspx, .vue, .svelte, .jsx, .tsx, Jinja, Twig, Handlebars and similar), with any quoting or letter case and with the src attribute on a later line of the start tag; and in JavaScript/TypeScript, an element made by document.createElement("script") whose src is set to an http:// URL a few lines later (el.src = or el.setAttribute("src", ...)), and $.getScript/jQuery.getScript or a worker's importScripts called with an http:// URL. Not reported: https:// and protocol-relative or relative src values, loopback development servers (localhost, 127.0.0.1, 0.0.0.0, [::1]), http:// URLs on links, images or inside inline script code, HTML comments (single-line or multi-line), test files, and script URLs assembled at run time. A tag with an integrity attribute is still reported: on an HTTPS page the browser blocks the script as mixed content, and on an HTTP page the attacker can rewrite the tag itself.
VNX-936 – Cross-Site Request Forgery protection disabled (Laravel, Symfony, Kotlin Spring Security)
Reports CSRF protection switched off in Laravel (wildcard $except, removed middleware, withoutMiddleware), Symfony (csrf_protection: false, form option) and Kotlin Spring Security (csrf { disable() }).
VNX-94 – Code Injection
HTTP request data reaches eval, new Function, vm, string setTimeout, Python eval/exec/compile, PHP eval/assert/create_function/call_user_func, or Ruby eval/instance_eval/class_eval/module_eval, directly or through a variable.
VNX-95 – Template Injection (Eval Injection)
HTTP request data becomes the source of a Jinja2, Mako, Django, EJS, Pug, Handlebars, Nunjucks, lodash, ERB, Erubi, Haml, Slim or Rails render inline: template, directly or through a variable.
VNX-98 – PHP Remote File Inclusion
PHP include/require statements whose path carries request data (superglobals, php://input, filter_input, $request->input), inline or through a variable, with no basename(), cast or allowlist check.
VNX-ANDROID-002 – Android WebView JavaScript Enabled
Detects a JavaScript-enabled Android WebView (Java/Kotlin) that loads a URL or HTML from an Intent, deep link, Fragment arguments, external storage or a cleartext http:// address, an evaluateJavascript call built from such a value, a JavaScript bridge added in such a file, and file:// pages given universal or file access.
VNX-ANDROID-003 – Android Exported Component Without Permission Check
Detects an activity, activity-alias, service, receiver or provider in a production AndroidManifest.xml that is exported (android:exported="true", or an intent-filter with no exported attribute) and requires no permission, excluding components that answer platform actions such as the launcher, deep links and system broadcasts.
VNX-ANDROID-004 – Android SharedPreferences Used for Sensitive Data Storage
Detects a password, token, secret, API or private key, PIN or session id written with putString() to a plain (not Encrypted) SharedPreferences editor in Java or Kotlin, where the key or value names the credential and the value is not encrypted or hashed first.
VNX-ANDROID-005 – Android Network Security Config Allows Plaintext HTTP Traffic
Detects cleartextTrafficPermitted="true" on the base-config, or on a domain-config naming a non-loopback host, of an Android network security configuration, and android:usesCleartextTraffic="true" on an application with no networkSecurityConfig, outside debug and test source sets.
VNX-ANDROID-006 – Android Hardcoded API Key in strings.xml
Detects a <string> resource in an Android res/values*/ file whose name marks it as a credential (api key, secret, token, password, private or signing key) and whose value is a credential-shaped literal, not UI text, a placeholder, a reference or a public Firebase/Facebook client id.
VNX-BASH-001 – eval or sh -c of a Dynamically Built String
Reports a shell eval, or a bash/sh/zsh/ksh/dash -c or su/runuser -c command string (or a find -exec/xargs sh -c script that pastes {} into its code), whose text contains a variable, positional parameter, dynamic command substitution or the output of a download or decoder, so the shell re-parses data as code.
VNX-BASH-005 – Hardcoded Secret or Password in Shell Script
Reports a literal credential in a shell script or .env file: an assignment or command-prefix assignment to a PASSWORD/SECRET/TOKEN/API_KEY-style name, a literal Authorization/X-Api-Key header token, a literal after a credential flag (--password, mysql -p, sshpass -p, curl -u, docker login -p, redis-cli -a), or a user:password pair in a connection URL. Placeholders, runtime references and single-word local defaults are not reported.
VNX-BASH-007 – Unquoted Command Substitution in Shell Script
Reports an unquoted $(...) or backtick substitution used as a command argument, or a for loop over a file or text listing, where word splitting and globbing break its output into extra arguments. Quoted, assigned, arithmetic, command-position and single-token outputs are not reported.
VNX-C-001 – Use of Unbounded String Copy Function (strcpy/strcat/gets)
Reports C and C++ copies of unknown length into a buffer without a size: gets() and _getws() always; strcpy, stpcpy, strcat and their wide, multibyte, TCHAR and lstrcpy/lstrcat forms when the source is not a literal or macro; sprintf/wsprintf with an unbounded %s and vsprintf; scanf-family %s or %[ without a field width. Bounded APIs, measured or size-checked copies, literal sources (including const arrays initialised from a literal), declarations and comments are not reported.
VNX-C-002 – Format String Injection via Non-Literal Format Argument
Reports C and C++ printf-family calls whose format argument is not a string literal: a string printed as the format with nothing after it (printf(buf), fprintf(fp, msg), syslog(LOG_ERR, msg), snprintf(buf, n, s), BSD warn/err), and a format taken from argv, getenv or input read in the 25 lines above. Literal, macro and gettext formats, variadic wrappers and comments are not reported.
VNX-C-003 – OS Command Injection via system() or popen() with Non-Literal Argument
Reports C and C++ calls that hand a non-constant string to a shell (system, popen, _popen, _wsystem, p2open, std::system, execl of sh -c) when the command comes from argv, getenv or input, or was composed nearby with sprintf/snprintf/asprintf %s, strcat/strcpy or C++ string concatenation, and wordexp() without WRDE_NOCMD. Literal commands, exec without a shell, validated or quoted input, wrapper parameters and comments are not reported.
VNX-C-004 – Use-After-Free: Pointer Used After free()
Reports a C, C++ or Objective-C pointer used after free(), g_free, kfree, OPENSSL_free or delete: a dereference, a call that takes it or a return of it within 15 lines on the same path, before it is reassigned and before the path leaves, plus a for loop that advances through the pointer its body frees. Nulled or reassigned pointers, comparisons, other branches, saved next pointers, macros and comments are not reported.
VNX-C-005 – Integer Overflow in malloc/calloc Size Arithmetic
Reports a C or C++ allocation (malloc, realloc, calloc, aligned_alloc and common wrappers) whose size multiplies or adds a count parsed or received in the 30 lines above (atoi/strtol family, ntohl, getenv, scanf/fread/read/recv out-arguments) with no overflow check. Checked or clamped counts, 8- and 16-bit counts, plain calloc(n, size), and sizes from constants or internal lengths are not reported.
VNX-C-006 – Use of alloca() for Dynamic Stack Allocation
Reports C, C++ and Objective-C stack allocations with an unbounded run-time size: alloca, _alloca and __builtin_alloca whose size names a variable or call, strdupa of a non-literal, and variable-length arrays sized by strlen() or by a count parsed or received just above. Constant sizes, sizes compared or clamped first, _malloca, declarations, macros and comments are not reported.
VNX-CRYPTO-001 – MD5 Usage Detected
MD5 is computed through a hash or signature API: Python hashlib.md5()/hashlib.new('md5') (module and from-import aliases resolved), PyCryptodome MD5.new() and cryptography hashes.MD5(); Node.js crypto.createHash('md5')/createSign('RSA-MD5'), CryptoJS.MD5() and the md5/blueimp-md5/js-md5/spark-md5 packages under the name they are imported as; Go crypto/md5 md5.New/md5.Sum (aliased import resolved) and x509.MD5WithRSA; Java MessageDigest/Signature.getInstance("MD5"/"MD5withRSA") with the name given literally, through a variable, field or constant (also one declared on another class) that holds it, directly, in a ternary, or from a getProperty/@Value lookup that resolves to the value the project's .properties or YAML files give the key, else the lookup default, commons-codec DigestUtils.md5*, Guava Hashing.md5() and BouncyCastle MD5Digest; Ruby Digest::MD5 and OpenSSL::Digest.new('MD5'); PHP md5(), md5_file(), hash('md5') and openssl_digest(..., 'md5'). MD5 collisions are cheap to produce, so it must not protect integrity, signatures, tokens or passwords; use SHA-256 or stronger (argon2/bcrypt/scrypt for passwords). Not reported: HMAC-MD5 (hmac.new(k, m, hashlib.md5), createHmac('md5'), hmac.New(md5.New, k), HmacMD5, hash_hmac('md5')), PBKDF2 or HKDF over MD5, Python calls declaring usedforsecurity=False, a field, header or method merely named md5, the import alone and constants such as md5.Size, the algorithm named inside a string literal (an SQL md5() call) or a comment, documentation, and test files. An MD5 digest that protects a security value is reported by a more precise rule instead, so the line is reported once: a password passed straight into it by VNX-CRYPTO-007 (a password hashed with a fast hash), and one with a password, secret, token, session id, cookie, signature, salt, nonce, CSRF value or API key named around the call by VNX-327 (a broken hash protecting a security value).
VNX-CRYPTO-002 – SHA-1 Usage Detected
Reports SHA-1 computed through a hash or signature API in Python, Node.js, Go, Java, Ruby and PHP (hashlib.sha1, createHash('sha1'), sha1.Sum, x509.SHA1WithRSA, MessageDigest.getInstance("SHA-1"), Digest::SHA1, sha1()), with imports and aliases resolved. HMAC-SHA1, PBKDF2-HMAC-SHA1, the WebSocket accept key, usedforsecurity=False, names merely containing sha1, comments, strings and test files are not reported.
VNX-CRYPTO-003 – AES in ECB Mode
Reports block ciphers set up in ECB mode in Python, Node.js, Go, Java, Ruby and PHP: MODE_ECB, modes.ECB(), '*-ecb' cipher names, Java '*/ECB/*' or bare "AES", "DES", "DESede" or "Blowfish" transformations (literal, variable or getProperty default), NewECBEncrypter and hand-written per-block Encrypt loops. Other modes, RSA/ECB/* and AES key-wrap transformations, guards against ECB, single-block operations, overridden property defaults, comments and test vectors are not reported.
VNX-CRYPTO-004 – Broken or Obsolete Cipher
Reports construction of DES, Triple DES, RC4, RC2, Blowfish, CAST5 or IDEA ciphers in Python, Node.js, Go, Java, Ruby and PHP (PyCryptodome/cryptography, createCipheriv names, crypto/des and crypto/rc4, Cipher.getInstance transformations and SecretKeySpec algorithms, OpenSSL::Cipher, openssl_encrypt and mcrypt). TLS cipher-suite deny-lists, names in lists or comparisons, block-size constants, lookalike names, comments, strings and test files are not reported.
VNX-CRYPTO-005 – TLS Certificate Validation Disabled
Reports TLS clients told to accept any certificate or host name in Python (verify=False, CERT_NONE, unverified contexts), Node.js (rejectUnauthorized: false, NODE_TLS_REJECT_UNAUTHORIZED=0)and Go (InsecureSkipVerify: true); Java trust managers and host-name verifiers are reported by VNX-JAVA-006. Values from configuration, branches honouring an insecure option, custom pinning and test files are not reported.
VNX-CRYPTO-006 – Weak RSA Key Size
Reports RSA key generation with a modulus below 2048 bits, given literally or through a constant in the same file, in Python (cryptography, PyCryptodome, python-rsa, pyOpenSSL), Go (rsa.GenerateKey), Java (RSA KeyPairGenerator.initialize, RSAKeyGenParameterSpec) and Node.js (generateKeyPair modulusLength, WebCrypto subtle.generateKey, node-forge, node-rsa). Sizes from configuration, EC/DSA/symmetric keys and test files are not reported.
VNX-CRYPTO-007 – Weak Password Hashing (Insufficient Iterations or Missing KDF)
Reports a password-named value hashed with a fast general-purpose hash (MD5, SHA-1, SHA-2, SHA-3, BLAKE2) in Python, Node.js, Java, PHP, Ruby and Go, including through a helper named for the hash (Md5Sum(password)), and password KDFs with too low a work factor: PBKDF2 under 10,000 iterations and bcrypt cost under 10. Non-password hashing, the Have I Been Pwned SHA-1 range lookup, helpers defined elsewhere and test files are not reported.
VNX-CRYPTO-008 – Timing Attack via Direct Comparison of Secrets
Reports a MAC, signature, digest or secret token checked with ordinary equality (==, !=, ===, !==, Java equals/Arrays.equals, Go bytes.Equal) in Python, Node.js, Go, Java, PHP and Ruby, any equality on a line that computes an HMAC, and a hand-written byte loop with an early return in MAC or signature code, when the comparison verifies a supplied value (a request input, a handler parameter, a verify-named function or a value hashed just above). Comparisons where neither side is supplied, presence checks, constants, lexer token kinds, hash-named values and constant-time APIs are not reported.
VNX-CRYPTO-009 – Use of Cryptographically Weak PRNG (rand/srand/random in C/C++)
Detects a value from rand(), random(), the drand48 family, std::rand() or a <random> engine such as std::mt19937 becoming a token, nonce, salt, IV, key, password, session id, CSRF token or OTP in C, C++ and Objective-C code. Ordinary rand() use for sampling, shuffling and jitter is not reported.
VNX-CRYPTO-010 – Hardcoded IV, Nonce, or Salt in Cryptographic Operation
Detects a constant IV, nonce or salt (a string or byte literal, a literal byte array, or a zero-filled buffer) passed to a cipher, AEAD or password KDF call in Python, JavaScript/TypeScript, Go, Java/Kotlin, C/C++/Objective-C, Rust, C#, PHP and Ruby, directly or through a variable assigned that constant. Random, ciphertext-derived and in-place-filled IVs are not reported.
VNX-CS-001 – C# SQL Injection: Query Text Built by Concatenation, Interpolation or string.Format
Detects C# SQL statements whose text is built from non-constant values (concatenation, interpolation, string.Format, StringBuilder) and executed through ADO.NET commands and data adapters, CommandText, EF Core raw SQL, Dapper, LINQ to SQL or NHibernate.
VNX-CS-002 – C# Command Injection: Request Data or a Dynamic Shell Command Reaches Process.Start
Detects C# Process.Start, ProcessStartInfo FileName/Arguments and PowerShell AddScript calls that receive HTTP request data or action parameters, and shells (cmd, sh, bash, PowerShell) given a command line built from non-constant values, including through ArgumentList after -c or /c and CliWrap WithArguments.
VNX-CS-004 – C# Insecure Deserialization: Type-Embedding Formatter or Serializer Setting
Detects C# deserialisation through BinaryFormatter, SoapFormatter, NetDataContractSerializer, LosFormatter and ObjectStateFormatter, Json.NET TypeNameHandling without a SerializationBinder, JavaScriptSerializer with a type resolver, MessagePack typeless deserialisation, and serializers whose root type comes from Type.GetType on data.
VNX-CS-005 – C# MVC Action Accepting Cross-Site Form Posts Without Anti-Forgery Validation
Detects ASP.NET MVC and ASP.NET Core MVC controller actions reachable by a cross-site form ([HttpPost], [AcceptVerbs(HttpVerbs.Post)], and PUT/DELETE/PATCH where method override applies) with no anti-forgery validation on the action, the controller, a base controller or a global filter.
VNX-CS-006 – C# Insecure Random Number Generator (System.Random for Security)
Detects C# calls to System.Random (Next, NextInt64, NextDouble, NextBytes, GetItems) whose result becomes a password, token, key, salt, nonce, IV, session or CSRF value, an OTP or a reset code.
VNX-CS-007 – C# Path Traversal via Path.Combine with User Input
Detects C# Path.Combine/Path.Join, MapPath and file-system APIs (File, Directory, FileStream, StreamReader, PhysicalFile, TransmitFile, SaveAs) whose path argument contains HTTP request data, an uploaded file name, an archive entry name (zip slip) or a controller action parameter, without Path.GetFileName or a GetFullPath/StartsWith containment check.
VNX-CS-008 – C# SSRF via WebClient or HttpClient with User-Supplied URL
Detects C# HttpClient, WebClient, WebRequest.Create, HttpRequestMessage, RestClient, Flurl and BaseAddress/RequestUri URLs whose scheme and host come from HTTP request data or a controller action parameter, with no host allowlist check.
VNX-CS-009 – C# Use of Weak Cryptographic Algorithm (MD5, SHA-1, DES, 3DES, RC2, RC4)
Reports C# code that creates or invokes MD5, SHA-1, DES, 3DES, RC2, RC4, MD4/MD2 or PBKDF1 through the .NET or BouncyCastle crypto APIs, including SHA-1/MD5 signatures and algorithms requested by name. HMAC, RSA-OAEP, PBKDF2, protocol-fixed hashes (WebSocket, Gravatar, ETag, Content-MD5), analyzer-suppressed code, comments, strings and test projects are not reported.
VNX-CS-010 – C# Hardcoded Connection String with Credentials
Reports C# source that hardcodes the password of a database or cache connection: a Password=/Pwd= value in a connection-string literal, or a literal assigned to the Password of a ConnectionStringBuilder, Redis ConfigurationOptions or RabbitMQ ConnectionFactory. Passwords from configuration, format and interpolation holes, placeholders, SQL text, comments, test projects and configuration files are not reported.
VNX-DOCKER-002 – Dockerfile FROM :latest Tag
Reports a FROM, COPY --from or RUN --mount=from that names an external image by :latest, a floating tag (alpine, slim, lts, stable) or no tag, with no @sha256 digest, including images resolved through an ARG default.
VNX-GO-002 – Command Injection via exec.Command
Reports exec.Command/CommandContext running a shell with -c (or /C, -Command) and a script built with fmt.Sprintf or concatenation, or read from the HTTP request, and a program name that is itself formatted or request-supplied. Constant scripts, positional parameters, shell-quoted values and formatted arguments to a fixed program are not reported.
VNX-GO-003 – SQL Injection via fmt.Sprintf
Reports database/sql, sqlx, pgx and GORM query calls whose SQL is built with fmt.Sprintf or concatenation so a value lands where a bind parameter belongs (inside quotes, after a comparison, IN/VALUES/LIMIT), or that embed a request value anywhere. Parameterised queries, %d, server-chosen identifiers, placeholder lists and quoted identifiers are not reported.
VNX-GO-004 – TLS InsecureSkipVerify Enabled
Reports InsecureSkipVerify set to the constant true in a tls.Config literal or assignment. A value from a variable, flag or environment, true inside an if on the insecure option itself, a config with its own VerifyPeerCertificate/VerifyConnection, comments, strings and test code (including test-support packages such as httptest and testutil) are not reported.
VNX-GO-005 – Go Open Redirect
Reports http.Redirect, gin/echo/fiber Redirect and hand-written Location headers whose destination starts with a request value, directly, through a variable, or behind a prefix that does not pin the host ("//", "https://", a bare "/"). Fixed hosts or paths, validated destinations and configuration values are not reported.
VNX-GO-006 – Go Server-Side Request Forgery
Reports outbound HTTP requests, reverse proxies, net/tls dials and websocket dials whose URL or address starts with a request value (query, form, path parameter header, or a decoded or unmarshalled JSON body field), directly, via url.Parse or a variable, or behind a prefix that does not pin the host. Fixed hosts, configured destinations, allowlisted values and guarded dialers are not reported; a HasPrefix test against a bare scheme is normalisation, not a check.
VNX-GO-007 – Go Path Traversal
Reports a file read, listed or served (os.Open, os.ReadFile, os.ReadDir, ioutil.ReadFile, http.ServeFile, gin/echo/fiber file responses) from a path holding a request value, inline, through a variable or through one filepath.Join/Sprintf built from it. filepath.Base, IsLocal, Rel, HasPrefix on the cleaned path, table lookups, os.Root, and operator-supplied paths are not reported; HasPrefix on the raw value is.
VNX-GO-008 – Go Weak PRNG for Security
Reports a math/rand or math/rand/v2 call (Read, Intn, Int63, Uint64, IntN...) whose line, the line its value flows into, or the enclosing function name says the value is a token, password, secret, nonce, salt, OTP, PIN, CSRF value, session id, key or reset code. crypto/rand, jitter, backoff, sampling and shuffling outside secret-named functions, and test code are not reported.
VNX-GO-010 – Go Weak Cipher Usage
Detect Go code that constructs DES, Triple DES, RC4, Blowfish, CAST5, TEA or XTEA ciphers, or enables RC4/3DES TLS cipher suites or 3DES/arcfour SSH ciphers, which are broken or deprecated for protecting data.
VNX-GO-011 – Go gob Deserialization of a Request Body or Accepted Connection
Detect Go code that decodes gob data from an HTTP request body (net/http, gin, echo, fiber, fasthttp) or an accepted network connection, directly or through a variable, which lets a client exhaust memory and stack.
VNX-GO-012 – Go HTTP Response Header Set from a Request Parameter
Detect Go code that writes a query, form or route parameter into an HTTP response header (net/http, gin, echo, fiber, fasthttp), inline or through a variable, without neutralising or constraining it.
VNX-GO-017 – Go SQL Injection via fmt.Sprintf in Database Call
Detects fmt.Sprintf SQL that puts a string verb where SQL expects a literal (quoted, or after a comparison) and is run by Exec/Query/QueryRow/Prepare, sqlx or GORM Raw/Where/Order, inline or through a variable; other verb positions only when fed a request value. Integer verbs, placeholder builders, quoted or converted values and self-built fragments are not reported.
VNX-GO-018 – Go Arbitrary File Write via User-Controlled Path
Detects files created, written, renamed or linked (os.Create, os.WriteFile, os.OpenFile with a write flag, os.MkdirAll, os.Rename, gin SaveUploadedFile) at a path built from HTTP request data or a multipart filename, with no filepath.Base, IsLocal, prefix check on the cleaned path or os.Root confining it. Read-only opens and server-chosen names are not reported.
VNX-GO-019 – Go Debug Endpoints (pprof, expvar) Served on All Interfaces
Detects pprof and expvar debug handlers served on a listener bound to every interface: the default mux when net/http/pprof or expvar is imported, a mux or router carrying the debug handlers (including chi middleware.Profiler), or a gin engine with gin-contrib pprof. An all-interfaces address held in a constant of the same file counts as the literal. Loopback and flag- or config-supplied addresses, and public listeners without debug handlers, are not reported.
VNX-GO-020 – Use of template.HTML with potential user input
Detects template.HTML, HTMLAttr, JS, CSS, URL and Srcset conversions applied to request data, markup built with Sprintf or concatenation, a function parameter, or a variable assigned from one of those. Constant markup, sanitised or escaped values and executed template output are not reported.
VNX-GO-021 – Potential XSS via fmt.Fprintf with HTML tags
Detects HTML written to an http.ResponseWriter (fmt.Fprintf/Fprint/Fprintln, io.WriteString, w.Write, gin c.Data, echo c.HTML) with a non-constant value spliced into the markup unescaped. Escaped and numeric values, constants, plain-text or JSON handlers and writes to builders or files are not reported.
VNX-GO-022 – Use of eval() or dynamic code execution
Detects request data, the request body or a caller-supplied parameter passed as code to an embedded interpreter or expression engine (goja, otto, yaegi, gopher-lua, govaluate, expr, gval, cel-go, tengo, starlark) or parsed as an html/template or text/template. Constant, embedded and configured scripts are not reported.
VNX-GO-024 – Missing input validation on HTTP request parameters
Detects an HTTP request parameter reaching a command, SQL query text, file path, outbound request, redirect or raw response in the same function, inline or through one or two assignments, with no conversion, escaping, allowlist or validation on the way. Bind arguments and values only logged or compared are not reported.
VNX-GO-025 – Potential open redirect via HTTP redirect
Detects a redirect (http.Redirect, gin/echo/fiber Redirect, a Location header) whose target is a query, form or route parameter, directly or through one variable built from it, with no allowlist or host check first.
VNX-GO-027 – Potential path traversal via file path construction
Detects a file opened, written, removed or served (os, ioutil, http.ServeFile, gin/echo/fiber file helpers) with a path built from a request value that was not reduced with filepath.Base, IsLocal, Rel or a prefix check first.
VNX-GO-028 – Use of weak cryptographic hash for password hashing
Detects a password hashed with a fast unsalted digest (md5, sha1, sha256, sha512 Sum or a hasher written with it, an MD5/SHA helper, or a digest stored in a password-named field) instead of bcrypt, scrypt, Argon2id or PBKDF2.
VNX-GO-029 – Hardcoded weak or default password
Detects a well-known weak or default password (admin, password, 123456, changeme, postgres...) written into Go source as a credential: a password variable or field, a setter or SetBasicAuth, connection-string userinfo, or an env/flag/viper default.
VNX-GO-030 – Missing Secure flag on cookie
Detects a cookie sent to the browser without Secure: an http.Cookie, fiber.Cookie or gorilla sessions.Options literal with Secure absent or false, gin SetCookie with secure=false, a hand-written Set-Cookie header without Secure, csrf.Secure(false), or a gorilla cookie store whose Options are never set.
VNX-GO-032 – JWT missing expiration validation
Detects JWT expiry that is never enforced in Go: claims validation turned off (WithoutClaimsValidation, SkipClaimsValidation, jwx WithValidate(false)), go-jose Claims with no Validate call, and tokens issued from a claims literal or a jwx builder with no exp/ExpiresAt/Expiry.
VNX-GO-035 – Missing HttpOnly flag on cookie
Detects Go cookies sent to the browser without HttpOnly (http.Cookie, fiber.Cookie, gorilla sessions Options, gin SetCookie, default cookie stores), excluding deletion, CSRF double-submit and client-side cookies.
VNX-GO-040 – Logging of sensitive data
Detects Go logging calls (log, slog, zap, logrus, zerolog, any logger) whose arguments carry a password, token, secret, API key, private key, card number or Authorization header.
VNX-GO-041 – Use of deprecated TLS version
Detect Go TLS configuration that sets MinVersion or MaxVersion (or an options field such as TLSMinVersion) to SSL 3.0, TLS 1.0 or TLS 1.1 (by constant, raw protocol number, a local variable or a package-level constant holding one, a Traefik-style string option or an Envoy TlsParameters enum), enabling negotiation of deprecated protocol versions.
VNX-HTML-001 – Use of Jinja2 |safe filter
Reports Jinja2, Django and Nunjucks templates that mark an output expression |safe or |safeseq, or switch autoescape off, unless the value is a literal, already escaped/JSON-encoded, or a CSRF token or form field.
VNX-JAVA-002 – Spring Actuator Endpoints Exposed
Reports Spring Boot configuration that exposes all or sensitive actuator endpoints over HTTP (include=*, env, heapdump, shutdown, jolokia...), enables shutdown, or disables Boot 1.x actuator security.
VNX-JAVA-004 – XML External Entity (XXE) Injection
Reports Java XML parser factories (DOM, SAX, StAX, dom4j, JDOM, and Transformer/Schema factories that load sources) created without disabling DTDs or external entities, and settings that re-enable them.
VNX-JAVA-008 – Java Server-Side Request Forgery (SSRF)
Reports Java outbound requests (URL, RestTemplate, WebClient, HttpClient, OkHttp, Jsoup, Socket) whose URL or host is a request value or a variable assigned from one, unless a fixed host prefixes it or a guard checks it.
VNX-JAVA-009 – Java Path Traversal
Reports Java file and path APIs (new File, FileInputStream/FileOutputStream, FileReader/FileWriter, Paths.get, Path.of, Path.resolve, Files.*, FileSystemResource) whose path argument carries servlet request data, an upload file name or an annotated Spring/JAX-RS handler parameter, directly or through up to five local assignments, unless the path is checked for containment or reduced to a bare file name.
VNX-JAVA-010 – Spring CSRF Protection Disabled
Reports Spring Security configurations that switch CSRF protection off for browser-facing applications: csrf().disable(), csrf(c -> c.disable()), csrf(AbstractHttpConfigurer::disable), WebFlux CsrfSpec::disable, CSRF ignored for every path, and csrf disabled=true in XML configuration. Stateless bearer-token APIs and test configurations are not reported.
VNX-JAVA-011 – Java Expression Language Injection
Reports SpEL, OGNL, Jakarta EL, ScriptEngine, MVEL, JEXL and Bean Validation message-template calls whose expression argument carries HTTP request data or the validated value, directly or through up to five local assignments. Constant expressions and request data bound as variables are not reported.
VNX-JAVA-012 – Java LDAP Injection
Reports JNDI DirContext.search, Spring LdapTemplate search/find and LdapQueryBuilder filter, and UnboundID Filter.create/SearchRequest/search calls whose filter or base DN carries HTTP request data, directly or through up to five local assignments, or that concatenate a String method parameter into a filter or DN value. Parameterised {0} filters, encoded values and Spring filter objects are not reported.
VNX-JAVA-013 – Java XPath Injection
Reports XPath.evaluate/compile, dom4j selectNodes/selectSingleNode and Jaxen XPath constructors whose expression carries HTTP request data, or concatenates a String method parameter into a quoted value, directly or through a local built a few lines above. Variable-resolver expressions, encoded values and constants are not reported.
VNX-JAVA-014 – Java Zip Slip via ZipEntry getName()
Reports archive extraction code that builds an output path (new File, FileOutputStream, Paths.get, Path.resolve, Files.copy and similar) from a ZipEntry, JarEntry or Commons Compress entry name without a canonical-path or normalize-and-startsWith containment check.
VNX-JAVA-015 – Java JPQL/HQL Injection via String Concatenation
Reports EntityManager and Hibernate Session createQuery/createNativeQuery calls whose JPQL, HQL or SQL text carries HTTP request data, or concatenates a String method parameter into a value position, directly or through a local built a few lines above. Named and positional parameters, constants and entity names are not reported.
VNX-JAVA-016 – Java Weak PRNG (java.util.Random) Used for Security-Sensitive Value
Reports values drawn from java.util.Random, ThreadLocalRandom, Math.random or RandomStringUtils that are used as tokens, session IDs, nonces, passwords, salts, OTPs or keys. SecureRandom and non-secret uses such as jitter, shuffling and sampling are not reported.
VNX-JAVA-017 – Java HTTP Response Splitting via Unsanitised Header Value
Detects Java code that passes a request parameter, header, query string or path info (or a Spring @RequestParam, @PathVariable, @RequestHeader or @CookieValue argument) to HttpServletResponse.setHeader(), addHeader() or sendRedirect() without stripping CR and LF, enabling HTTP response splitting and header injection.
VNX-JAVA-019 – Java hardcoded cryptographic key literal
Detects symmetric and signing keys written into Java source: SecretKeySpec, PBEKeySpec, JJWT signWith/setSigningKey, auth0 Algorithm.HMAC* and Keys.hmacShaKeyFor given a string, decoded or byte-array literal, or a constant holding one. Keys embedded in source can be extracted from any copy of the binary.
VNX-JAVA-020 – Java static IV reuse in block cipher
Detects fixed initialization vectors and GCM nonces in Java: IvParameterSpec and GCMParameterSpec built from a literal, a constant byte array or string, or a zero-filled buffer that is never randomised. Reusing the same IV with the same key undermines the security of CBC, CTR, and GCM modes.
VNX-JAVA-021 – Java Sensitive Data Logged
Detects SLF4J, Log4j, java.util.logging and android.util.Log calls whose arguments pass a password, token, secret, API key or credential value, or a request parameter or header read by such a name (not just the word in the message text), exposing it in log files and monitoring systems.
VNX-JAVA-024 – Java XML Entity Expansion (Billion Laughs)
Detects DocumentBuilderFactory, SAXParserFactory, dom4j SAXReader, JDOM SAXBuilder and XMLInputFactory instances that never disable DOCTYPE declarations (or enable secure processing, or turn off SUPPORT_DTD), leaving the application open to XML entity expansion denial-of-service attacks.
VNX-JAVA-025 – Java Hardcoded Password or Credential
Detects passwords written into Java production source as string literals: password-named fields and variables, DriverManager.getConnection, setPassword, Properties keys, credential constructors, KeyStore passwords and backdoor equals() checks. Placeholders, property keys, labels and test code are not reported.
VNX-JAVA-026 – Java Spring File Serving Without Access Control
Detects Spring and servlet handlers that serve a file (FileSystemResource, UrlResource, PathResource, InputStreamResource, copyToByteArray, Files.readAllBytes/copy) whose path comes from a request value, when the handler makes no authorisation decision (no @PreAuthorize/@Secured, Principal, Authentication or owner check).
VNX-JAVA-027 – Java Spring Security Headers Disabled
Detects Spring Security configurations that disable all default security headers, X-Frame-Options, HSTS or X-Content-Type-Options, in the chained, lambda and method-reference DSL forms. xssProtection().disable(), sameOrigin()/deny() and test code are not reported.
VNX-JAVA-029 – XML External Entity (XXE) via DocumentBuilderFactory
Detects DocumentBuilderFactory, SAXParserFactory and XMLReaderFactory parsers that are never hardened (disallow-doctype-decl, external-general-entities false, secure processing or ACCESS_EXTERNAL_DTD), and external entities explicitly switched on. StAX, TransformerFactory and SchemaFactory are covered by VNX-JAVA-004.
VNX-JAVA-030 – Java Reflected Cross-Site Scripting
Reports Java code that writes servlet request data into an HTML response without output encoding: response.getWriter() and PrintWriter/JspWriter/ServletOutputStream writes, JSP scriptlet expressions and out.print, and values returned from Spring methods that produce text/html, unless the value passed through an HTML encoder, was parsed to a number, folded to a constant, or the response is not HTML.
VNX-JWT-001 – JWT Signature Verification Disabled
A JWT is accepted without its signature being checked: verify_signature False or verify=False (Python), jsonwebtoken decode() of a request token in a file that never verifies, jwt-simple noVerify, golang-jwt ParseUnverified alone, jjwt parse() after setSigningKey, Auth0 JWT.decode() alone, ruby-jwt JWT.decode(t, k, false), and .NET RequireSignedTokens = false or a pass-through SignatureValidator.
VNX-JWT-002 – JWT Token Signed Without Expiration
A JWT is issued with no expiry: jwt.sign / new SignJWT (JS/TS), jwt.encode (Python), Jwts.builder() / JWT.create() (Java), jwt.NewWithClaims (Go), JWT.encode (Ruby) and JWT::encode (PHP) where neither the call nor a payload, claims or options variable defined just above sets exp, expiresIn, setExpiration, withExpiresAt or ExpiresAt.
VNX-JWT-003 – JWT Signing with Hardcoded Secret
A JWT signing or verification key is a string literal: passed straight to jwt.sign/verify, express-jwt, jwt.encode/decode, JWT.encode/decode, JWT::encode, new Key(), jjwt signWith/setSigningKey, Algorithm.HMAC256, SignedString([]byte(...)) or SymmetricSecurityKey, assigned to a variable used as the key, or assigned to a JWT-named setting in code, .properties or YAML.
VNX-JWT-004 – JWT Algorithm Explicitly Set to 'none'
A JWT is signed with, or a verifier accepts, the 'none' algorithm: an algorithm/algorithms option naming 'none' or PyJWT algorithm=None (Python, JS/TS, Ruby), jose UnsecuredJWT, Auth0 Algorithm.none(), jjwt Jwts.parser().unsecured(), and golang-jwt SigningMethodNone or UnsafeAllowNoneSignatureType.
VNX-JWT-005 – Sensitive Credential Data Stored in JWT Payload
A password, password hash, secret, API key, SSN or card number is put into JWT claims: in the payload of jwt.sign / SignJWT, jwt.encode, JWT.encode, JWT::encode or jwt.NewWithClaims, in a payload variable built just above, in a jjwt .claim() / Auth0 .withClaim(), or as a json-tagged field of a Go struct embedding jwt.RegisteredClaims.
VNX-JWT-006 – JWT Missing Audience or Issuer Verification
Audience or issuer validation is switched off (verify_aud/verify_iss False in Python, ValidateAudience/ValidateIssuer = false in C#), or a token is verified against an identity provider's shared JWKS with no audience check in the file (jsonwebtoken, jose, express-jwt, Auth0 java-jwt, Spring Security NimbusJwtDecoder/JwtDecoders, golang-jwt).
VNX-KOTLIN-001 – Kotlin ECB Cipher Mode
Detects Kotlin Cipher.getInstance() calls that select ECB mode for any block cipher (AES, DES, DESede, Blowfish and others): an X/ECB transformation, a bare block-cipher name whose provider default is ECB, a template or concatenation with ECB in the mode position, or a constant holding one of those. RSA/ECB is not reported.
VNX-KOTLIN-002 – Kotlin RSA Key Smaller Than 2048 Bits
Detects RSA, DSA and Diffie-Hellman key pairs and DSA/DH domain parameters generated with fewer than 2048 bits in Kotlin: KeyPairGenerator.initialize(), AlgorithmParameterGenerator.init(), RSAKeyGenParameterSpec, Android keystore setKeySize() and Bouncy Castle RSAKeyGenerationParameters.
VNX-KOTLIN-003 – Kotlin Cookie Missing HttpOnly Flag
Detects Kotlin session and credential cookies sent without HttpOnly (servlet, Spring ResponseCookie, Ktor, Javalin, http4k, Micronaut, raw Set-Cookie headers) and HttpOnly explicitly disabled, so injected scripts cannot steal them.
VNX-KOTLIN-005 – Kotlin MD5 or SHA-1 Used as Cryptographic Hash
Detects MD5, SHA-1, MD2 and MD4 hashing in Kotlin through MessageDigest, Signature, Apache Commons DigestUtils, Guava Hashing, Spring Security MD4/MD5/SHA-1 password encoders and (for credentials) Okio, excluding HMAC, SHA1PRNG, the WebSocket handshake digest and Content-MD5 transfer checksums.
VNX-LLM-001 – LLM Prompt Injection via User-Controlled Input
Reports user input read from an HTTP request, or a variable named as user input, spliced into the instruction text of an LLM prompt (f-string, template literal, concatenation, format), letting the user override the instructions.
VNX-LLM-002 – LLM Output Passed to Code Execution (RCE)
Reports LLM response text, read directly or through up to two assignments, passed to eval(), exec(), os.system(), subprocess, or JavaScript eval/new Function/vm/child_process exec, enabling code execution through prompt injection.
VNX-LLM-004 – User Input Directly in LLM System Prompt
Reports user input read from an HTTP request, or a variable named as user data, interpolated into an LLM system prompt (system role, system= argument, SystemMessage, PromptTemplate.from_template, a system prompt builder).
VNX-LLM-005 – LangChain Arbitrary Code Execution Tool
Reports LangChain code and shell execution capabilities given to an agent (PythonREPLTool, PythonAstREPLTool, ShellTool, BashProcess, create_python_agent, LLMMathChain, PALChain, load_tools python_repl/terminal, allow_dangerous_code=True).
VNX-LLM-006 – LLM Output Interpolated into SQL Query
Reports LLM response text, read directly or through up to two assignments, executed as SQL or interpolated into a query at execute(), text(), raw(), read_sql() or SQLDatabase.run().
VNX-NODE-001 – Missing npm Lock File
A package.json that declares dependencies has no committed lock file (package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, bun.lock, deno.lock) in its directory or a workspace root, so installs re-resolve floating ranges.
VNX-NODE-007 – Node.js SQL Injection
Reports SQL built with template-literal interpolation or concatenation (directly or via a nearby variable) passed to mysql, pg, sequelize, knex raw, TypeORM where conditions, Prisma $queryRawUnsafe or sqlite calls.
VNX-NODE-008 – Node.js Open Redirect
Reports redirects (res.redirect, ctx.redirect, reply.redirect, NextResponse.redirect, res.location, Location headers, window.location) whose target starts with request-controlled data and is not validated.
VNX-NODE-009 – Node.js Server-Side Request Forgery
Reports a server-side HTTP request (fetch, axios, http(s).get/request, got, needle, superagent, undici, request, or curl/wget run as a subprocess) whose destination URL or host comes from req.query/body/params/headers/cookies or Koa ctx, directly or through a variable assigned from one. Fixed-host URLs and allowlisted destinations are not reported, and a request whose response is relayed back to the client is reported by VNX-441 instead.
VNX-NODE-010 – Node.js Path Traversal
Reports an fs/fs.promises/fs-extra call or res.sendFile/res.download whose path argument comes from req.query/params/body/url, Koa ctx or a handler that destructures its request ({ params }), directly or through a variable assigned from one (path.join included). Paths reduced with path.basename, checked with startsWith or an anchored regex, and sendFile with a root option are not reported.
VNX-NODE-011 – Node.js Server-Side Template Injection
Reports a template engine (ejs, pug/jade, Handlebars, nunjucks, lodash _.template, doT, Mustache, Eta, Squirrelly, swig) compiling or rendering a template source taken from req.query/body/params or Koa ctx, directly or through a variable or a concatenation built from one. User data passed as the render context is not reported.
VNX-NODE-012 – Client-Side XSS via innerHTML or v-html
Reports raw HTML written into the DOM by jQuery .html(), Vue v-html and Svelte {@html}, and by insertAdjacentHTML, document.write and dangerouslySetInnerHTML in HTML pages and components, from a DOM source, from markup spliced together with a non-literal, or from response data. innerHTML assignments are VNX-NODE-027's; the other sinks in JavaScript files are VNX-NODE-005's.
VNX-NODE-014 – NoSQL Injection in MongoDB
Reports a MongoDB query filter (find, findOne, update*, delete*, count, aggregate...) taken from req.query/body or Koa ctx, as the whole filter or as a member value, or a $where clause built from any request value. Cast or $eq-wrapped values, sanitised input, findById and SQL ORM where: filters are not reported.
VNX-NODE-018 – JWT Decoded Without Signature Verification
Reports jsonwebtoken decode() in a file that never calls verify(), and a jsonwebtoken algorithms list containing 'none'. Not reported: decode-then-verify, a token the server issued itself, the browser jwt-decode package, jwt-simple, tests and comments.
VNX-NODE-019 – Hardcoded JWT or Session Secret
Reports a string literal used as the key of jwt.sign/verify, session/JWT middleware, cookieParser, Koa/cookie-session keys or createHmac, directly or through a constant, and literal jwtSecret/sessionSecret-style config values. Not reported: env or config lookups, env fallbacks, tests, examples/ and comments.
VNX-NODE-020 – Deprecated crypto.createCipher/createDecipher Without IV
Reports Node crypto.createCipher()/createDecipher() through crypto or any name bound to the crypto module, inline require('crypto') or a named import. Not reported: createCipheriv/createDecipheriv, node-forge's createCipher, same-named methods, comments and strings.
VNX-NODE-021 – XXE via libxmljs with noent:true
Reports noent: true (inline, across lines or in an options object) in files using libxmljs/libxmljs2, and libxml2-wasm's XML_PARSE_NOENT flag. Not reported: noent false or omitted, a noent key in files without libxml, a bare import, comments and strings.
VNX-NODE-022 – Shell injection via shelljs exec()
Reports shelljs exec() whose command carries an Express/Koa/Lambda request value, directly or through variables assigned from one. Not reported: constant or program-built commands (release scripts), other shelljs commands, RegExp.exec, child_process (VNX-NODE-003), comments and strings.
VNX-NODE-023 – Unsafe YAML.load() with untrusted input
Reports js-yaml 3 load()/loadAll() of request data or an uploaded file without a safe schema, and load() with DEFAULT_FULL_SCHEMA. Not reported: safeLoad, safe schemas, the program's own files, projects on js-yaml 4+, the yaml package, comments and strings.
VNX-NODE-024 – postMessage without origin validation (CSWSH/XSS)
Reports window 'message' handlers (inline or a named function in the same file) that never read event.origin or event.source, and postMessage(data, '*') to another window. Not reported: worker, WebSocket and port listeners, posts to the page's own window, explicit target origins, comments and strings.
VNX-NODE-031 – Logging of sensitive data
Reports console, logger (winston, pino, bunyan) and debug-package calls that pass a variable or property named as a password, secret, token, API key, credential, authorization header, CVV, SSN or card number; words in the message text alone are not reported.
VNX-PHP-002 – Dangerous Function in PHP
Detect a request value ($_GET, $_POST, $_COOKIE, php://input, Laravel request accessors) reaching exec(), system(), passthru(), shell_exec(), popen(), proc_open(), pcntl_exec(), the backtick operator or eval() without escapeshellarg() or validation.
VNX-PHP-005 – PHP Server-Side Request Forgery
Detect file_get_contents(), fopen(), copy(), image readers, curl_init(), CURLOPT_URL, get_headers(), fsockopen(), wp_remote_get(), Laravel Http and Guzzle client calls whose URL is decided by a request value, enabling SSRF.
VNX-PHP-009 – PHP preg_replace() with /e Modifier
Detects preg_replace() and preg_filter() calls whose pattern literal (inline, split across lines, in an array of patterns, or in a variable assigned just above) carries the e modifier, which evaluates the replacement as PHP code. preg_replace_callback(), patterns without e and the call inside a comment or string are not reported.
VNX-PHP-010 – PHP Type Juggling in Comparison
Detects loose comparisons (==, !=, <>) that decide an authentication or integrity check: a hash result compared with a variable or a 0e literal, user input compared with a non-literal secret value, and strcmp() of user input tested with == 0 or negation. Strict comparisons, hash_equals(), password_verify() and input compared with a constant are not reported.
VNX-PHP-011 – PHP SQL injection via string concatenation
Detects request input concatenated or interpolated into SQL text passed to mysql(i)_query(), pg_query(), PDO/mysqli/SQLite3 query/exec/prepare, WordPress $wpdb->get_results()/get_row()/get_var() and Laravel DB::select/whereRaw-style calls, inline, through a variable or through a query string built from one. Bound parameters, escaped or integer-cast values, digit-validated values and single-quoted literals are not reported.
VNX-PHP-012 – PHP reflected XSS via echo/print of user input
Detects request input written into the response without HTML encoding: echo, print, <?= ?>, printf() and die()/exit() of a superglobal or a variable read from one, an HTML fragment built with such a value (the $html .= pattern), and an echoed heredoc that interpolates one. Values passed through htmlspecialchars(), htmlentities(), (int) or json_encode() are not reported.
VNX-PHP-013 – PHP XXE via LIBXML_NOENT or LIBXML_DTDLOAD flag
Detects XML parsing configured for entity expansion: simplexml_load_*(), new SimpleXMLElement(), DOMDocument load/loadXML and XMLReader open/xml with LIBXML_NOENT or LIBXML_DTDLOAD (inline, across lines or via a flags variable), substituteEntities/resolveExternals set to true, XMLReader SUBST_ENTITIES/LOADDTD enabled, and libxml_disable_entity_loader(false).
VNX-PHP-016 – PHP weak hash function (md5/sha1)
A password is hashed with MD5 or SHA-1, fast unsalted digests that GPUs and rainbow tables reverse in bulk. Reported: md5(), sha1(), hash('md5'|'sha1'|'md4'|'md2', ...) and MD5-crypt (crypt() with a '$1$' salt) when an argument names a password (a variable, property or array key such as $pass, $pass_new, $password, $userPassword, $pwd, $_POST['password'], $input['passwd']) or when the result is assigned to one ($user->password = md5(...), $hashedPassword = sha1(...), 'password' => md5(...)). Not reported: password_hash()/password_verify(), md5/sha1 of non-credential data (cache keys, ETags, checksums, md5_file(), the SHA-1 prefix sent to the Have I Been Pwned range API), hash('sha256', ...) (a fast hash for passwords is still weak but outside this rule), a digest of nothing but a random generator stored under a password name (substr(md5(rand()), 0, 8) generating a temporary password), password-reset tokens, lookalike names such as $bypass, and the call inside a comment or a string literal. A password passed straight into md5()/sha1()/hash('md5'|'sha1', ...) ($pass = md5($pass), md5($_POST['password']), sha1($salt . $password)) is reported by VNX-CRYPTO-007, a password hashed with a fast hash, and not here; this rule keeps the PHP shapes that rule does not read: MD5-crypt, hash('md4'|'md2'), and a digest stored under a password name ($user->password = md5($input['secret']), 'password' => md5(...)). Other MD5/SHA-1 uses are reported by VNX-327, VNX-CRYPTO-001 and VNX-CRYPTO-002.
VNX-PHP-018 – PHP sensitive debug output disclosure
Detects var_dump(), print_r(), var_export(), debug_zval_dump(), dump() or dd() writing a whole $_SESSION, $_SERVER, $_ENV, $_COOKIE, $GLOBALS or getenv() to the response, including echoed return-mode print_r()/var_export() (also through a variable echoed later); single elements, logging and tests are not reported.
VNX-PHP-019 – PHP insecure cipher mode (AES-CBC)
Detects openssl_encrypt()/openssl_decrypt() with an AES/ARIA/Camellia CBC method (literal, variable, class constant or define()) and mcrypt CBC calls in files that compute no MAC (hash_hmac(), HASH_HMAC, sodium_crypto_auth()), leaving ciphertext open to bit flipping and padding oracles.
VNX-PHP-020 – PHP curl SSL certificate verification disabled
Detects disabled TLS verification in PHP HTTP clients: CURLOPT_SSL_VERIFYPEER/VERIFYHOST set to false, 0 or '', Guzzle 'verify' => false or RequestOptions::VERIFY => false, Laravel Http::withoutVerifying() and stream context 'verify_peer' => false, outside tests.
VNX-PHP-022 – PHP open redirect via non-literal redirect destination
Detects Laravel/CodeIgniter redirect(), redirect()->to()/away(), Redirect::to()/away(), Symfony $this->redirect() and RedirectResponse whose destination starts with a request value, inline or via a nearby variable, unless a literal prefix pins the host or path or the value is validated. Raw Location headers and wp_redirect() are reported by VNX-PHP-004.
VNX-PHP-025 – PHP deprecated mcrypt encryption functions
Reports calls to the PHP mcrypt functions that encrypt, decrypt or set up a cipher (mcrypt_encrypt/decrypt, mcrypt_cbc/cfb/ecb/ofb, mcrypt_module_open, mcrypt_generic, mdecrypt_generic, mcrypt_create_iv), directly or through call_user_func. Sizing and teardown helpers, same-named methods, polyfill definitions and mentions in strings or comments are not reported.
VNX-PHP-026 – PHP session poisoning via user-controlled session key
Reports session writes whose key comes from the request: $_SESSION[$_GET[...]] = ..., a variable or foreach key read from a superglobal or $request and then used as a $_SESSION key or a Session::put/session()->put/$session->set/set_userdata key, and whole request arrays merged into $_SESSION. Fixed or prefixed keys, nested keys under a fixed outer key, reads, and allowlist-checked keys are not reported.
VNX-PY-003 – Insecure Deserialization with pickle
Detect pickle-format deserialization (pickle, cPickle, _pickle, dill, cloudpickle load/loads/Unpickler, including aliases and imported names, and unsafe jsonpickle.decode), which executes code embedded in the data.
VNX-PY-005 – Weak PRNG for Security Operations
Detect values from Python's random module assigned to, passed as or returned from security-named values (passwords, tokens, nonces, salts, OTPs, session ids), where the secrets module is required.
VNX-PY-008 – Flask Debug Mode Enabled
Detect the Werkzeug interactive debugger switched on in Flask code (app.run(debug=True), app.debug = True, config DEBUG = True, run_simple(use_debugger=True), DebuggedApplication(evalex=True)), which allows remote code execution through the debugger console.
VNX-PY-009 – Jinja2 Autoescape Disabled
Detect Jinja2, Flask and Django template configuration that turns autoescaping off (autoescape=False, an Environment with no autoescape in web code, or {% autoescape false %}), which renders user-supplied template variables without HTML escaping and enables cross-site scripting.
VNX-PY-010 – SSL Certificate Verification Disabled in requests
Detect TLS certificate verification turned off in requests or httpx: verify=False on a request call or on an httpx Client, AsyncClient or HTTPTransport (multi-line calls too), and session.verify = False, outside tests, strings, docstrings and comments.
VNX-PY-011 – Python SQL Injection
Detect SQL text built with an f-string, % formatting, .format() or + from a variable and passed to execute(), asyncpg fetch(), pandas read_sql(), Django raw()/extra()/RawSQL or SQLAlchemy text(), directly or through a variable assigned a few lines above.
VNX-PY-012 – Server-Side Template Injection (SSTI)
Detect request data (directly, through an assignment, a route parameter or a formatted string) used as the template source of render_template_string(), from_string() or a Jinja2, Mako, Django or Tornado Template(), which lets an attacker run template code on the server.
VNX-PY-015 – Python ReDoS via User-Controlled Regex
Detect request data (Flask, Django, DRF or a Flask/FastAPI route parameter) used as the pattern of re or regex compile, match, search, findall, sub or split without re.escape(), which lets an attacker submit a catastrophically backtracking pattern (ReDoS).
VNX-PY-016 – Django Mass Assignment via Request Data Unpacking
Detect Python web code that writes the whole request body to a model: **request.data into create/update, SQLAlchemy .values() or a model constructor, Query.update(request body), __dict__.update(request.json), an unguarded setattr loop over request keys, or a ModelSerializer/ModelForm with fields = '__all__'.
VNX-PY-017 – MD5 or SHA1 Used as Password Hash
A password is hashed with MD5 or SHA-1 in a .py file. Reported: hashlib.md5()/hashlib.sha1() (also through `import hashlib as h` and `from hashlib import md5, sha1 as x`), hashlib.new('md5'|'sha1', ...) and PyCryptodome MD5.new()/SHA1.new()/SHA.new() whose argument names a password (password, passwd, passphrase, pwd, pw, a request field keyed 'pass'/'password'), whose argument is a variable assigned from such a value in the 8 lines above, or an .update(password) on a hasher created by one of those calls in the 10 lines above; a call broken across lines is read on its next line. Both algorithms are fast and broken, so a dumped hash is cracked offline in hours; use argon2id, bcrypt, scrypt or PBKDF2 with a high iteration count. Not reported: MD5/SHA-1 of data that is not a password (cache keys, ETags, file checksums), a call with usedforsecurity=False (HTTP digest auth), hashing a password reset token, SHA-256 and the password KDFs, and the calls in comments or string literals. A password passed straight into the call (hashlib.md5(password.encode()), md5(password) after from hashlib import md5, hashlib.new('sha1', password)) is reported by VNX-CRYPTO-007, which covers the same weakness across more algorithms and languages, and not here; this rule keeps the Python shapes that rule does not read: a password reached through a variable assigned a few lines above, a request field read by key, PyCryptodome MD5.new()/SHA1.new(), and an .update(password) on a hasher created earlier.
VNX-PY-021 – Weak or Deprecated SSL/TLS Protocol Version
Detect Python code that selects or allows SSLv2, SSLv3, TLS 1.0 or TLS 1.1: ssl PROTOCOL_* and pyOpenSSL *_METHOD constants, minimum_version/maximum_version (or urllib3 ssl_minimum_version/ssl_maximum_version) set to an old TLSVersion, pyOpenSSL set_min_proto_version()/set_max_proto_version() given an old *_VERSION, and options &= ~OP_NO_*. PROTOCOL_SSLv23/TLS, TLSv1_2 constants, OP_NO_* disabling and comparisons are not reported.
VNX-PY-022 – SQL injection via joined SQL pieces in Python
Reports SQL assembled by joining a list of pieces, one of them built from a variable, and passed to execute(), executemany(), executescript(), Django objects.raw() or pandas read_sql(). SQL built in one expression is reported by VNX-PY-011.
VNX-RUBY-002 – eval() or system() in Ruby
Reports eval/instance_eval/class_eval/module_eval and shell-string system, exec, spawn, Kernel#open, IO.popen, backticks and %x() when request input reaches them directly or through a nearby variable, including system("sh", "-c", cmd); other argument-list forms, escaped input and constant-table lookups are not reported.
VNX-RUBY-003 – Insecure Deserialization in Ruby
Reports Marshal.load/restore, Oj.load in object mode, Oj.object_load, JSON.load and JSON.parse with create_additions when request input, a Base64-decoded blob, an HTTP body or a socket read reaches them; local files and round trips are not reported.
VNX-RUBY-004 – Ruby SQL Injection
Reports ActiveRecord query methods (where, order, select, group, pluck, find_by_sql, execute, select_all, ...) given SQL that interpolates, concatenates or formats request input, a variable assigned from it, or a parameter of the enclosing method or scope lambda, also on the line after the parenthesis, in an array or in Arel.sql; placeholders, hash conditions, to_i/quote values and allowlist-checked input are not reported.
VNX-RUBY-005 – Ruby XSS via html_safe or raw
Reports .html_safe, raw(), <%== %>, Haml != and Slim == applied to a model attribute, variable, method result or an interpolated string with a dynamic part, in Ruby, ERB, Haml and Slim; fixed literals, escaped values, translations and Rails helpers are not reported.
VNX-RUBY-007 – YAML.load() Insecure Deserialization
Reports YAML.load (and YAML::load), Psych.load, YAML.unsafe_load, load_stream, load_documents, load_file and unsafe_load_file when request input, an upload, a Base64-decoded blob or an HTTP body reaches them; safe_load, permitted_classes and the application's own files are not reported.
VNX-RUBY-008 – Open3 shell command built from request input
Reports Open3 pipeline, popen and capture calls in their single-string (shell) form when the command string interpolates, concatenates or formats request input, or is request input itself, including the sh -c argument form. Other argument-list forms, constants and Shellwords-escaped input are not reported.
VNX-RUBY-009 – Dynamic Method Dispatch via send with User-Controlled Method Name
Reports send, public_send, __send__ and try calls whose method name comes from params, request or cookies data, directly or through a variable assigned nearby, unless an allowlist check guards it.
VNX-RUST-002 – Rust unwrap May Panic
Reports .unwrap() or .expect() applied directly to parsing, deserialising or decoding a runtime value (str::parse, serde_json/toml from_str, String::from_utf8, base64/hex decode, Url::parse, Regex::new on a variable); literals, other unwraps and test code are not reported.
VNX-RUST-004 – Rust Command Injection via process::Command
Reports std/tokio process::Command that runs a shell (sh, bash, cmd, powershell) with -c//C/-Command and a non-literal command string, or whose program comes from a request extractor; constant shell commands and user input passed as a separate .arg() are not reported.
VNX-RUST-005 – panic!() or unwrap()/expect() in a Result-Returning Function
Reports panic!(), and .unwrap()/.expect() on a fallible I/O, parse, decode, database or await result, in the body of the function that directly encloses them when it returns Result (including io::Result, anyhow::Result and crate aliases); lock().unwrap(), literal parses, other return types and test code are not reported.
VNX-RUST-006 – Integer Truncation or Sign-Change Cast After Parsing
Reports a lossy `as` cast (narrowing, signed to unsigned, or unsigned to signed of the same width) of an integer just parsed or decoded from runtime data (parse::<T>(), from_str_radix, from_be_bytes, read_u32); widening casts, casts of values that were not decoded, and range-checked values are not reported.
VNX-RUST-007 – Integer Arithmetic Overflow Without Checked Arithmetic
Reports +, -, * and << on an integer just parsed or decoded from runtime data (parse::<T>(), from_str_radix, from_be_bytes, read_u32); checked/saturating/wrapping calls, values bounded by a comparison or min/clamp, and values that were not decoded are not reported.
VNX-RUST-008 – Path Traversal in Actix-web or Axum File-Serving Handler
Reports an axum or actix-web request value (Path/Query/Json/Form extractor, web::Path, match_info) that reaches .join, Path::new, File::open, std/tokio fs calls or NamedFile::open in the same handler; canonicalize+starts_with, '..' rejection, file_name() and integer extractors are not reported.
VNX-SEC-001 – AWS Access Key ID
Reports a hard-coded AWS access key ID (AKIA, ASIA, ABIA, ACCA or A3T prefix plus 16 base32 characters), excluding AWS's documented EXAMPLE keys, placeholders, detector patterns and test files.
VNX-SEC-002 – Private Key Committed
Reports a committed PEM private key (RSA, EC, DSA, OpenSSH or PKCS#8) whose armour line is followed by real base64 key material, excluding code that builds or strips the armour, placeholders, public keys, prose examples and test certificates.
VNX-SEC-003 – AWS Secret Access Key
Reports a hard-coded, high-entropy 40-character AWS secret access key assigned to an AWS secret-key name, a Terraform AWS secret_key, Go's NewStaticCredentials, or an SDK credentials constructor (Java, .NET, Ruby, PHP), excluding the documented example key, placeholders, hex digests, environment references and test files.
VNX-SEC-004 – GitHub or GitLab Token
Reports a hard-coded GitHub token (ghp_, gho_, ghu_, ghs_, ghr_, github_pat_) or GitLab access token (glpat-) in any file, excluding placeholders, truncated tokens, prefix checks, environment and CI-secret references and test files.
VNX-SEC-005 – GCP API Key
Reports a hard-coded Google Cloud, Maps or Firebase API key (AIza plus 35 URL-safe base64 characters) in any file, excluding placeholders, longer tokens, prefix checks, environment references and test files.
VNX-SEC-007 – Slack Token or Webhook
Reports a hard-coded Slack token (xoxb-, xoxp-, xoxa-, xoxo-, xoxr-, xoxs- with a numeric id) or incoming-webhook/workflow URL in any file, excluding Slack's documented example webhook, placeholders, configured base URLs, environment references and test files.
VNX-SEC-008 – Database Connection String with Credentials
Reports a database connection URL that embeds a literal password (PostgreSQL, MySQL, MongoDB, Redis, SQL Server, CockroachDB, JDBC password= parameters and Go MySQL DSNs), excluding interpolated and placeholder passwords, localhost databases, prose and example files, and test code.
VNX-SEC-010 – Package Registry Token
Detects npm access tokens (npm_ + 36 characters), PyPI and TestPyPI API tokens, literal auth tokens in .npmrc and .yarnrc.yml (npmAuthToken, npmAuthIdent) and literal .pypirc passwords, in any file outside tests; environment references and npm_config_* identifiers are not reported.
VNX-SEC-013 – Insecure Cookie Configuration
Detects cookies whose HttpOnly or Secure protection is switched off, and session or authentication cookies issued without HttpOnly, across Node, Python, Go, Java, .NET, PHP and Ruby.
VNX-SEC-014 – Hardcoded Password in Variable
Detects a literal password assigned to a variable, field, key or keyword argument named password, passwd, passphrase, secret_key or *_pwd, passed to a password setter, PHP define() or an XML property, or written as a bare value in a config file or docker-compose environment list, outside tests, templates and placeholders.
VNX-SEC-015 – JWT Algorithm None Attack
Detects JWTs issued unsigned or accepted as unsigned: the none algorithm among the allowed or signing algorithms, an alg none header, and unsigned-token APIs (jjwt unsecured() and parseClaimsJwt, PlainJWT, UnsecuredJWT, SigningMethodNone). Signature verification switched off for a signed token is reported by VNX-JWT-001.
VNX-SEC-016 – TLS Verification Disabled in Shell Command
Detects commands and tool settings that disable TLS certificate verification: curl -k/--insecure, wget --no-check-certificate, git sslVerify false, GIT_SSL_NO_VERIFY, NODE_TLS_REJECT_UNAUTHORIZED=0, npm strict-ssl false, pip --trusted-host, kubectl --insecure-skip-tls-verify (and kubeconfig insecure-skip-tls-verify: true), Ansible validate_certs: no and PowerShell -SkipCertificateCheck.
VNX-SEC-017 – Plaintext Protocol URL
Reports redis://, amqp://, ftp://, telnet:// and ldap:// connection URLs that point at a remote host or carry a password, which send credentials and data in cleartext. Loopback, placeholder and credential-free compose service hosts, TLS schemes, comments and tests are not reported.
VNX-SEC-018 – AI Provider API Key
Reports hardcoded Anthropic (sk-ant-), OpenAI project/service-account/admin (sk-proj-, sk-svcacct-, sk-admin-) and Hugging Face (hf_) API keys of full length and real-key entropy. Placeholders, environment lookups, prefix checks and test paths are not reported.
VNX-SEC-019 – GCP Service Account Key
Reports a committed Google Cloud service account key: a private_key PEM with a real body near type service_account, in JSON, escaped JSON, YAML, TOML or an object literal. Code that only reads or type-checks a key file, placeholder keys and test paths are not reported.
VNX-SEC-020 – GitLab Access Token
Reports hardcoded GitLab tokens (glpat-, gldt-, glrt-, glrtr-, glcbt-, gloas-, glptt-, glagent-, glft-, glimt-, glffct-, glsoat-) with real-token entropy. CI variable references, prefix and regex validation code, placeholders and test paths are not reported.
VNX-SEC-022 – Sensitive Data in Log Statement
Reports logging and print calls across 14 languages whose arguments carry a password, secret, API key, private key or access/refresh token value. Message text alone, descriptive names, masked or hashed values and presence checks are not reported.
VNX-SEC-023 – GitHub Actions Expression Injection
Reports attacker-controlled github.event data (PR title/body/head ref, issue and comment bodies, commit messages and authors, toJSON of the event) expanded with ${{ }} inside a run: or script: block of a workflow or composite action. env: indirection, with: inputs, if: conditions and safe contexts are not reported.
VNX-SEC-024 – OAuth Token Stored in localStorage
Detects JavaScript/TypeScript (including script in .vue, .svelte and .html files) that writes an access token, refresh token, ID token, JWT or API key into localStorage, where any script on the origin, including an XSS payload, can read it.
VNX-SEC-025 – Azure Storage Account Key Hardcoded
Detect Azure Storage account keys (88-character base64 values) hardcoded next to a storage-key name, an AccountKey= connection-string segment, an access_key/ARM_ACCESS_KEY setting, the az --account-key flag, a shared-key credential constructor or a Blob/Queue/Table/Share service client, without flagging the public Azurite key or unrelated base64 hashes.
VNX-SEC-028 – npm Access Token Hardcoded
Detect npm access tokens (npm_ followed by exactly 36 letters or digits) in any file, and legacy UUID auth tokens written literally in .npmrc, .yarnrc or .yarnrc.yml (or echoed into one as //registry/:_authToken=), ignoring ${NPM_TOKEN} references, npm_config_* names and placeholders.
VNX-SEC-036 – Heroku API Key
Reports a Heroku platform API key: a standalone v2 key (HRKU-AA followed by 58 characters), or a legacy UUID-format key assigned to a name that contains heroku and key, token or secret (HEROKU_API_KEY=..., heroku_api_token: ..., ENV['HEROKU_API_KEY'] ||= ...), or sent as a Bearer token on a line that calls api.heroku.com. A bare UUID without that context, placeholder or example UUIDs and test or fixture paths are not reported.
VNX-SEC-037 – HashiCorp Vault Token
Reports a HashiCorp Vault token: a standalone hvs. service token (24 or more base62 characters, so root and namespaced tokens are included), an hvb. batch token (138 to 300 characters), or a legacy s. service token (24 characters) only where it is assigned to a Vault token setting (VAULT_TOKEN=, vault_token:, X-Vault-Token:) or passed to vault login. A bare s.-prefixed word, a short hvs. run with no digit (a property access on a variable named hvs), a token = line inside a multi-line vault block, placeholders and test or fixture paths are not reported.
VNX-SEC-040 – GitLab Pipeline / Deploy / Runner / Agent Token
Reports a GitLab infrastructure token by its documented prefix and body shape: pipeline trigger (glptt- + 40 hex), deploy (gldt-), runner authentication (glrt-), runner registration (GR1348941), Kubernetes agent (glagent-), CI job (glcbt-), OAuth application secret (gloas-), incoming mail (glimt-), feature-flag client (glffct-), feed (glft-) and SCIM (glsoat-) tokens. A prefix without a token body of the right length, placeholders and test or fixture paths are not reported; glpat- access tokens are VNX-SEC-039.
VNX-SEC-061 – PostgreSQL Connection String with Credentials
Reports a PostgreSQL connection URL (postgres://, postgresql+driver://, jdbc:postgresql) that embeds a literal password, but not interpolated or default passwords, localhost servers, documentation or example files.
VNX-SEC-062 – MySQL Connection String with Credentials
Reports a MySQL or MariaDB connection URL (mysql://, mariadb://, mysql+driver://, jdbc:mysql) that embeds a literal password, but not interpolated or default passwords, localhost servers, documentation or example files.
VNX-SEC-064 – Redis Connection String with Credentials
Reports a Redis connection URL (redis://, rediss://, including the empty-user redis://:password@host form) that embeds a literal password, but not interpolated or default passwords, localhost servers, documentation or example files.
VNX-SEC-073 – URL with Embedded Credentials
Reports an http(s), ws(s), ftp(s) or sftp URL that embeds a literal user:password pair, excluding interpolated and placeholder passwords, loopback and example hosts, database schemes, docs and test files.
VNX-SEC-075 – WireGuard Private Key
Reports a literal WireGuard private or preshared key (a 32-byte base64 key) in a wg-quick configuration, or assigned to a private-key name in a WireGuard-related YAML, JSON, Nix, .env, NetworkManager, RouterOS, OpenWrt or Go file.
VNX-SEC-078 – Doppler API Token
Reports a whole Doppler personal token (dp.pt. and 43 characters) in any file, excluding service, CLI and service-account tokens, placeholders, truncated tokens, environment references and test files.
VNX-SEC-080 – GitHub OAuth / App / Refresh Token
Reports a whole GitHub OAuth (gho_), App user-to-server (ghu_), installation (ghs_) or refresh (ghr_) token in any file, excluding classic and fine-grained PATs, prefix lists, truncated tokens, placeholders and test files.
VNX-SWIFT-001 – Swift Hardcoded API Key or Secret in Source
Detects passwords, API keys, client secrets, tokens and private keys given as string literals in Swift declarations, assignments, argument labels, dictionaries and HTTP header values, password comparisons with a literal, and Bearer/Basic Authorization literals; placeholders, lookup keys, identifier and path constants, interpolated strings and test files are not reported.
VNX-SWIFT-002 – Swift NSLog with Potentially Sensitive Data
Detects a password, token, secret, API key or credential value passed to or interpolated into NSLog, print, debugPrint, dump or CocoaLumberjack DDLog*, logged by os_log with %{public}, or interpolated into os.Logger with privacy: .public.
VNX-SWIFT-003 – Swift Insecure Data Storage via UserDefaults for Sensitive Values
Detects a password, token, secret, API key, PIN or other credential written to UserDefaults/NSUserDefaults (set, setValue, setObject) or kept in a SwiftUI @AppStorage property, both of which store an unencrypted plist.
VNX-SWIFT-004 – Swift TLS Certificate Validation Disabled in URLSession or Alamofire
Detects Swift code that accepts a server certificate without validating it: URLCredential(trust:) built without evaluating or pinning the trust, Alamofire DisabledTrustEvaluator/.disableEvaluation, kCFStreamSSLValidatesCertificateChain false, setAllowsAnyHTTPSCertificate, Starscream disableSSLCertValidation/allowSelfSigned, and a Network.framework verify block that always completes true.
VNX-SWIFT-006 – Swift Non-Cryptographic PRNG Used for a Security Value
Detects the libc rand/random/drand48 family and GameplayKit random sources (directly or through a source variable) used to produce a token, nonce, salt, key, IV, PIN, OTP or password in Swift; arc4random, SystemRandomNumberGenerator and .random(in:) are CSPRNG-backed on Apple platforms and are not reported.
VNX-TF-005 – Terraform AWS EBS Volume Unencrypted
Detect EBS volumes in Terraform created without encryption at rest: encrypted = false on volumes, snapshot copies, instance block devices and launch templates, or an aws_ebs_volume that sets neither encrypted nor snapshot_id, unless the account enables EBS encryption by default.
VNX-TF-008 – Terraform AWS Provider with Hardcoded Static Credentials
Detect literal AWS access key ids (AKIA/ASIA) and 40-character secret keys hardcoded in Terraform provider blocks, s3 backends, .tfvars files, function environment maps and ECS name/value environment entries, which expose IAM credentials to anyone who can read the repository or its history.