Repository navigation
[Security] /whois coordinate leak #6626
Description
Type of bug
Exploit
/ess dump all output
nope
Error log (if applicable)
nope
Bug description
Hello EssentialsX maintainers,
Thank you very much for maintaining EssentialsX. While auditing the teleport and permission logic in EssentialsX version 2.22.1-dev+23-43cb76a, I discovered several inconsistent permission behaviors and one information disclosure issue.
I found these issues while reviewing the project source code. I originally decompiled the plugin for code analysis, but I have since discovered the official GitHub repository. I realize now that decompilation was unnecessary, as full source code is already public on GitHub. All findings are based purely on static code review, with no testing or exploitation on live servers.
No privilege escalation or critical bypass vulnerabilities were found during my audit. However, the following issues should be fixed for better permission consistency and security.
- /whois discloses exact player coordinates without independent permission check (Medium — Information Disclosure)
In Commandwhois, the player’s precise block coordinates and world name are sent unconditionally to any user with the essentials.whois permission:
sender.sendTl("whoisLocation", user.getLocation().getWorld().getName(),
user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ());
Other sensitive information shown in the same command is properly restricted:
- IP address requires essentials.whois.ip
- GeoIP data requires essentials.geoip.show
Similarly, the /seen command restricts location data behind essentials.seen.location.
The current design is inconsistent: any staff member with basic /whois access can view other players’ real-time exact coordinates, which may expose player bases and private locations.
Suggested fix: Add a separate permission node essentials.whois.location (disabled by default) to control coordinate visibility, matching the permission design of /seen.
- Teleport cooldown bypass permission logic works incorrectly (Low — Logic inconsistency)
In AsyncTeleport.cooldownApplies(), the cooldown bypass logic uses incorrect boolean logic:
case 1: // BACK
applies = !isAuthorized("essentials.teleport.cooldown.bypass")
|| !isAuthorized("essentials.teleport.cooldown.bypass.back");
break;
case 0: // TPA
applies = !isAuthorized("essentials.teleport.cooldown.bypass")
|| !isAuthorized("essentials.teleport.cooldown.bypass.tpa");
Due to the use of ||, playersmust own both the global bypass and the specific bypass permission to skip cooldowns. Granting only the specific bypass permission (e.g. essentials.teleport.cooldown.bypass.back) has no effect.
This contradicts expected permission behavior. Specific bypass nodes should independently disable cooldowns without requiring the global permission. - Console and command block senders skip cross-world permission validation (Low — Inconsistent security boundary)
The permission check in Essentials.onCommandEssentials only runs when user != null. Console and command block senders bypass all essentials.worlds. permission checks during cross-world teleport commands.
When a non-existent world name is provided, getWorld() returns null. Calling loc.setWorld(null) causes an unhandled NullPointerException, which is silently caught internally and produces log spam.
I have fully audited the entire EssentialsX teleport stack including tp, tppos, tpo, tpoffline, home, back, warp, as well as wildcard targeting, sudo, powertool, invsee, enderchest, and all permission handler classes. No privilege escalation, bypass, or critical security vulnerabilities were found.
Best regards,
Qazr1234
Steps to reproduce
run /whois or some commands
Expected behaviour
The permissions should have more comprehensive handling.
Actual behaviour
I found this while reviewing the source code.
Additional Information
i used some ai to find the bug awa
Activity
zzzzzyc commentedon Sep 18, 2026
I successfully reproduced part of it.
Test environment: Paper 26.1.2-74 + EssentialsX 2.22.1-dev+24-49a2f10 / LuckPerms 5.5.84 / teleport-cooldown: 10, two bots (Victim, Tester) + RCON permission setup
Part 1 – Whois Coordinate Leak Description: Players who only hold the
essentials.whoispermission (and explicitly do not haveessentials.whois.location) can still see precise coordinates when using/whoison others. Reproduction Steps:lp user Tester permission set essentials.whois true + unset essentials.whois.locationPart 2 – Teleport Cooldown Bypass Fails Description: When only essentials.teleport.cooldown.bypass.back is held (and essentials.teleport.cooldown.bypass is explicitly not set globally), /back is still blocked by the teleport cooldown; the per-type node alone is ineffective. Reproduction Steps:
tp Tester 500 70 500, enter/back(1st attempt succeeds)/backa second time within 10 secondsbypass.backtakes effect).I will submit a pull request for the fix shortly.
Require essentials.whois.location to view coordinates in /whois
Let per-type cooldown bypasses work without the global bypass
JRoy commentedon Sep 26, 2026
this is not a security issue we're not going to lock core features of the whois command