VYPR
Critical severity10.0OSV Advisory· Published Jun 20, 2025· Updated Apr 15, 2026

CVE-2025-49132

CVE-2025-49132

Description

Pterodactyl is a free, open-source game server management panel. Prior to version 1.11.11, using the /locales/locale.json with the locale and namespace query parameters, a malicious actor is able to execute arbitrary code without being authenticated. With the ability to execute arbitrary code it could be used to gain access to the Panel's server, read credentials from the Panel's config, extract sensitive information from the database, access files of servers managed by the panel, etc. This issue has been patched in version 1.11.11. There are no software workarounds for this vulnerability, but use of an external Web Application Firewall (WAF) could help mitigate this attack.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
pterodactyl/panelPackagist
< 1.11.111.11.11

Affected products

1

Patches

2
24c82b0e335f

fix: add additional input validation

https://github.com/pterodactyl/panelMatthew PennerJun 16, 2025via ghsa
2 files changed · +21 14
  • app/Http/Controllers/Base/LocaleController.php+5 14 modified
    @@ -2,11 +2,11 @@
     
     namespace Pterodactyl\Http\Controllers\Base;
     
    -use Illuminate\Http\Request;
     use Illuminate\Http\JsonResponse;
     use Illuminate\Translation\Translator;
     use Illuminate\Contracts\Translation\Loader;
     use Pterodactyl\Http\Controllers\Controller;
    +use Pterodactyl\Http\Requests\Base\LocaleRequest;
     
     class LocaleController extends Controller
     {
    @@ -20,20 +20,11 @@ public function __construct(Translator $translator)
         /**
          * Returns translation data given a specific locale and namespace.
          */
    -    public function __invoke(Request $request): JsonResponse
    +    public function __invoke(LocaleRequest $request): JsonResponse
         {
    -        $locales = explode(' ', $request->input('locale') ?? '');
    -        $namespaces = explode(' ', $request->input('namespace') ?? '');
    -
    -        $response = [];
    -        foreach ($locales as $locale) {
    -            $response[$locale] = [];
    -            foreach ($namespaces as $namespace) {
    -                $response[$locale][$namespace] = $this->i18n(
    -                    $this->loader->load($locale, str_replace('.', '/', $namespace))
    -                );
    -            }
    -        }
    +        $locale = $request->input('locale');
    +        $namespace = $request->input('namespace');
    +        $response[$locale][$namespace] = $this->i18n($this->loader->load($locale, $namespace));
     
             return new JsonResponse($response, 200, [
                 // Cache this in the browser for an hour, and allow the browser to use a stale
    
  • app/Http/Requests/Base/LocaleRequest.php+16 0 added
    @@ -0,0 +1,16 @@
    +<?php
    +
    +namespace Pterodactyl\Http\Requests\Base;
    +
    +use Illuminate\Foundation\Http\FormRequest;
    +
    +class LocaleRequest extends FormRequest
    +{
    +    public function rules(): array
    +    {
    +        return [
    +            'locale' => ['required', 'string', 'regex:/^[a-z][a-z]$/'],
    +            'namespace' => ['required', 'string', 'regex:/^[a-z]{1,191}$/'],
    +        ];
    +    }
    +}
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.