L'ecosistema de React ha experimentat una transformació profunda amb l'arribada dels Server Components i el protocol Flight. Aquest sistema de comunicació en temps real entre servidor i client promet eficiència i rendiment, però també ha obert una porta a vulnerabilitats crítiques que cap equip de desenvolupament hauria d'ignorar. En aquest article analitzem com Flight converteix dades estructurades en vectors d'atac, els incidents més greus documentats i les mesures que poden prendre les organitzacions per protegir les seves aplicacions.
El protocol Flight no és un simple format JSON. Es tracta d'un sistema de streaming que transporta referències a mòduls, accions del servidor, promeses asíncrones i elements d'interfície. Cada línia del flux conté una instrucció que el runtime de React interpreta per reconstruir l'arbre de components al client. Això significa que el servidor envia no només dades, sinó comportament executable. I quan un atacant aconsegueix manipular aquest flux, les conseqüències poden ser catastròfiques.
Per entendre el risc, cal observar el sistema de prefixos $. Quan el parser troba una cadena que comença amb $, la interpreta com una referència a un altre fragment del flux. Per exemple, $2 apunta al fragment 2, mentre que $1:user:name indica que ha d'accedir a la propietat user.name del fragment 1. Aquest recorregut de propietats, conegut com $:, permet navegar per qualsevol objecte, inclosos els prototips. Als sistemes JavaScript, l'accés a __proto__ o constructor pot conduir a la modificació de prototips compartits, obrint la porta a atacs de contaminació de prototips (prototype pollution).
La vulnerabilitat més sonada va ser CVE-2025-55182, anomenada React2Shell, que va assolir una puntuació CVSS de 10.0. Un atacant sense autenticació podia enviar una única petició HTTP a un endpoint de Server Function i obtenir accés complet al shell del servidor. El mecanisme combinava diverses característiques del protocol: el recorregut de prototips per arribar al constructor Function, l'autoreferència a fragments interns amb $@, el segrest de promeses (Thenable hijack) i el desencadenament a través del manejador de blobs $B. Tot això demostrava que Flight no només serialitza dades, sinó que reconstrueix comportament de manera perillosa.
Després de la publicació del pedaç, l'equip de React va corregir el problema afegint una verificació de hasOwnProperty a cada accés a propietats. No obstant això, l'estructura fonamental del protocol continua sent la mateixa: el recorregut de propietats mitjançant $: roman intacte, només que ara es validen els passos. Per a molts experts en ciberseguretat, això representa un pedaç simptomàtic i no un redisseny estructural. El risc latent és que futures vulnerabilitats puguin sorgir del mateix patró.
A més del RCE, es van documentar altres vulnerabilitats al mateix ecosistema. CVE-2025-55183 permetia l'exposició de codi font quan una Server Action serialitzava un argument maliciós. CVE-2025-55184 i CVE-2025-67779 eren denegacions de servei per recurrència infinita de promeses. CVE-2026-23864 explotava el buffering il·limitat del cos de la petició per esgotar la memòria. Finalment, CVE-2026-27978 era un bypass de CSRF que ocorria quan el navegador enviava Origin: null des d'un iframe sandboxejat, i Next.js el tractava com un origen absent en lloc de creuat.
Davant aquest panorama, les empreses que desenvolupen aplicacions amb React Server Components han d'adoptar defenses en profunditat. La primera i més efectiva és la validació d'entrada a cada Server Action. Utilitzar llibreries com Zod o Valibot per definir esquemes estrictes i executar safeParse abans de qualsevol lògica de negoci impedeix que dades malformades arribin al motor de deserialització. És crucial no desestructurar els arguments abans de validar-los, perquè això ja implica accedir a propietats sobre dades no fiables.
El paquet server-only és una altra barrera senzilla però poderosa. En importar-lo a fitxers que continguin credencials, consultes a bases de dades o lògica interna, es garanteix que cap component client pugui importar-los directament o transitivament. No obstant això, cal anar amb compte amb els fitxers barrel que reexporten funcions; si un barrel barreja codi de servidor i client, la protecció es dilueix.
La protecció contra CSRF requereix anar més enllà dels valors per defecte del framework. Configurar les cookies amb SameSite=Strict, generar tokens CSRF explícits per a operacions sensibles i evitar a tota costa afegir 'null' a la llista d'orígens permesos són pràctiques imprescindibles. L'error de Next.js que va permetre el bypass amb Origin: null es va corregir a la versió 16.1.7, però moltes aplicacions encara executen versions anteriors.
L'API de Taint de React, amb funcions com taintObjectReference i taintUniqueValue, ofereix una capa de seguretat en temps de desenvolupament. Permet marcar objectes o cadenes perquè el serialitzador llanci un error si intenten creuar al client. No obstant això, la seva efectivitat és limitada: només funciona amb referències al mateix objecte, no amb còpies, desestructuracions o transformacions. És un guardarraïl útil, però no un tallafocs.
Els WAF (Web Application Firewalls) poden afegir una detecció superficial de patrons coneguts, com cadenes constructor:constructor o __proto__. No obstant això, els atacants sofisticats omplen el payload amb dades escombraries abans de la part maliciosa per eludir la inspecció, o utilitzen codificació chunked. Confiar únicament en un WAF és perillós; s'ha de combinar amb les defenses anteriors.
Més enllà dels pedaços, hi ha riscos estructurals que persisteixen. L'atac d'intermediari (MITM) sobre el flux Flight és viable si un atacant controla la xarxa (CDN compromès, memòria cau enverinada). Pot modificar files $I per redirigir la càrrega de mòduls, injectar referències $F per activar RPC ocults o alterar props que portin a XSS si el component utilitza dangerouslySetInnerHTML. L'escapada de prefixos $ que aplica el serialitzador només protegeix contra dades d'usuari, no contra un atacant que escriu directament al flux.
L'enumeració de Server Actions és un altre vector. El fitxer server-reference-manifest.json conté el mapa de totes les accions amb els seus IDs hash. Si aquest manifest queda exposat per una mala configuració de l'hosting o un path traversal, l'atacant obté un catàleg complet d'endpoints RPC i pot realitzar atacs IDOR o de manipulació de paràmetres.
La manipulació de tancaments encriptats (encrypted closures) també és preocupant. Quan una Server Action captura variables del seu àmbit, Next.js les encripta amb una clau AES. Si l'atacant obté accés de lectura a fitxers (per SSRF o path traversal), pot extreure la clau, desxifrar, modificar i tornar a encriptar l'estat, fent que el servidor accepti dades falsificades.
Finalment, existeix la possibilitat d'activació de mòduls inerts mitjançant IDs de mòdul. Si un paquet compromès està present a node_modules com a dependència transitiva però mai s'importa directament, el bundler l'inclou en un chunk però no es carrega. Un atacant que pugui injectar una fila $I al flux Flight podria forçar la càrrega d'aquest chunk, activant codi que d'altra manera romandria adormit.
Aquest tipus de vulnerabilitats no són noves. Google Web Toolkit, Java Server Faces i ASP.NET ja van patir problemes similars amb els seus formats de serialització personalitzats. La lliçó és sempre la mateixa: quan un framework inventa un protocol de comunicació que transporta comportament executable, la superfície d'atac s'expandeix més enllà del que els desenvolupadors solen anticipar. La confiança cega que el servidor és l'únic productor d'aquestes dades és insostenible.
Per a les empreses que construeixen aplicacions a mida amb tecnologies modernes, la ciberseguretat ha de ser part integral del procés de desenvolupament. No n'hi ha prou amb aplicar pedaços; cal dissenyar arquitectures que limitin l'impacte de qualsevol vulnerabilitat futura. A Q2BSTUDIO, acompanyem els nostres clients en tot el cicle de vida del programari, des de l'anàlisi de riscos fins a la implementació de defenses en profunditat, incloent integració amb serveis cloud AWS/Azure, sistemes d'intel·ligència artificial i Business Intelligence amb Power BI. A més, desenvolupem agents d'IA que automatitzen tasques de monitoratge i resposta davant incidents, reduint la finestra d'exposició.
La comunitat de seguretat ha demostrat que el protocol Flight, per la seva pròpia naturalesa, continuarà sent un objectiu atractiu. Mentre no s'implementin mecanismes de validació criptogràfica dels fluxos serialitzats, signatures d'arbres de components o controls d'integritat de contingut, les aplicacions basades en Server Components dependran de la vigilància constant dels seus equips de desenvolupament i de la col·laboració amb experts en seguretat. La inversió en prevenció i en formació d'equips és l'única garantia davant amenaces que evolucionen tan ràpid com la tecnologia que intentem protegir.





