Reference

Detection rules

The catalog of detection rules the engine ships. Two kinds exist: built-in rules compiled into the engine, and data packs — declarative JSON rules loaded through the same matcher pipeline. This page lists them with their ids, severities, and what triggers each. The authoritative, always-current list for any build is rutken <target> rules --list-rules.

Severity, confidence & findings

42
Android rules
23
Linux / ELF
24
Windows PE
15
.NET managed
15
iOS / Mach-O
21
Container
12
Data-pack rules

Every rule emits findings. A finding carries a deterministic id (stable across runs), the rule_id, a title, a severity, a confidence, a description, evidence strings, a standards taxonomy, an optional proof/witness chain, and an optional location (class / method / instruction offset, or a bundled artifact / native symbol / container layer).

Severity (rank low to high): Info, Low, Medium, High, Critical. Confidence: Low, Medium, High (hand-assigned per rule, not scored). Some rules grade severity per finding rather than fixing one default.

For reporting, findings are faceted into display categories keyed off their CWE — Injection, Secrets, Components, Crypto, Transport, Dependencies, Other. Each finding also carries a standards taxonomy with up to five id lists: CWE, MASVS (Android), CIS, SSDF, and SLSA.

A few rules are opt-in by analysis mode, not by licence: the three apk-signature-* rules require --verify-signature; the interprocedural passes for taint-reaches-sink and weak-crypto-algorithm require --interprocedural. No individual rule is paywalled.

Android rules

Crypto

Rule idSeverityTriggers when
weak-crypto-algorithmHighA broken/risky cipher or digest (DES, RC4, MD5, ECB, RSA without OAEP) resolved at a JCE call site.
hardcoded-crypto-keyHighA literal byte array flows into SecretKeySpec.<init>.
static-initialization-vectorMed/HighA literal IV byte array flows into IvParameterSpec.<init> alongside CBC.
insecure-random-for-cryptoMed/Highjava.util.Random / Math.random() used alongside crypto key/IV/nonce material.

Network & TLS

Rule idSeverityTriggers when
cleartext-traffic-permittedMediumCleartext HTTP permitted (explicit flag, or inferred from targetSdk<28).
network-security-config-insecureMediumNSC XML permits cleartext or trusts user-installed CAs outside debug.
insecure-trust-managerHighX509TrustManager.checkServerTrusted is an empty no-op (accepts every chain).
permissive-hostname-verifierHighHostnameVerifier.verify unconditionally returns true.
webview-ssl-error-proceedHighonReceivedSslError always calls proceed(), never cancel().
android-legacy-ssl-context-protocolMediumSSLContext.getInstance requests SSLv3 / TLSv1 / TLSv1.1 etc.

WebView

Rule idSeverityTriggers when
webview-javascript-bridgeHighaddJavascriptInterface exposes a Java object to page JS.
webview-insecure-file-accessHigh/MedsetAllowUniversalAccessFromFileURLs / setAllowFileAccessFromFileURLs enabled.
webview-mixed-content-allowedMediumsetMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW).
webview-contents-debugging-enabledMediumsetWebContentsDebuggingEnabled(true).

Manifest, permissions & config

Rule idSeverityTriggers when
android-debuggableMediumandroid:debuggable="true".
android-allow-backupLowADB/cloud backup allowed.
android-test-onlyInfoandroid:testOnly="true".
weak-custom-permissionMediumA custom permission with a weak protection level guards a component.
privileged-permission-requestedLowA high-impact permission from a small allowlist is requested.
min-sdk-below-supportedInfominSdk < 23 (below the runtime-permissions floor).

IPC & components

Rule idSeverityTriggers when
exported-component-no-permissionMed/LowAn exported component has no permission guard.
implicitly-exported-componentMediumA component is implicitly exported via an intent-filter (pre-API-31 default).
exported-activity-echoes-caller-intentMediumExported Activity returns the caller's own Intent via setResult(int, getIntent()).
implicit-intent-carries-extrasMediumAn implicit Intent carrying extras is broadcast / started.
provider-grant-uri-permissionsMediumAn exported provider grants URI permissions.
file-provider-path-overly-broadMediumA FileProvider <paths> entry maps a filesystem root.
dynamic-receiver-registered-exportedMediumRuntime registerReceiver without export control on targetSdk<34.
clipboard-write-not-marked-sensitiveLowsetPrimaryClip without EXTRA_IS_SENSITIVE.

Injection & runtime code

Rule idSeverityTriggers when
command-injection-via-execHighUntrusted input reaches Runtime.exec / ProcessBuilder.
sql-injection-via-rawqueryHighUntrusted input (incl. EditText/TextView) reaches rawQuery / execSQL.
taint-reaches-sinkper-sinkGeneric taint-to-sensitive-sink flow; severity depends on the sink.
dynamic-code-loading-detectedLowA DexClassLoader / PathClassLoader is constructed.
xml-parser-dtd-not-disabledMediumAn XML parser is created without disabling DTD/external-entity processing.

