Wysoka

Froxlor has an authorization bypass in FTP shell assignment via missing server-side `available_shells` enforcement

  • Ujawniono: 29.05.2026
  • Aktualizacja: 11.10.2026 10:22

Summary

Froxlor 2.3.6 lets administrators configure system.available_shells as the approved shell list that customers may assign to FTP users. However, the server-side FTP account handlers do not enforce that whitelist when processing add or edit requests.

As a result, an authenticated customer with shell delegation enabled can submit an arbitrary shell such as /bin/bash even when the panel UI only offers more restricted choices. In deployments that use the default nssextrausers integration, the attacker-controlled shell is then propagated into the system account database, leading to real host shell access.

Details

The customer-facing FTP account page builds the shell selector from system.available_shells, which shows that the product intends the setting to act as the authorization boundary:

php
// customer_ftp.php:138-149
$shells = [
    '/bin/false' => '/bin/false'
];
$availableshells = explode(',', Settings::Get('system.available_shells'));
if (is_array($availableshells) && !empty($availableshells)) {
    foreach ($availableshells as $shell) {
        $shells[trim($shell)] = trim($shell);
    }
}

The request handler forwards posted form data directly into the FTP API command implementation:

php
// customer_ftp.php:170-172
if ($action == 'edit' && Request::post('send') == 'send') {
    $result = $log->logAction(USR_ACTION, LOG_INFO, "edited ftp-account #" . $id);
    Commands::get()->apiCall('Ftps.update', Request::postAll());
}

On the server side, Ftps::add() and Ftps::update() only perform generic shell string validation. They do not verify that the submitted shell belongs to system.available_shells:

php
// lib/Froxlor/Api/Commands/Ftps.php:119-123
if (Settings::Get('system.allow_customer_shell') == '1' && $this->getUserDetail('shell_allowed') == '1') {
    $shell = Validate::validate(trim($shell), 'shell', '', '', [], true);
} else {
    $shell = '/bin/false';
}

The validated shell is stored into ftp_users.shell and later consumed by the root-owned cron task that rebuilds NSS extrausers files:

php
// lib/Froxlor/Cron/System/Extrausers.php:89-97
$passwd_entries[] = $user['username'] . ':x:' . $uid . ':' . $gid . ':' . $gecos . ':' . $homedir . ':' . $shell;

Because the default installer configuration sets system.nssextrausers=1, and the shipped Debian/Bookworm configuration enables extrausers in nsswitch.conf, the attacker-controlled shell becomes the effective login shell of the generated system user on standard supported deployments.

PoC

An attacker needs a normal customer account and a deployment where customer shell delegation is enabled for that customer.

Relevant runtime prerequisites:

  • system.allow_customer_shell=1
  • the attacking customer has shell_allowed=1
  • the deployment uses system.nssextrausers=1 with the shipped libnss-extrausers integration

Froxlor requires a valid CSRF token for POST requests, so the attacker performs the exploit from an authenticated session.

Complete PoC flow:

  1. Log in as a customer and obtain a valid csrf_token.
  2. Identify one FTP account owned by that customer.
  3. Submit an edit request that sets an arbitrary shell outside the administrator-approved system.available_shells list:
http
POST /customer_ftp.php?page=accounts&action=edit&id=17 HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded
Cookie: <authenticated customer session>

csrf_token=VALID_CSRF_TOKEN&
send=send&
id=17&
username=test1ftp1&
ftp_description=poc&
path=/&
shell=/bin/bash&
login_enabled=1
  1. Wait for Froxlor's master cron to process the queued REBUILD_NSSUSERS task.

Result:

  • the request is accepted even if /bin/bash is not present in system.available_shells
  • ftp_users.shell is updated to /bin/bash
  • /var/lib/extrausers/passwd is regenerated with /bin/bash as the FTP user's login shell
  • the attacker can then authenticate to the host using that FTP user's credentials and obtain an interactive shell

Impact

This issue lets a low-privileged customer bypass an administrator-defined authorization boundary and promote an FTP-only account into a real shell account. On shared-hosting systems managed by Froxlor, that materially changes the trust model and can expose the host to lateral movement, local privilege-escalation follow-on attacks, data theft from colocated services, and persistence on the server.

Because the vulnerable flow is executed through the normal authenticated web interface and a root-owned provisioning task later materializes the chosen shell at the operating-system level, the vulnerability is stronger than a UI-only restriction bypass.

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Paczka Composer froxlor/froxlor >= 2.3.6, < 2.3.7 2.3.7

Odnośniki

Ocena CVSS 8.8/10
Wektor CVSS
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Słabość (CWE)
CWE-863
Platforma
Composer
Paczka
froxlor/froxlor
Ujawniono
29.05.2026
Aktualizacja
11.10.2026 10:22

Źródła i licencje

OSV / GitHub Advisory Database - GHSA-gcv3-5v9q-fmhh - CC BY 4.0

Historia podatności: froxlor/froxlor

Wszystkie opisane podatności tej paczki (Paczka Composer), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkie (60) w archiwum
Wszystkich wpisów
60
Pierwsza → ostatnia
04.2022 08.2026
Bez poprawki
3
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 12
  • Wysoka 21
  • Średnia 26
  • Niska 1

Ujawnienia w latach

  1. 2022: 15
  2. 2023: 20
  3. 2024: 3
  4. 2025: 2
  5. 2026: 20
Istotność:
  1. Krytyczna · 9.0 CVE-2026-62988 < 2.3.8 2.3.8
  2. Wysoka · 8.1 CVE-2026-52793 < 2.3.7 2.3.7
  3. Wysoka · 7.6 CVE-2026-41234 < 2.3.7 2.3.7
  4. Wysoka CVE-2026-41237 < 2.3.7 2.3.7
  5. Froxlor has an authorization bypass in FTP shell assignment via missing server-side `available_shells` enforcement ten wpis
    Wysoka · 8.8 CVE-2026-41235 >= 2.3.6, < 2.3.7 2.3.7
  6. Krytyczna · 9.6 CVE-2024-34070 < 2.1.9 2.1.9
  7. Wysoka · 7.5 CVE-2023-50256 < 2.1.2 2.1.2
  8. Krytyczna · 9.9 CVE-2023-6069 < 2.1.0-beta1 2.1.0-beta1
  9. Krytyczna · 9.1 CVE-2023-3668 < 2.0.21 2.0.21
  10. Wysoka · 7.2 CVE-2023-3172 < 2.0.20 2.0.20
  11. Krytyczna · 9.8 CVE-2023-1307 < 2.0.13 2.0.13
  12. Wysoka · 8.8 CVE-2023-1033 < 2.0.11 2.0.11
  13. Wysoka · 8.8 CVE-2023-0877 < 2.0.11 2.0.11
  14. Wysoka · 7.5 CVE-2023-0564 < 2.0.10 2.0.10
  15. Wysoka · 8.8 CVE-2023-0315 < 2.0.8 2.0.8
  16. Krytyczna · 9.8 CVE-2021-42325 < 0.10.30 0.10.30
  17. Wysoka · 8.8 CVE-2020-10235 < 0.10.14 0.10.14
  18. Krytyczna · 9.8 CVE-2016-5100 < 0.9.35 0.9.35
  19. Wysoka · 7.5 CVE-2018-12642 < 0.9.40 0.9.40
  20. Wysoka · 7.2 CVE-2018-1000527 < 0.9.40 0.9.40

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.