Commit Care a deschis o ușă din spate
O nouă funcționalitate a fost integrată pentru a gestiona obiectele încărcate de utilizatori. Totul trece testele, dar săptămâni mai târziu, un test de penetrare dezvăluie că atacatorii pot executa comenzi pe server; rezultatul unei deserializări nesigure ascunse în cod. Decalajul dintre deserializare și execuția de cod la distanță poate fi periculos de mic, mai ales atunci când datele serializate din pachete open source sau servicii interne sunt de încredere fără validare.
Ce este deserializarea în cod, de ce este riscantă și unde se ascunde
În termeni de dezvoltare, ce este deserializarea? Este procesul de preluare a datelor structurate, JSON, XML, formate binare sau obiecte serializate specifice limbajului și transformarea lor înapoi în obiecte în memorie.
Pe cont propriu, deserializare este inofensiv și comun, de exemplu:
- JavaCitirea obiectelor cu ObjectInputStream
- PitonÎncărcarea datelor cu pickle.load
- Node.jsAnalizarea JSON cu JSON.parse
Riscul apare atunci când deserializarea este aplicată unor date nesigure, fără validare. Un atacator poate crea date de intrare care declanșează un lanț de gadgeturi, căi de cod existente utilizate în moduri neintenționate, ceea ce poate duce la executarea de cod la distanță.
nesigur deserializare se găsește adesea în:
- Pachete open source cu valori implicite nesigure
- Cod personalizat care presupune că intrarea serializată este de încredere
- API-uri terță parte returnează obiecte serializate fără verificare
- Construiește artefacte cum ar fi:
- Java .ser fișiere care conțin obiecte pre-serializate.
- Piton .pkl fișiere model în fluxurile de lucru de învățare automată.
- Obiecte de configurare serializate încorporate în imagini Docker sau containere de implementare
- Java .ser fișiere care conțin obiecte pre-serializate.
- Dispozitive de testare cum ar fi:
- Date de testare vechi, serializate, copiate din instantaneele de producție.
- Sarcini utile serializate descărcate din depozite externe pentru teste de performanță sau de regresie.
- Date de testare vechi, serializate, copiate din instantaneele de producție.
Aceste fișiere pot fi introduse într-un depozit și încărcate automat în timpul testelor sau implementărilor, declanșând erori nesigure. deserializare in CI/CD pipelines înainte ca codul să ajungă măcar în producție.
De la deserializare nesigură la execuția de cod la distanță: Calea de atac
Lanțul de exploatare pentru deserializarea nesigură urmează adesea unul dintre aceste modele:
- În aplicație intră date de intrare nesigure.
- Deserializarea nesigură recreează obiectele fără restricții.
- Un lanț de gadgeturi declanșează funcționalități existente în moduri neintenționate.
- Atacatorul escaladează privilegiile și realizează execuția de cod la distanță.
variante:
- Lanțurile de gadgeturi Java exploatează biblioteci vechi precum Apache Commons.
- Piton .pkl încărcarea modelului cu obiecte malițioase încorporate.
- Analiza JSON Node.js cu eval() sau importuri dinamice.
Curgere:
Untrusted Input → Deserialization → Gadget Chain → Remote Code Execution
Cum să identifici deserializarea nesigură înainte de îmbinare
Depistarea deserializării nesigure înainte de îmbinarea codului este mult mai ieftină decât remedierea acesteia după implementare. O combinație de analiză automată și testare proactivă funcționează cel mai bine:
- Testarea statică a securității aplicațiilor (SAST):
- Configurați scanerele pentru a detecta API-uri riscante, cum ar fi ObjectInputStream, pickle.load și YAML.load fără un încărcător sigur.
- Scanați atât codul sursă, cât și artefactele de compilare/testare pentru a identifica elemente nesigure deserializare modele.
- Afișați rezultatele direct în pull requests astfel încât dezvoltatorii să le poată aborda înainte de fuzionare.
- Configurați scanerele pentru a detecta API-uri riscante, cum ar fi ObjectInputStream, pickle.load și YAML.load fără un încărcător sigur.
- CI/CD Integrare:
Exemplu de flux de lucru:
sql
Commit → SAST scan → PR alert → Fix before merge
- Îmbinarea blocurilor în cazul descoperirilor critice de deserializare nesigură pentru a împiedica codul nesigur să ajungă la ramurile de producție.
- Teste unitare cu intrări rău intenționate simulate:
- Crează sarcini utile controlate și inofensive care imită obiecte comune de atac serializate.
- Testează modul în care aplicația le gestionează; ar trebui să respingă, să sanitizeze sau să înregistreze datele de intrare în loc să le proceseze orbește.
- Includeți aceste teste în procesul automat pipeline astfel încât rulează pe fiecare PR, detectând din timp comportamentul de deserializare nesigur.
- Asigurați-vă că sarcinile utile de testare sunt neexecutabile și sigure pentru stocarea în depozit, concentrându-vă exclusiv pe logica de detectare.
- Crează sarcini utile controlate și inofensive care imită obiecte comune de atac serializate.
Această abordare stratificată combină scanarea automată cu teste deținute de dezvoltatori, asigurându-se că sunt identificate și eliminate căile de deserializare nesigure cu mult înainte ca acestea să devină vulnerabilități la execuția de cod la distanță.
Strategii de prevenire pentru dezvoltatori: Oprirea deserializării pentru a o face mai rapidă decât executarea de cod la distanță
- Limitele de încredereDeserializați doar din surse autentificate și verificate.
- API-uri sigure:
- Java: Biblioteci securizate cu validare.
- Python: Utilizare json.loads() peste pickle.loads() acolo unde este posibil.
- Node.js: Evitați eval() sau execuție dinamică de cod.
- Java: Biblioteci securizate cu validare.
- Liste de permisiuni și schemeRestricționați tipurile de obiecte permise. Impuneți scheme JSON.
- Igiena dependențeiMonitorizați CVE-urile care menționează deserializare sau execuție de cod la distanță.
- Recenzii de cod: Adăuga deserializare verificări de siguranță pentru șabloanele de revizuire a PR-urilor.
Notă privind sculele: Scule precum Xygeni scanează codul și dependențele pentru deserializarea nesigură înainte de îmbinare, identificând zonele cu risc ridicat, astfel încât dezvoltatorii să le poată remedia din timp.
Exemple de modele de detectare în diferite limbi (Pseudo-cod sigur)
Toate exemplele de mai jos sunt pseudo-cod igienizat care prezintă modele de detectare, nu exploit-uri funcționale:
Java – Detectarea utilizării API nesigure:
java
// BAD: Accepting untrusted input without validation
ObjectInputStream in = new ObjectInputStream(userInputStream);
Object obj = in.readObject(); // Unsafe - no class type checks
// GOOD: Validate allowed classes before processing
if (allowedClasses.contains(obj.getClass().getName())) {
process(obj); // Safe processing of approved classes
}
Python – Evitarea deserializării nesigure:
python
import pickle
# BAD: Loading untrusted serialized data directly
data = pickle.loads(untrusted_input) # Unsafe - arbitrary object execution risk
# GOOD: Use JSON with schema validation
import json
data = json.loads(untrusted_input) # Safe when validated against schema
Node.js – Prevenirea execuției dinamice de cod:
javascript
// BAD: Executing code from parsed data
let obj = JSON.parse(untrustedInput);
eval(obj.code); // Unsafe - allows arbitrary code execution
// GOOD: Use fixed logic without dynamic execution
let safeObj = JSON.parse(untrustedInput);
process(safeObj); // Handle only expected properties and values
Automatizarea detectării în DevSecOps Pipelines: Detectarea deserializării înainte ca aceasta să ajungă în producție
Automatizarea detectării deserializării nesigure asigură vulnerabilitățile sunt detectate și remediate înainte ca acestea să ducă la execuția de cod la distanță în producție.
Pipeline Scanarea
- Alerga SAST pe codul sursă, fișierele de configurare și artefactele de compilare la fiecare commit.
- Detectează modele de deserializare nesigure atât în codul aplicației, cât și dependențe.
Inspecția artefactelor
- Scanda .ser, .pkl, și alte fișiere serializate pentru modele nesigure înainte de implementare sau chiar de rulare a testelor.
Pull Request Blocarea
- Blochează îmbinările dacă se detectează o deserializare nesigură.
- Afișați feedback practic în PR-uri pentru a accelera remedierea.
Aplicarea testelor unitare
- Includeți teste unitare cu intrări simulate malițioase în CI/CD pipeline
- Compilările eșuează dacă aplicația procesează date serializate nesigure în loc să le respingă.
Evitarea rezultatelor fals pozitive fără a slăbi regulile
- Nu dezactivați regulile de detectare pentru a „dezactiva” alertele; acest lucru poate permite ca deserializarea nesigură reală să treacă nedetectată.
- Folosește o listă albă controlată (listă de permisiuni) pentru modele sau dependențe sigure cunoscute.
- Solicitați validarea de securitate înainte de aprobarea intrărilor pe lista albă.
- Păstrați lista albă sub controlul versiunilor și revizuiți-o periodic pentru a vă asigura că toate excepțiile rămân justificate și sigure.
Rolul lui Xygeni
- Se integrează direct în CI/CD pipelinepentru a scana atât codul sursă, cât și pentru a construi artefacte.
- Detectează modelele de deserializare nesigure și dependențele riscante la începutul ciclului de viață.
- Acceptă includerea pe liste albe bazate pe politici, cu revizuire obligatorie a securității, echilibrând precizia detectării cu productivitatea dezvoltatorului.
Fiți cu un pas înaintea execuției de cod la distanță prin deserializare securizată
Deserializarea nesigură poate rămâne neobservată până când devine o cale directă către execuția de cod la distanță. Prevenirea acesteia necesită:
- Înțelegerea a ceea ce este deserializarea și cum poate fi abuzivă.
- Integrarea detectării automate în fluxul de lucru de dezvoltare.
- Revizuirea regulată a dependențelor, a artefactelor de compilare și a datelor serializate utilizate în teste.
Rolul practic al Xygeni în acest proces:
- Scanarea codului sursăIdentifică modelele de deserializare nesigure în mai multe limbaje înainte de îmbinarea codului.
- Analiza artefactelor și a dependențeiDetectează fișierele serializate riscante (.ser, .pkl, configurație încorporată) și componente terțe cu vulnerabilități cunoscute.
- Controale bazate pe politiciAcceptă o listă de acces permisă controlată cu validare de securitate, asigurându-se că excepțiile necesare nu introduc riscuri reale.
- Feedback pentru dezvoltatori în contextSemnalează locația exactă și cauza deserializării nesigure în interiorul pull requests, permițând dezvoltatorilor să remedieze imediat problemele și să confirme atenuarea prin rescanări.
Prin integrarea directă a unor cecuri precum acestea în CI/CD, echipele pot detecta și remedia situațiile nesigure deserializarea înainte ca aceasta să aibă vreodată șansa de a escalada în execuția de cod la distanță în producție.