Storage & secrets

Rule idSeverityTriggers when
keystore-or-cert-bundled-in-apkCrit/LowA private key / keystore (Critical) or plain certificate (Low) is bundled in the APK.
android-hardcoded-secretHigh/LowA server secret (PEM key, AWS AKIA, GitHub/Slack token, JWT) or a client API key is embedded.
world-readable-file-modeHigh/MedMODE_WORLD_READABLE / MODE_WORLD_WRITEABLE file mode.
firebase-database-endpointLowA *.firebaseio.com endpoint is referenced.

Attestation, auth & signature

Rule idSeverityTriggers when
deprecated-safetynet-attestationMediumThe deprecated SafetyNet Attestation API is called.
biometric-auth-without-cryptoobjectMediumBiometricPrompt.authenticate without a CryptoObject.
apk-signature-invalidCriticalSignature integrity check fails (requires --verify-signature).
apk-signature-untrustedHighSigner doesn't match an expected fingerprint (--verify-signature).
apk-signed-with-debug-certificateHighSigned with the public Android debug certificate (--verify-signature).

Linux / ELF rules

Binary-hardening and import-table checks over ELF binaries.

Rule idSeverityTriggers when
linux-executable-stackHighStack is executable (NX off).
linux-no-pieMediumNot a position-independent executable.
linux-relro-weakMed/LowRELRO absent or only partial.
linux-insecure-search-pathMed/LowInsecure RUNPATH/RPATH, or deprecated DT_RPATH present.
linux-writable-executable-segmentMediumA W+X segment.
linux-legacy-tls-protocolMediumOpenSSL SSLv2/SSLv3/TLSv1 method constructor imported.
linux-weak-crypto-cipherMediumA weak cipher function imported.
linux-no-stack-canary / linux-no-fortify-sourceLowNo stack-canary / no _FORTIFY_SOURCE imports.
linux-unsafe-string-function, linux-shell-execution, linux-path-searched-execLowUnsafe string / shell-invoking / PATH-searching exec functions imported.
linux-weak-hash, linux-insecure-randomLowWeak hash / non-crypto RNG imported.
linux-insecure-temp-file, linux-toctou-prone-apiLowRace-prone temp-file / TOCTOU access() imported.
linux-dynamic-library-loading, linux-privilege-management-apiLowRuntime dlopen / setuid-family imported.
linux-worldwritable-permission-api, linux-format-string-risk, linux-obsolete-network-apiLowchmod-family / syslog / gethostbyname imported.
linux-hardcoded-secret-stringLowA credential-shaped string in a non-executable section.
linux-linkage-not-analyzableInfoThe dynamic symbol table couldn't be recovered (e.g. static linking).

Windows PE & .NET rules

PE hardening & linkage

Rule idSeverityTriggers when
windows-no-depHighDEP/NX not enabled.
windows-no-aslr, windows-no-cfg, windows-no-safesehMediumASLR / Control Flow Guard / SafeSEH not effective.
windows-writable-executable-sectionMediumA W+X section.
windows-unsigned-or-unverifiableMediumNo embedded Authenticode signature.
windows-excessive-execution-levelMediumManifest requests requireAdministrator.
windows-manifest-highest-available, windows-no-high-entropy-aslr, windows-pdb-path-leakLowhighestAvailable manifest / no high-entropy ASLR / PDB path leaked.
windows-dll-hijack-riskMediumDLL-search-order hijack risk.
windows-insecure-crt-functiongradedUnsafe C-runtime functions imported.
windows-command-execution, windows-crypto-api-usage, windows-insecure-random, windows-dynamic-library-loading, windows-privilege-management-api, windows-obsolete-network-api, windows-insecure-temp-file, windows-toctou-prone-api, windows-worldwritable-permission-apiLowCorresponding risky Win32/CRT imports.
windows-hardcoded-secret-stringLowA credential-shaped string in a non-executable section.
windows-hardening-not-analyzable, windows-linkage-not-analyzableInfoA check couldn't run on this image.

.NET managed metadata

Rule idSeverityTriggers when
dotnet-weak-crypto-reference, dotnet-unsafe-deserialization, dotnet-allow-partially-trusted-callers, dotnet-insecure-json-deserializationMediumReference to a weak crypto type / unsafe deserializer / APTCA / polymorphic JSON type handling.
dotnet-no-strong-name, dotnet-dynamic-code-loading, dotnet-tls-validation-callback, dotnet-process-execution, dotnet-hardcoded-secret, dotnet-unverifiable-code, dotnet-xxe-risk, dotnet-dynamic-code-generationLowNot strong-named / dynamic assembly load / custom TLS callback / Process.Start / secret in #US heap / unsafe IL / XXE reader / Reflection.Emit.
dotnet-managed-assembly, dotnet-mixed-modeInfoA managed / mixed-mode assembly detected.

