FiveM detection rules
66 rules across eight categories. Every rule has a unit test, a fixture that must trigger it and a fixture that must not. Rule set version 2026.02.1.
The distinction that matters: a lone PerformHttpRequest, a lone webhook and a lone load() are not findings. The combination, proven by a data-flow path, is a CRITICAL.
Remote code execution10 rules
- CRITICAL
Remote HTTP response is executed as Lua code
fxscan.rce.http-response-to-load· TITAN-RCE-LOADSTRING· lua
A value that originates from an HTTP response reaches a Lua code-execution primitive (load/loadstring). Whoever controls that endpoint controls the server: they can run arbitrary Lua at any time, without shipping a new version of the resource.
Recommendation: Never execute remotely fetched content. If the resource needs remote configuration, fetch data (JSON) instead of code, validate it against a schema, and act on the parsed values.
- CRITICAL
Untrusted input reaches loadstring()
fxscan.rce.loadstring-tainted· TITAN-RCE-LOADSTRING· lua
`loadstring` compiles a string into an executable Lua chunk. A value that the resource does not fully control reaches it, which means the string being compiled can be influenced from outside the resource.
Recommendation: Remove the loadstring call. If dynamic behaviour is genuinely required, replace it with a fixed table of allowed operations selected by a validated key.
- CRITICAL
Encoded payload is decoded and executed
fxscan.rce.encoded-payload-to-load· TITAN-OBF-BASE64-EXEC· lua, javascript, typescript, tsx
A value passes through a decoder (Base64, hex, character codes or XOR) before reaching a code-execution primitive. Decoding immediately before execution has no legitimate purpose - it exists to hide what the code does from a reviewer.
Recommendation: Treat this resource as compromised until the decoded payload has been reviewed. Decode the literal offline and inspect it before running the resource anywhere.
- HIGH
Code-execution primitive hidden behind an alias
fxscan.rce.aliased-execution-primitive· TITAN-RCE-LOADSTRING· lua, javascript, typescript, tsx
A code-execution function such as `load` or `eval` is assigned to another variable and called through that alias. This is a standard technique for defeating naive string searches for `load(`.
Recommendation: Remove the alias and call the primitive directly, or - preferably - remove the dynamic execution entirely so it can be reviewed statically.
- HIGH
Dynamic lookup of a global execution primitive
fxscan.rce.dynamic-global-lookup· TITAN-RCE-LOADSTRING· lua, javascript, typescript, tsx
The code reaches a dangerous global through a computed index such as `_G['load']` or `globalThis[name]`. Computed access exists precisely to keep the dangerous name out of the source text.
Recommendation: Replace computed global access with a direct reference, then review whether dynamic execution is needed at all.
- CRITICAL
Untrusted input reaches eval()
fxscan.rce.js-eval-tainted· TITAN-RCE-LOADSTRING· javascript, typescript, tsx
A value the resource does not control reaches `eval`. In a FiveM JavaScript resource this runs with the full privileges of the server runtime.
Recommendation: Delete the `eval` call. Parse data with `JSON.parse` and dispatch through an explicit map of allowed handlers.
- HIGH
Function constructor builds code at runtime
fxscan.rce.js-function-constructor· TITAN-RCE-LOADSTRING· javascript, typescript, tsx
`new Function(...)` compiles a string into a callable. When any part of that string is dynamic it is equivalent to `eval` and cannot be reviewed statically.
Recommendation: Replace the constructed function with a normal function. If behaviour must be selected at runtime, use a lookup table keyed by a validated identifier.
- HIGH
Timer callback given a string instead of a function
fxscan.rce.timer-string-execution· TITAN-RCE-LOADSTRING· javascript, typescript, tsx
`setTimeout`/`setInterval` accept a string, which is then evaluated exactly like `eval`. This form is never necessary and is frequently used to smuggle execution past reviewers.
Recommendation: Pass a function reference instead of a string.
- CRITICAL
Executed literal decodes to dangerous code
fxscan.rce.executed-literal-is-dangerous· TITAN-RCE-LOADSTRING· lua, javascript, typescript, tsx
A string literal handed to a code-execution primitive decodes into code that itself performs dangerous operations. The payload was decoded statically by the scanner and never executed.
Recommendation: Do not run this resource. Extract the decoded payload, review it, and treat the publisher as untrusted.
- CRITICAL
Script is downloaded and executed in the same flow
fxscan.rce.remote-script-fetch-and-run· TITAN-RCE-LOADSTRING· lua, javascript, typescript, tsx
The file both performs an outbound HTTP request and contains a code-execution primitive. Even when the scanner cannot prove the connection, this pairing is the classic remote-loader shape and warrants manual review.
Recommendation: Confirm whether the fetched content is executed. Ship code inside the resource instead of downloading it at runtime.
Command execution7 rules
- CRITICAL
Network event data is executed as a server command
fxscan.cmd.execute-from-network-event· lua, javascript, typescript, tsx
A value supplied by a client through a network event reaches `ExecuteCommand`. Any player able to trigger the event can run arbitrary server console commands, including granting themselves administrator rights.
Recommendation: Never pass event data into ExecuteCommand. Map the event to a fixed, hard-coded command and verify the caller with IsPlayerAceAllowed before running it.
- CRITICAL
HTTP response is executed as a server command
fxscan.cmd.execute-from-http-response· lua, javascript, typescript, tsx
Content fetched over HTTP reaches `ExecuteCommand`, which gives the remote endpoint console-level control over the server.
Recommendation: Remove the remote command channel. If remote administration is genuinely required, use a signed, allow-listed command set and verify the signature before acting.
- HIGH
Server command assembled from runtime values
fxscan.cmd.dynamically-built-command· lua, javascript, typescript, tsx
The string passed to `ExecuteCommand` is built by concatenation rather than written as a literal. Whatever feeds the concatenation effectively chooses which console command runs.
Recommendation: Build the command from a fixed template and inject only values that have been validated against an allow-list (for example a numeric player id).
- HIGH
Privileged console command runs without a permission check
fxscan.cmd.privileged-command-without-permission-check· lua, javascript, typescript, tsx
A privileged console command (ACE/principal management, resource control, server configuration) is executed without any recognisable permission check in the surrounding function.
Recommendation: Guard the call with IsPlayerAceAllowed (or your framework's equivalent) and fail closed when the check does not pass.
- HIGH
Privileged chat command registered without ACL restriction
fxscan.cmd.registered-command-without-acl· lua, javascript, typescript, tsx
`RegisterCommand` was called with the `restricted` flag set to false (or omitted) while the handler performs privileged actions. Every player on the server can invoke the command.
Recommendation: Pass `true` as the third argument to RegisterCommand and add a matching `add_ace` entry, or check permissions explicitly at the top of the handler.
- CRITICAL
Operating-system command execution
fxscan.cmd.operating-system-command· lua, javascript, typescript, tsx
The resource spawns operating-system processes (`os.execute`, `io.popen`, `child_process`). A FiveM resource has no legitimate reason to run shell commands on the host, and doing so escapes every FiveM-level sandbox.
Recommendation: Remove the process execution. If an external tool really is required, run it outside the game server and communicate over a restricted, authenticated API.
- CRITICAL
Chat command argument becomes a console command
fxscan.cmd.command-argument-to-execute· lua, javascript, typescript, tsx
Arguments typed by a player into a chat command are passed into `ExecuteCommand`, turning the chat command into a console proxy.
Recommendation: Never forward raw command arguments to ExecuteCommand. Validate and map them to a closed set of allowed operations.
Unsafe network events11 rules
- CRITICAL
Network event grants money using client-supplied values
fxscan.net.event-adds-money· lua, javascript, typescript, tsx
A server event handler credits money using a value that came from the client. A player can trigger the event directly and choose the amount.
Recommendation: Derive the amount on the server from server-side state. Never trust an amount sent by the client, and verify the player is entitled to the payout.
- CRITICAL
Network event grants inventory items using client-supplied values
fxscan.net.event-adds-item· lua, javascript, typescript, tsx
A server event handler adds inventory items using client-controlled item names or counts, allowing a player to spawn arbitrary items.
Recommendation: Look up the item and quantity on the server based on validated state. Reject item names that are not in an allow-list.
- HIGH
Network event grants weapons using client-supplied values
fxscan.net.event-grants-weapon· lua, javascript, typescript, tsx
A server event handler grants a weapon chosen by the client. Any player can call the event and arm themselves with anything.
Recommendation: Decide the weapon server-side and check that the player is allowed to receive it before granting.
- HIGH
Network event changes a player's job using client-supplied values
fxscan.net.event-changes-job· lua, javascript, typescript, tsx
A server event handler assigns a job or grade taken from the client payload, which lets a player promote themselves to any role, including jobs with administrative powers.
Recommendation: Validate the requested job against the player's eligibility on the server and reject anything else.
- CRITICAL
Network event changes a player's group or permission level
fxscan.net.event-changes-group· lua, javascript, typescript, tsx
A server event handler modifies the caller's permission group with data from the client. This is a direct privilege-escalation path to administrator.
Recommendation: Never change permission groups from a network event. Manage groups through the server console or an authenticated admin panel.
- HIGH
Network event writes to the database with client-supplied values
fxscan.net.event-writes-database· lua, javascript, typescript, tsx
A server event handler performs a database write using data that came from the client. Besides the obvious data-integrity problem, string-concatenated queries here are a SQL-injection vector.
Recommendation: Use parameterised queries, and derive the values being written from server-side state rather than the event payload.
- MEDIUM
Network event rebroadcasts client data to every player
fxscan.net.event-triggers-client-event-broadcast· lua, javascript, typescript, tsx
A server event handler forwards data received from one client to all clients. Anything a single player sends is therefore delivered to everyone, which is a reliable amplification and spoofing primitive.
Recommendation: Validate and normalise the payload on the server, and send only the fields the other clients actually need.
- HIGH
Numeric event payload is used without validation
fxscan.net.unvalidated-numeric-payload· lua, javascript, typescript, tsx
A server event handler uses one of its parameters in an arithmetic or quantity position without converting or range-checking it first. Negative values, fractions and NaN are the usual way money and item duplication bugs are triggered.
Recommendation: Convert the value with `tonumber`/`parseInt`, reject non-finite values, and enforce an explicit minimum and maximum before using it.
- HIGH
Privileged server event has no permission check
fxscan.net.missing-permission-check· lua, javascript, typescript, tsx
A server event handler performs privileged actions but contains no recognisable permission check. Network events can be triggered by any connected client, so an unguarded handler is effectively a public API.
Recommendation: Verify the caller at the top of the handler (IsPlayerAceAllowed, a framework permission helper, or an explicit group check) and return early when the check fails.
- HIGH
Client-supplied identifier is trusted instead of the event source
fxscan.net.client-supplied-identifier-trusted· lua, javascript, typescript, tsx
The handler uses a player identifier taken from the event payload rather than the implicit `source`. A client can send any identifier and act on behalf of another player.
Recommendation: Always use the implicit `source` for the caller's identity and ignore identifiers sent inside the payload.
- MEDIUM
Server event registered without RegisterNetEvent guard
fxscan.net.server-event-registered-on-client-channel· lua, javascript, typescript, tsx
An event handler was added with `AddEventHandler` but the event name was never passed to `RegisterNetEvent`/`RegisterServerEvent`, or the reverse. Mismatched registration commonly means the event is either unreachable or reachable by parties the author did not intend.
Recommendation: Register every network-facing event explicitly and keep the registration next to the handler so the intended trust boundary is obvious.
Exfiltration9 rules
- CRITICAL
Server license key is sent to an external endpoint
fxscan.exfil.license-key· lua, javascript, typescript, tsx
The resource reads the server license key (`sv_licenseKey`) and sends it off-server. The license key identifies and authenticates the server owner's Cfx account; leaking it allows impersonation of the server.
Recommendation: Remove the transmission entirely and rotate the license key in the Cfx portal. No third-party resource needs it.
- CRITICAL
Database connection string is sent to an external endpoint
fxscan.exfil.database-connection-string· lua, javascript, typescript, tsx
The database connection string - which contains the database host, user and password - is read and transmitted off-server.
Recommendation: Remove the transmission and rotate the database password immediately. Restrict the database user to the minimum required privileges.
- CRITICAL
Environment variables are sent to an external endpoint
fxscan.exfil.environment-variables· lua, javascript, typescript, tsx
Environment variables are read and transmitted off-server. They routinely hold API keys, database credentials and deployment secrets.
Recommendation: Remove the transmission and rotate every secret that the process environment exposes.
- CRITICAL
Server configuration file is read and transmitted
fxscan.exfil.server-configuration· lua, javascript, typescript, tsx
The resource reads `server.cfg` (or a similar configuration file) and sends it to an external endpoint. That file typically contains the license key, database credentials and administrator identifiers.
Recommendation: Remove the file read and the transmission, then rotate every credential stored in the configuration.
- HIGH
Local file content is uploaded to an external endpoint
fxscan.exfil.local-file-content· lua, javascript, typescript, tsx
File content read from disk is sent to a remote endpoint. Regardless of which file it is, this gives the endpoint owner a read primitive on the server filesystem.
Recommendation: Remove the upload. If telemetry is required, send aggregated metrics rather than raw file content, and document the destination.
- HIGH
Installed resource inventory is sent to an external endpoint
fxscan.exfil.resource-inventory· lua, javascript, typescript, tsx
The resource enumerates the other resources installed on the server and reports the list to a remote endpoint. This is reconnaissance: it tells an attacker exactly which known-vulnerable resources are present.
Recommendation: Remove the enumeration and the upload. A resource has no legitimate need to inventory its neighbours.
- HIGH
Player identifiers are sent to an external endpoint
fxscan.exfil.player-identifiers· lua, javascript, typescript, tsx
Player identifiers (Steam, license, Discord, IP) are collected and transmitted off-server. Besides the privacy implications, identifier lists are used to target players across servers.
Recommendation: Send only what your own systems need, to an endpoint you control and have documented for your players. Never forward identifiers to third-party endpoints.
- HIGH
Discord bot token is used in an outbound request
fxscan.exfil.discord-bot-token-transmitted· lua, javascript, typescript, tsx
A Discord bot token appears in this file and the file performs outbound HTTP requests. A leaked bot token grants full control of the bot, including every guild it is in.
Recommendation: Move the token to a server-side environment variable, keep it out of resource files, and regenerate it if the resource has ever been distributed.
- HIGH
Discord webhook receives sensitive server data
fxscan.exfil.webhook-with-sensitive-payload· lua, javascript, typescript, tsx
A Discord webhook URL is used in the same file that reads sensitive server state. Webhooks are the most common exfiltration channel in malicious FiveM resources because they need no authentication and blend into normal logging traffic.
Recommendation: Confirm the webhook belongs to you. Log only what you need, never credentials or identifiers you have not told your players about.
Persistence7 rules
- CRITICAL
Resource writes files into another resource
fxscan.persist.writes-to-other-resource· lua, javascript, typescript, tsx
`SaveResourceFile` is called with a resource name other than this resource. A resource writing into its neighbours is a backdoor installation primitive: removing the malicious resource no longer removes the payload.
Recommendation: Remove the write. Audit every resource named in these calls for files that do not belong to them, and compare the whole server against a known-good copy.
- CRITICAL
Resource writes to a FiveM manifest
fxscan.persist.manifest-modification· lua, javascript, typescript, tsx
The code writes to `fxmanifest.lua` or `__resource.lua`. Editing a manifest at runtime lets a payload register additional scripts that load on the next server start.
Recommendation: Remove the write and compare every manifest on the server against the version shipped by its author.
- CRITICAL
Resource writes to the server configuration
fxscan.persist.server-config-modification· lua, javascript, typescript, tsx
The code writes to `server.cfg` or a permissions configuration file. Appending an `add_principal` line there grants permanent administrator access that survives resource removal.
Recommendation: Remove the write, then diff your server configuration against a known-good copy and revoke any principal you did not add yourself.
- HIGH
Resource creates a new script file at runtime
fxscan.persist.creates-executable-script· lua, javascript, typescript, tsx
The resource writes a `.lua`, `.js` or `.ts` file at runtime. Newly created script files are loaded on the next resource start, which turns a one-off compromise into a permanent one.
Recommendation: Ship code as part of the resource instead of generating it. If templating is genuinely needed, write to a data file with a non-executable extension.
- CRITICAL
Downloaded content is written to disk
fxscan.persist.downloaded-payload-written-to-disk· lua, javascript, typescript, tsx
Content fetched over HTTP is written to the filesystem. Combined with FiveM's automatic loading of resource scripts, this is a complete remote-install channel.
Recommendation: Remove the download-and-write behaviour. Distribute updates through your normal deployment process where they can be reviewed.
- HIGH
Resource starts or stops other resources
fxscan.persist.controls-other-resources· lua, javascript, typescript, tsx
The resource calls `StartResource`/`StopResource` on resources other than itself. Stopping a security or anti-cheat resource is a standard first step for a payload; starting an unknown one is how a dropped backdoor gets activated.
Recommendation: Manage resource lifecycle from `server.cfg` or the console. If a dependency really must be started, restrict it to an explicit allow-list and log every call.
- CRITICAL
Resource grants a permanent ACE principal
fxscan.persist.grants-permanent-principal· lua, javascript, typescript, tsx
The code adds an ACE principal or ace permission at runtime. Granted principals persist for the lifetime of the server process and are frequently written to configuration so they survive restarts.
Recommendation: Remove the grant. Review `server.cfg` and the live ACE configuration for principals you did not create.
Hardcoded secrets7 rules
- CRITICAL
Discord bot token committed in source
fxscan.secret.discord-bot-token· lua, javascript, typescript, tsx, json, html, cfg, sql, other
A Discord bot token is embedded in the source. Anyone with a copy of this resource has full control of the bot, including every server it has joined.
Recommendation: Regenerate the token immediately and load it from a server-side convar or environment variable that is never shipped with the resource.
- LOW
Discord webhook URL embedded in source
fxscan.secret.discord-webhook· lua, javascript, typescript, tsx, json, html, cfg, sql, other
A Discord webhook URL is hard-coded. A webhook URL is a bearer credential: anyone who reads it can post to that channel, and can spam or flood it. On its own this is common practice rather than an attack, so it is reported at low severity unless other rules find sensitive data flowing into it.
Recommendation: Move the webhook URL into a convar or environment variable and rotate it if the resource has been shared publicly.
- HIGH
JSON Web Token embedded in source
fxscan.secret.jwt· lua, javascript, typescript, tsx, json, html, cfg, sql, other
A JSON Web Token is hard-coded. Tokens usually carry an identity and a set of permissions and remain valid until they expire or the signing key is rotated.
Recommendation: Remove the token, rotate the signing key, and issue tokens at runtime instead of shipping them.
- HIGH
Bearer token embedded in source
fxscan.secret.bearer-token· lua, javascript, typescript, tsx, json, html, cfg, sql, other
An HTTP bearer token is hard-coded. Bearer tokens grant access to whatever API they belong to with no additional proof of identity.
Recommendation: Rotate the token and read it from configuration at runtime rather than embedding it in the resource.
- CRITICAL
Database connection string embedded in source
fxscan.secret.database-connection-string· lua, javascript, typescript, tsx, json, html, cfg, sql, other
A database connection string with embedded credentials is hard-coded. Anyone with the resource can connect to the database directly, bypassing every check the server performs.
Recommendation: Move the connection string to a convar or environment variable, rotate the password, and restrict the database user to the host that actually needs it.
- CRITICAL
Private key embedded in source
fxscan.secret.private-key· lua, javascript, typescript, tsx, json, html, cfg, sql, other
A PEM-encoded private key is embedded in the resource. Private keys are the strongest credential a system has; distributing one in a resource archive compromises everything that trusts it.
Recommendation: Revoke and regenerate the key pair, and never ship private keys inside a resource.
- HIGH
High-entropy API key assigned in source
fxscan.secret.generic-api-key· lua, javascript, typescript, tsx, json, html, cfg, sql, other
A variable whose name indicates a credential is assigned a high-entropy literal. The value survived the placeholder and low-entropy filters, so it is likely a real key rather than an example.
Recommendation: Move the value into configuration, rotate it, and add the configuration file to your ignore list so it is never packaged.
Suspicious logic6 rules
- HIGH
Hardcoded player identifier controls privileged behaviour
fxscan.logic.hardcoded-admin-identifier· lua, javascript, typescript, tsx
A specific player identifier is hard-coded and appears near privileged behaviour. A backdoor that only activates for one identifier is invisible in normal operation and survives every permission system the server owner configures.
Recommendation: Remove the identifier. Manage administrators through your framework's permission system or the server ACE configuration, where the server owner can see and change them.
- CRITICAL
Privilege grant hidden behind an identity comparison
fxscan.logic.hidden-privilege-grant· lua, javascript, typescript, tsx
The code compares a player identity against a hard-coded value and grants privileges when it matches. This is the canonical shape of a resource backdoor.
Recommendation: Remove the branch entirely. Then audit the ACE configuration and the framework's admin table for entries you did not create.
- HIGH
Developer or debug flag bypasses security checks
fxscan.logic.developer-bypass· lua, javascript, typescript, tsx
A debug or developer flag short-circuits a permission or validation check. Flags like this are frequently shipped enabled, and are equally frequently left in deliberately.
Recommendation: Remove the bypass before distribution. If a debug mode is genuinely needed, gate it behind a server convar that defaults to off and log loudly when it is active.
- HIGH
Behaviour changes based on which server is running the resource
fxscan.logic.server-identity-gated-payload· lua, javascript, typescript, tsx
The resource inspects the server's own identity (hostname, license key, endpoint or convar) and branches on it. This lets a payload stay dormant everywhere except the targets the author chose - including staying dormant on a reviewer's test server.
Recommendation: Remove the check. A resource should behave identically on every server that installs it.
- HIGH
Behaviour is gated on a specific date or time
fxscan.logic.time-triggered-payload· lua, javascript, typescript, tsx
The code compares the current date or time against a fixed value and performs a privileged or destructive action when the comparison succeeds. Time-delayed activation is used to get a payload past review and only detonate later.
Recommendation: Remove the time-based branch. Legitimate scheduling belongs in a documented, configurable cron-style mechanism, not in a hidden comparison.
- MEDIUM
Players are dropped or banned without a permission check
fxscan.logic.silent-player-removal· lua, javascript, typescript, tsx
The resource can remove players from the server (`DropPlayer` or an equivalent ban call) from a code path with no permission check. A resource with an unguarded kick primitive can be used to grief a server.
Recommendation: Require an explicit permission check before dropping a player, and log every removal with the acting identity.
Obfuscation9 rules
- MEDIUM
Long Base64 blob embedded in source
fxscan.obf.long-base64-blob· lua, javascript, typescript, tsx
The file contains one or more long Base64 runs. Base64 is a legitimate encoding for binary assets, but a long blob inside a script is the standard way to hide a payload from a reviewer.
Recommendation: Decode the blob and confirm what it contains. If it is code, treat the resource as untrusted.
- MEDIUM
Long hexadecimal blob embedded in source
fxscan.obf.long-hex-blob· lua, javascript, typescript, tsx
The file contains long hexadecimal runs or `\xNN` escape sequences. Like Base64, this is a common way to keep a payload out of plain sight.
Recommendation: Decode the blob and review its content before running the resource.
- LOW
String literals have unusually high entropy
fxscan.obf.high-string-entropy· lua, javascript, typescript, tsx
The string literals in this file are close to random. Normal source strings contain readable text; near-random strings usually mean the real content has been encoded.
Recommendation: Review the file manually. If you cannot explain what the strings are for, do not run the resource.
- MEDIUM
Strings built from character codes
fxscan.obf.character-code-construction· lua, javascript, typescript, tsx
The file builds strings from numeric character codes (`string.char` / `String.fromCharCode`). This defeats plain-text searching for the strings the code actually uses.
Recommendation: Reconstruct the strings and confirm what they contain, particularly any URLs or function names.
- MEDIUM
XOR decoding routine present
fxscan.obf.xor-decoder· lua, javascript, typescript, tsx
The file contains a loop that combines XOR with character-code conversion - a hand-rolled decoder. Legitimate resources have no reason to decrypt their own strings at runtime.
Recommendation: Extract the key and decode the payload offline. Treat the resource as untrusted until you know what the decoder produces.
- LOW
Identifiers appear machine-generated
fxscan.obf.machine-generated-identifiers· lua, javascript, typescript, tsx
Many identifiers have no readable structure, which is typical of automated obfuscators. This alone is not malicious - it is common in bundled JavaScript - but it makes review considerably harder.
Recommendation: Ask the author for unobfuscated sources. An obfuscated server-side script cannot be meaningfully audited.
- LOW
Extremely long source line
fxscan.obf.extreme-line-length· lua, javascript, typescript, tsx
The file contains a line thousands of characters long. This is normal for a minified web bundle and abnormal for a FiveM server script.
Recommendation: If this is a server-side script, request the original unminified source before deploying it.
- MEDIUM
Function names resolved at runtime
fxscan.obf.dynamic-function-name-resolution· lua, javascript, typescript, tsx
Functions are called through a runtime-computed name rather than written out. This hides which API the resource actually uses and prevents any static review of its behaviour.
Recommendation: Replace dynamic dispatch with direct calls, or restrict it to an explicit table of allowed functions.
- MEDIUM
File is heavily obfuscated
fxscan.obf.overall-score· lua, javascript, typescript, tsx
Several independent obfuscation signals fired on this file at once. Any one of them is explainable; the combination means the file was deliberately made hard to read.
Recommendation: Do not deploy obfuscated server-side code you cannot review. Request the original source from the author.
Reading the report
Every finding names the file, the line and the excerpt, and where the rule proved a data-flow path it shows each hop along the chain. A clean report means no rule matched - which is a weaker claim than “safe”, and the limits are written down.