Menscan Documentation
How to run a Mendix security scan with Menscan, what each section means, and how to act on the findings. New to Mendix security? Start with the Mendix security overview.
What Menscan Is (and Isn't)
Menscan is a focused scanner for Mendix applications. It speaks the Mendix XAS runtime protocol, so it sees the things general web scanners miss: demo users in session data, exposed constants, entity-level access control, callable microflows, and runtime configuration like development and strict mode.
It is a helper tool for manual security testing, not a turnkey vulnerability scanner. It does not attack, modify, or persist anything. Every request carries an X-Scanned-By: Menscan header so the activity is transparent in the target's logs.
Use it alongside code review, business logic testing, and a normal pentest workflow. For background on what these findings actually mean, see the Mendix security guide.
Scan Modes
1. Unauthenticated Scan
No login needed. Only works when Anonymous access is enabled in the Mendix app. Even without anonymous access you can still pull version, exposed endpoints, and a default-credentials check. More tricks in Pentesting Mendix Notes.
2. Authenticated Scan
Authenticated scans reveal more of the domain model and let you exercise role-bound access controls. Steps:
- Log into the Mendix app in your browser
- Open DevTools (or Burp) and inspect the cookies
- Copy the
__Host-XASSESSIONIDvalue - Paste it into Menscan when starting an authenticated scan
Authenticated scans only see what that session is allowed to see. To map the full access surface, compare several roles at once with the Authorisation Matrix below.
3. Authorisation Matrix
One URL, several sessions, one grid. Instead of running a scan per role and diffing the reports by hand, paste a session ID for each role and Menscan probes all of them against every entity the app exposes. Steps:
- Log in as each role you have access to, in separate browsers or private windows so the sessions do not overwrite each other
- Copy the
__Host-XASSESSIONIDvalue from each one - Open Auth Matrix, paste the URL, and add one row per session
- Label each row (Manager, Employee) if you want, though the app's own role names are detected either way
Up to six sessions per run. An Anonymous column is always added from a fresh session, so every role is read against an unauthenticated baseline. Expired sessions are dropped automatically, which matters because Mendix silently downgrades a dead session to anonymous rather than rejecting it, and an empty column otherwise looks identical to a genuinely locked-down role.
How to Run a Scan
The full flow from opening Menscan to acting on the findings.
Pick the target and mode
Open Start Scan, paste the full URL (including https://), and decide whether to toggle Authenticated Scan.
Supply session credentials (if authenticated)
Paste the __Host-XASSESSIONID value. Optionally provide a custom auth header name if the app uses a non-default cookie.
Run the scan
Menscan streams progress in real time and gives you the results in a tabbed view once it finishes. Typical scans complete in seconds.
Review System Information
Mendix version (and whether it's LTS/EOL), development mode, strict mode, default credentials, debugger endpoint, and exposed API documentation surfaces all live here.
Inspect Metadata
Browse the domain model. Editable fields are highlighted, look for sensitive attributes that should not be writable by the current role.
Enumerate Microflows
Discover callable microflows and test whether restricted business logic (admin actions, data exports, integrations) can be invoked.
Review Constants & Demo Users
Exposed constants frequently contain API keys, secrets, and webhook URLs. Demo users with stored passwords often grant elevated access in seconds.
What Each Tab Shows
System Information
- Mendix version + LTS/EOL status
- Development mode
- Strict mode
- Debugger endpoint exposure
- Default credentials check (MxAdmin:1)
- Exposed API documentation paths
Demo Users
- Whether demo users are enabled
- Usernames and passwords (when extractable)
- Quick privilege-escalation path if exposed
Constants
Every constant the session can read. Often contains API keys, webhook URLs, and other secrets that should not be reachable by non-admins.
Plugins
Lists Mendix modules and widget plugins detected. Useful for spotting third-party components with known issues.
Metadata
The domain model: all entities, attributes, and which ones the current session can read or write. Editable fields are highlighted. Use the in-table search to filter records.
What to watch for:
- Sensitive attributes editable by low-privilege users (e.g.
is_admin,UserRoles,Email) - Wide read access on entities containing PII, payment data, or credentials
- Create rights on entities that should be admin-only
Microflows
Microflows are Mendix's server-side business logic. Menscan enumerates the microflows the current session can invoke via the /xas/ runtime endpoint, then optionally executes each one directly using "action": "executeAction". If access controls are misconfigured, any user, including anonymous, can invoke restricted business logic without touching the UI.
What to watch for:
- Admin actions exposed (password resets, account unlocks, role changes)
- Data export microflows allowing bulk export to CSV or external systems
- Anonymous-callable microflows where business logic runs without authentication
- Integration triggers that call external APIs, send emails, or write to third parties
Reading the Authorisation Matrix
Every cell carries three badges, one per permission. Delete is never probed, because there is no way to test it without destroying data.
R, read
The role can query the entity. The row count next to the badges tells you how much it can actually see.
C, create
The role can instantiate a new object. Nothing is committed, so no record is written to the target.
W, write
At least one attribute is editable rather than read-only. This is usually the badge worth chasing.
Differs between roles
Entities where at least one role has different access from the others. This is the interesting list. On a real app most entities are identical for everyone, so a handful of rows here is normally the whole story.
Identical across all roles
Folded away by default and split into entities every role can reach and entities no role can reach. Expand it when you want the full picture. An entity that every role including Anonymous can read is still worth a look, even though nothing differs.
Runtime operations
Which callable operations each role is offered. Mendix exposes no microflow names over the wire, only operation IDs grouped by their parameter and association signature, so that signature is what labels each row. A role being offered an operation the others are not is a lead worth following in the Microflows tab of a normal scan.
Every role is probed against the union of all entities, not just the ones its own session advertises. That is deliberate: if one role is told about an entity and another is not, the question worth answering is whether the second is genuinely denied it or merely not informed of it.
I've Been Scanned. What Now?
Every Menscan request carries the header:
X-Scanned-By: Menscan- Search application logs around the scan time
- The scanner is passive and does not attempt exploitation
- It is a research tool, like any tool, it can be misused
- Owners of misuse, not the maintainer, are responsible
Scanning Best Practices
Get useful results without burning the target or your own time.
Ready to Scan?
Paste a Mendix URL and Menscan handles the rest. Read the Mendix security guide first if you want the why behind each check.