Windows PE support is actively maturing: the PE parser's tests are synthetic fixtures rather than a corpus of real Windows binaries, so treat PE results with less proof depth than the Android rules. See Maturity & coverage.

iOS / Mach-O rules

Rule idSeverityTriggers when
ios-ats-arbitrary-loadsHighApp Transport Security disabled for all connections (NSAllowsArbitraryLoads).
ios-entitlement-overbroadMediumA wildcard keychain-access-group / app-group entitlement.
ios-ats-exception-domain-declared, ios-url-scheme-declaredLowA per-domain ATS exception / a custom URL scheme declared.
ios-binary-not-pieMediumBinary is not position-independent.
ios-binary-weak-crypto-api, ios-binary-keychain-weak-accessibility, ios-binary-webview-bridgeMediumWeak crypto imported / weak Keychain accessibility / deprecated UIWebView or JS bridge.
ios-binary-no-stack-canary, ios-binary-arc-disabled, ios-binary-insecure-randomnessLowNo stack canary / no ARC helper / non-crypto RNG.
ios-binary-jailbreak-detection, and the *-not-analyzable rulesInfoJailbreak-detection code referenced / a check couldn't fully run.

Container rules

Misconfiguration, filesystem, build-history, secret, and Dockerfile checks over container images (a separate registry from the native rules).

Rule idSeverityTriggers when
container-writable-passwd-or-shadowCritical/etc/passwd or /etc/shadow is world-writable.
container-empty-password-accountCriticalA uid-0 account has an empty password hash.
container-layer-secret, container-deleted-layer-secretCriticalA credential-shaped file shipped in a (possibly deleted-later) layer.
container-root-user, container-credential-env, container-credential-labelHighRuns as root / credential-shaped env var or label baked in.
container-secret-in-image-history, container-curl-pipe-shell-in-historyHighSecret in build history / remote content piped into a shell during build.
container-dockerfile-missing-userHighDockerfile has no USER instruction.
container-broad-exposed-port, container-setuid-setgid-binary, container-world-writable-path, container-escaping-symlink, container-git-directory-shipped, container-broad-chmod-in-history, container-dockerfile-mutable-base-tagMediumSensitive exposed port / setuid binary / world-writable path / escaping symlink / .git shipped / broad chmod / unpinned base image.
container-missing-healthcheck, container-package-manager-cache, container-dockerfile-add-instead-of-copyLowNo HEALTHCHECK / package-manager cache left in / ADD where COPY would do.
container-package-coverage-gapInfoPart of the image couldn't be fully analysed.

A CIS Docker Benchmark framework is available via rutken image scan --framework cis-docker, and known vulnerable OS/language packages surface as sca-known-vulnerable-component from the SCA engine.

Data packs

Three first-party packs ship as declarative JSON (publisher rutken) and load through the same matcher pipeline — the same mechanism available to your own plugins.

high-risk-permissions

Rule idSeverityPermission
request-install-packagesMediumREQUEST_INSTALL_PACKAGES
system-alert-window-overlayMediumSYSTEM_ALERT_WINDOW
read-sms / receive-smsMediumREAD_SMS / RECEIVE_SMS
query-all-packagesLowQUERY_ALL_PACKAGES

runtime-code-execution

Rule idSeverityCall
runtime-execMediumRuntime.exec
process-builder-startMediumProcessBuilder.start
dex-classloaderMediumDexClassLoader.<init>

cloud-credentials

Rule idSeverityMatches
aws-access-key-idHighPrefix AKIA
slack-tokenHighPrefix xoxb-
stripe-live-secret-keyHighPrefix sk_live_
private-key-pemHighContains PRIVATE KEY-----

Maturity & coverage

Android is the flagship, deepest-tested surface. The native (Linux, Windows, iOS) and container rules are built and run in the engine's unit tests, but several do not yet have a witness in the internal vulnerable-app corpus — the engine tracks exactly which rules lack a corpus witness. Present non-Android results accordingly: the rule logic is there, but it has less real-world proof depth than the Android set, and the Windows PE parser in particular is validated against synthetic fixtures rather than real binaries.

Because this catalog is a snapshot, always confirm the live set for your build and platform:

rutken app.apk rules --list-rules
rutken app.apk rules --list-rules --platform android

Want a rule that isn't here? Write a plugin pack — the matcher grammar covers permissions, components, SDK levels, method calls, string constants, taint flows, and class-hierarchy relationships.