Hvorfor JSON.stringify ikke er så ufarlig som det ser ut til
Utviklere bruker JSON.stringify hver dag for å serialisere data, sende objekter over ledningen, lagre tilstand i filer eller lagre konfigurasjoner. Men det tilsynelatende harmløse kallet til JSON.stringify kan introdusere usikker deserialisering hvis dataene senere rehydreres uten validering.
Problemet er ikke JSON.stringify i seg selv, det er hvordan vi misbruker det. Når du serialiserer komplekse objekter (spesielt med prototyper eller klasseinstanser) og blindt deserialiserer dem senere ved hjelp av JSON-parsing, risikerer du å bringe skadelige nyttelaster til live i applikasjonen din.
I JavaScript er det lett å anta at det som er serialisert er trygt fordi det «bare er JSON«Men JSON er data, ikke logikk. Hvis angripere kontrollerer disse dataene, kan de utnytte tillitsgrenser i koden din. Det er her usikker deserialisering starter.
Vanlige utviklerfeil som muliggjør usikker deserialisering
Usikker deserialisering stammer vanligvis fra vaner som ser harmløse ut i kodegjennomganger. Men når JSON.stringify brukes uforsiktig, angrepsflaten utvider seg.
Usikker praksis: Serialisering av uvalidert brukerinput
⚠️Advarsel: Dette mønsteret serialiserer angriperstyrt input uten noen form for validering. Det kan føre til usikker deserialisering hvis dataene senere blir klarert.
// Node.js example
const userData = req.body; // attacker-controlled
fs.writeFileSync('userdata.json', JSON.stringify(userData));
⚠️Advarsel: Deserialisering av de samme dataene uten validering kan introdusere nyttelasten i appen din på nytt.
const input = JSON.parse(fs.readFileSync('userdata.json'));
doSomething(input); // Trusting it blindly
Farlig mønster: Gjenbruk av JSON på tvers av tillitsgrenser
Serialisert JSON opprettet i én tjeneste (utviklingsmiljø) blir gjenbrukt i en annen (prod) uten validering. Dette skjer ofte i interne verktøy eller mikrotjenester.
Python-eksempel på stille risiko:
⚠️Advarsel: Både serialiserings- og deserialiseringstrinnene nedenfor håndterer potensielt upålitelige data uten validering.
import json
def save_user_input(data):
with open('input.json', 'w') as f:
f.write(json.dumps(data))
def process_input():
with open('input.json') as f:
data = json.loads(f.read())
execute_logic(data) # Dangerous if data structure is assumed
Begge eksemplene serialiserer og deserialiserer brukerkontrollerte data uten skjemahåndhevelse. Dette er grobunn for usikre deserialiseringsutnyttelser utløst av uforsiktig JSON. stringify-bruk.
Reelle risikoer i Pipelines: Fra kode til CI/CD Deserialiseringsflyter
Ta nå den oppførselen inn i bildet pipeline. Når JSON.stringify misbrukes i CI/CD arbeidsflyter, utsetter du byggeprosessen din for usikre deserialiseringsrisikoer. Dette skjer ofte med artefaktmetadata, testfixturer og konfigurasjonsøyeblikksbilder.
Felles CI/CD fallgruver:
- Usikker artefaktgenerering: Byggeartefakter inkluderer serialiserte objekter som brukes på nytt på tvers av jobber uten validering.
- Serialiserte miljøvariabler: Team lagrer miljøvariabler som serialisert JSON og bruker dem på nytt på tvers av trinn eller til og med prosjekter.
- Injiserte testdata: Deserialiserte testdata fra ikke-klarerte commits eller grener utført uten typekontroll.
Disse mønstrene gjør det enkelt for angripere å injisere nyttelaster i pålitelige pipelines ved hjelp av manipulert JSON stringify-logikk.
⚠️Advarsel:Denne arbeidsflyten sender serialiserte data uten validering. Hvis test-runner.js ikke validerer input, risikerer den usikker deserialisering.
# YAML example in GitHub Actions
steps:
- name: Load test data
run: |
echo '${{ secrets.TEST_JSON }}' > test.json
node test-runner.js test.json
If test-runner.js laster og analyserer JSON uten validering, kan det utløse en usikker deserialisering.
Sikring av JSON. Stringify med validering og sikker parsing
Løsningen er ikke å unngå JSON.stringify, men å bruke det forsiktig og bruke sikkerhetskontroller konsekvent. Håndtert riktig er det trygt, men i moderne pipelines, antagelser bryter raskt sammen.
DevSecOps-praksiser for å sikre JSON.stringify:
- Bruk JSON-skjemaer til å validere serialiserte og deserialiserte data.
- Håndhev streng skriving, unngå «duck typing» eller antagelser om objektformer.
- Bruk sikre parsingsbiblioteker som støtter skjemahåndhevelse eller typebeskyttere.
- Behandle serialiserte data som uklarerte, selv om de kom fra et klarert lager.
- Instrument pipelines for å fange opp risikable JSON.stringify-mønstre tidlig.
Beste praksis: Dette eksemplet bruker JSON-skjemavalidering for å forhindre usikker deserialisering. Eksempel som bruker ajv i Node.js:
const Ajv = require("ajv");
const ajv = new Ajv();
const schema = { type: "object", properties: { id: { type: "number" } }, required: ["id"] };
const validate = ajv.compile(schema);
const input = JSON.parse(fs.readFileSync('input.json'));
if (!validate(input)) throw new Error("Invalid input");
Sikker deserialisering betyr validering før du tillitsfull. Ikke stol på JSON. Stringify standardverdier for å holde deg trygg; definer hva safe ser ut som.
Oppdage serialiseringsrisikoer med Xygeni
Manuell revisjon fanger bare opp en viss mengde. Xygeni gir innsikt i hvordan JSON.stringify brukes på tvers av kodebasen din og pipelines.
Hva Xygeni gjør:
- Traces JSON.stringify bruk fra kildekode til distribusjon.
- Oppdager usikre deserialiseringsflyter, spesielt på tvers av mikrotjenester og pipeline stadier.
- Flagger serialisering av usikre data som miljøvariabler, brukerinput eller artefakter.
- Varsler om mønsteravvik, som viser når serialiserte data endrer form eller krysser tillitsgrenser.
Denne typen synlighet er kritisk når man håndterer usikre deserialiseringsrisikoer introdusert av JSON.stringify, spesielt i CI/CD systemer der serialiserte data beveger seg raskt og stille.
Sikring av JSON. stringify: Din Shield Mot usikker deserialisering
JSON.stringify er ikke usikkert i seg selv. Men når det brukes uten forsiktighet, blir det inngangsporten til usikker deserialisering.
Hvis du er en utvikler som jobber med JSON:
- Revider bruken din av det på tvers av tjenester, pipelines og verktøy.
- Behandle deserialiserte data som uklarerte.
- Bruk skjemavalidering, håndhev typer og integrer sikkerhet i din CI/CD.
Og ikke stopp ved beste praksis, bruk Xygeni til å spore, oppdage og stoppe usikre deserialiseringsrisikoer før de går i produksjon. Serialisering er ikke nøytralt. Gjør bruk av JSON.stringify sikre.







