🔒 Hacked
Capitolul 3

Cei 6 vectori de atac comuni în Laravel

Înțelegerea modului în care intră atacatorii este primul pas pentru a-i ține afară.

Acest capitol acoperă cei șase vectori de atac cei mai comuni pe care i-am identificat țintind aplicații Laravel. Fiecare a fost folosit în atacuri reale - inclusiv CVE-uri critice descoperite în 2024-2026.

Vectorul 1: Exploatarea Modului Debug

Cea mai jenantă vulnerabilitate este adesea cea mai comună: lăsarea APP_DEBUG=true în producție.

CVE-2024-13919 high
CVSS: 7.5

XSS Reflectat în Pagina de Eroare Debug

Package: laravel/framework Affected: 11.9.0 - 11.35.x

Când modul debug este activat, pagina de eroare Laravel este vulnerabilă la atacuri XSS. Atacatorii pot injecta scripturi malițioase care se execută în browserele adminilor.

De Ce E Periculos

Când APP_DEBUG=true:

Atacul

  1. Atacatorul declanșează o eroare (input malformat, rută lipsă)
  2. Pagina de debug dezvăluie informații sensibile
  3. Cu XSS, atacatorul poate fura cookie-urile de sesiune ale adminului
  4. Urmează compromiterea completă a aplicației

Detectare

Verifică mediul tău de producție:

Configurare Periculoasă MALICIOUS CODE
// .env (GREȘIT - în producție)
APP_ENV=production
APP_DEBUG=true  // NU face NICIODATĂ asta!

// Această combinație este activ periculoasă
// CVE-2024-13919 face asta exploatabilă

Remediere

# În .env de producție
APP_DEBUG=false
APP_ENV=production

Vectorul 2: Hydration Smuggling în Livewire

Aceasta este cea mai critică vulnerabilitate din ecosistemul Laravel descoperită în ultimii ani.

CVE-2025-54068 critical
CVSS: 9.8

Execuție de Cod la Distanță via Hydration Smuggling

Package: livewire/livewire Affected: 3.0.0 - 3.6.3

Atacatorii neautentificați pot obține RCE manipulând payload-ul JSON al Livewire în timpul procesului de hydratare. Nu este necesară autentificarea.

💀

CVSS 9.8 - Severitate Maximă

Această vulnerabilitate permite execuție de cod la distanță neautentificată. Dacă rulezi Livewire 3.0-3.6.3, ești vulnerabil CHIAR ACUM. Nu există workaround în afară de actualizare.

Cum Funcționează

Componentele Livewire își serializează starea în JSON pentru comunicarea client-server. Vulnerabilitatea există în modul în care aceste date sunt deserializate (hydratate):

  1. Atacatorul creează un payload JSON malițios
  2. Payload-ul conține obiecte PHP serializate
  3. În timpul hydratării, aceste obiecte sunt deserializate
  4. Lanțurile gadget execută cod arbitrar

Indicatori de Atac

Urmărește acestea în log-urile tale:

Remediere

composer require livewire/livewire:^3.6.4

Vectorul 3: Injectare de Variabile de Mediu

Un atac subtil dar devastator care exploatează setarea register_argc_argv din PHP.

CVE-2024-52301 high
CVSS: 8.7

Injectare de Mediu via Query String

Package: laravel/framework Affected: Versiuni multiple (vezi mai jos)

Când register_argc_argv=On în PHP, atacatorii pot manipula variabilele de mediu Laravel prin query string-uri URL.

Atacul

Când register_argc_argv este activat (implicit pe multe sisteme):

https://site-ul-tau.com/?APP_ENV=local&APP_DEBUG=true

Acest query string poate suprascrie variabilele tale de mediu, activând modul debug sau schimbând mediul aplicației.

Versiuni Afectate

Versiune LaravelVersiune Patch
6.x6.20.45
7.x7.30.7
8.x8.83.28
9.x9.52.17
10.x10.48.23
11.x11.31.0

Detectare

Verifică dacă ești vulnerabil
// Verifică configurația PHP
if (ini_get('register_argc_argv') === '1') {
  echo "VULNERABIL: register_argc_argv este activat";
}

Remediere

Două opțiuni:

  1. Actualizează Laravel la versiunile patch-uite
  2. Dezactivează în php.ini:
register_argc_argv = Off

Vectorul 4: RCE în Laravel Pulse

Dacă folosești Laravel Pulse pentru monitorizare, asta e pentru tine.

CVE-2024-55661 critical
CVSS: 9.1

RCE via Metoda remember() Publică

Package: laravel/pulse Affected: < 1.3.1

Metoda remember() din trait-ul Livewire al Pulse era accesibilă public, permițând otrăvirea cache-ului și execuție de cod la distanță.

Atacul

  1. Atacatorul accesează dashboard-ul Pulse (adesea neprotejat)
  2. Exploatează metoda publică remember()
  3. Injectează date malițioase în cache
  4. Datele din cache se execută la cererile ulterioare

Remediere

composer require laravel/pulse:^1.3.1

De asemenea, asigură-te că accesul la Pulse este restricționat:

Restricționează Accesul la Pulse
// În PulseServiceProvider sau Gate
Gate::define('viewPulse', function ($user) {
  return $user->isAdmin();
});

Vectorul 5: Exploatarea Upload-urilor de Fișiere

Vectorul de atac pe care l-am experimentat direct. De două ori.

De Ce Aplicațiile Laravel Sunt Vulnerabile

Laravel face upload-urile de fișiere ușoare - uneori prea ușoare:

Cod de Upload Vulnerabil MALICIOUS CODE
// PERICULOS: Fără validare de extensie
public function upload(Request $request)
{
  $request->validate([
      'file' => 'required|file|max:2048|mimes:jpg,png'
  ]);

  // mimes verifică doar tipul MIME, nu extensia!
  $path = $request->file('file')->store('public/uploads');

}

Regula mimes verifică tipul MIME al fișierului, care poate fi falsificat. Un atacator poate încărca shell.php cu un tip MIME falsificat image/jpeg.

Metoda Sigură

Cod de Upload Securizat
public function upload(Request $request)
{
  $request->validate([
      'file' => [
          'required',
          'file',
          'max:2048',
          // Verifică extensia reală
          function ($attribute, $value, $fail) {
              $ext = strtolower($value->getClientOriginalExtension());
              $allowed = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
              if (!in_array($ext, $allowed)) {
                  $fail('Tip de fișier invalid.');
              }
              // De asemenea blochează PHP
              if (in_array($ext, ['php', 'phtml', 'php3', 'php4', 'php5', 'phar'])) {
                  $fail('Fișierele PHP nu sunt permise.');
              }
          },
      ],
  ]);

  // Generează nume de fișier sigur
  $safeName = Str::uuid() . '.' . $request->file('file')
      ->getClientOriginalExtension();

  $path = $request->file('file')->storeAs('uploads', $safeName);

}

Critic: Blochează PHP în Directoarele de Upload

Adaugă .htaccess pentru a preveni execuția PHP:

# storage/app/public/.htaccess
<FilesMatch "\.php$">
    Deny from all
</FilesMatch>

# Sau dezactivează complet PHP
php_flag engine off

Vectorul 6: Deserializare APP_KEY

Dacă APP_KEY-ul tău se scurge, s-a terminat jocul.

De Ce Contează APP_KEY

Laravel folosește APP_KEY pentru:

Lanțul de Atac

  1. Atacatorul obține APP_KEY (din .env expus, istoric git, pagini de eroare)
  2. Creează un obiect PHP serializat malițios
  3. Îl criptează cu cheia furată
  4. Trimite payload-ul criptat ca cookie sau input
  5. Laravel îl decriptează și îl deserializează
  6. Lanțul gadget execută cod arbitrar
💀

Compromitere APP_KEY = RCE Complet

Dacă APP_KEY-ul tău este expus, atacatorii pot executa cod arbitrar pe serverul tău folosind lanțuri gadget cunoscute (phpggc). Nu există mitigare în afară de rotirea cheii.

Detectare Pattern de Atac

Pattern Malițios MALICIOUS CODE
// Atacatorul folosește decrypt() cu input de la utilizator
$payload = decrypt($_POST['data']);  // PERICULOS!

// Sau deserializează date decriptate
$data = unserialize(decrypt($input)); // CRITIC!

Prevenire

  1. Nu comite niciodată .env în git

    # .gitignore
    .env
    .env.backup
    .env.production
  2. Verifică istoricul git pentru scurgeri

    git log -p --all -S 'APP_KEY'
  3. Rotește cheile dacă sunt compromise

    php artisan key:generate
    # Apoi invalidează toate sesiunile
  4. Nu pasa niciodată input criptat de la utilizator la unserialize()


Sumar: Cei 6 Vectori

#VectorCVESeveritateApărare Cheie
1Mod DebugCVE-2024-13919RIDICATĂAPP_DEBUG=false în producție
2Hydratare LivewireCVE-2025-54068CRITICĂActualizează la Livewire 3.6.4+
3Injectare MediuCVE-2024-52301RIDICATĂregister_argc_argv=Off
4RCE PulseCVE-2024-55661CRITICĂActualizează Pulse, restricționează accesul
5Upload FișiereN/ARIDICATĂValidează extensiile, blochează PHP
6Scurgere APP_KEYN/ACRITICĂNu expune niciodată, rotește dacă e scurs
🚨

Ești Vulnerabil?

Chiar acum, întreabă-te:

  • Versiunea mea Livewire este 3.6.4 sau mai mare?
  • APP_DEBUG este setat la false în producție?
  • Este APP_KEY-ul meu în siguranță și necompromis?
  • Pot fișierele PHP să se execute în directoarele mele de upload?

Dacă ai răspuns “nu” sau “nu știu” la oricare dintre acestea, ești în pericol.


Următorul: Capitolul 4 - Cele 87 de Semnături: O Analiză Profundă a Malware-ului PHP →

În următorul capitol, vom examina tiparele specifice de malware pe care le folosesc atacatorii - cele 87 de semnături pe care cercetarea noastră le-a identificat țintind aplicații PHP și Laravel.