چرا JSON.stringify آنقدرها هم که به نظر میرسد بیضرر نیست؟
توسعهدهندگان هر روز از JSON.stringify برای سریالسازی دادهها، ارسال اشیاء از طریق سیم، ذخیره وضعیت در فایلها یا حفظ پیکربندیها استفاده میکنند. اما این فراخوانی به ظاهر بیضرر JSON.stringify میتواند در صورت آببندی مجدد دادهها بدون اعتبارسنجی، منجر به deserialization ناامن شود.
مشکل خود JSON نیست. stringify کردن خودش مشکل است، مشکل نحوهی سوءاستفادهی ما از آن است. وقتی اشیاء پیچیده را serialize میکنید (بهخصوص با نمونههای اولیه یا کلاسها) و بعداً با استفاده از ... کورکورانه آنها را deserialize میکنید. تجزیه JSON، شما خطر اجرای کدهای مخرب در داخل برنامه خود را دارید.
در جاوا اسکریپت، به راحتی میتوان فرض کرد که آنچه سریالایز شده است، ایمن است زیرا «فقط» JSONاما JSON داده است، نه منطق. اگر مهاجمان آن دادهها را کنترل کنند، میتوانند از مرزهای اعتماد در کد شما سوءاستفاده کنند. اینجاست که deserialization ناامن شروع میشود.
اشتباهات رایج توسعهدهندگان که باعث Deserialization ناامن میشوند
معمولاً deserialization ناامن از عادتهایی ناشی میشود که در بررسی کد بیضرر به نظر میرسند. اما وقتی JSON.stringify بیدقت استفاده شود، سطح حمله گسترش مییابد.
رویه ناامن: سریالسازی ورودیهای نامعتبر کاربر
⚠️هشدار: این الگو ورودیهای تحت کنترل مهاجم را بدون هیچ اعتبارسنجی سریالی میکند. اگر دادهها بعداً مورد اعتماد قرار گیرند، ممکن است منجر به از بین رفتن سریال ناامن شود.
⚠️هشدار: از حالت سریالی خارج کردن همان دادهها بدون اعتبارسنجی میتواند بار داده را دوباره به برنامه شما وارد کند.
الگوی خطرناک: استفاده مجدد از JSON در مرزهای اعتماد
JSON سریالی شده که در یک سرویس (محیط توسعه) ایجاد میشود، بدون اعتبارسنجی در سرویس دیگری (محیط تولید) دوباره استفاده میشود. این اتفاق اغلب در ابزارهای داخلی یا میکروسرویسها رخ میدهد.
مثال پایتون از ریسک خاموش:
⚠️هشدار: هر دو مرحله سریالسازی و حذف سریالسازی که در زیر آمده است، دادههای بالقوه غیرقابل اعتماد را بدون اعتبارسنجی مدیریت میکنند.
هر دو مثال، دادههای کنترلشده توسط کاربر را بدون اجرای طرحواره، سریالسازی و از سریالسازی خارج میکنند. این زمینهساز سوءاستفادههای از سریالسازی ناامن است که توسط استفادهی بیدقت از JSON.stringify ایجاد میشود.
خطرات واقعی در Pipelineها: از کد تا CI/CD جریانهای بیسروصداسازی
حالا آن رفتار را در نظر بگیرید pipeline. وقتی از JSON.stringify سوءاستفاده میشود CI/CD در گردشهای کاری، فرآیند ساخت خود را در معرض خطرات deserialization ناامن قرار میدهید. این اتفاق اغلب در مورد متادیتای مصنوعات، ابزارهای تست و اسنپشاتهای پیکربندی رخ میدهد.
مشترک CI/CD دامها:
- تولید مصنوعات ناامن: مصنوعات ساخت شامل اشیاء سریالی شدهای هستند که بدون اعتبارسنجی، در کارهای مختلف دوباره استفاده میشوند.
- متغیرهای محیطی سریالی شده: تیمها متغیرهای محیطی را به صورت JSON سریالی شده ذخیره میکنند و از آنها در مراحل یا حتی پروژهها استفاده مجدد میکنند.
- دادههای آزمایشی تزریقشده: دادههای آزمایشی از منابع غیرقابل اعتماد، سریالزدایی شدهاند commitیا شاخههایی که بدون بررسی نوع اجرا میشوند.
این الگوها، تزریق بار داده (payload) به سرورهای مورد اعتماد را برای مهاجمان آسان میکنند. pipelineاز منطق رشتهای دستکاریشدهی JSON استفاده میکند.
⚠️هشدار:این گردش کار، دادههای سریالیشده را بدون اعتبارسنجی ارسال میکند. اگر test-runner.js ورودی را اعتبارسنجی نکند، خطر deserialization ناامن وجود دارد.
If اجرای تست.js بارگذاری و تجزیه JSON بدون اعتبارسنجی، میتواند باعث deserialization ناامن شود.
ایمنسازی JSON.stringify با اعتبارسنجی و تجزیه ایمن
راه حل، اجتناب از JSON.stringify نیست، بلکه استفاده دقیق از آن و اعمال مداوم بررسیهای امنیتی است. اگر به درستی مدیریت شود، ایمن است، اما در دنیای مدرن pipelineفرضیات سریع از بین میروند.
شیوههای DevSecOps برای ایمنسازی رشتهایسازی JSON:
- از طرحوارههای JSON برای اعتبارسنجی دادههای سریالیشده و از سریال خارجشده استفاده کنید.
- تایپ دقیق را اعمال کنید، از تایپ اردکی یا فرضیات در مورد شکل اشیاء خودداری کنید.
- از کتابخانههای تجزیه امن که از اجرای طرحواره یا محافظ نوع پشتیبانی میکنند، استفاده کنید.
- دادههای سریالی شده را حتی اگر از یک مخزن معتبر آمده باشند، به عنوان دادههای غیرقابل اعتماد در نظر بگیرید.
- ابزار pipelineبرای تشخیص زودهنگام الگوهای پرخطر JSON.stringify.
بهترین روش: این مثال از اعتبارسنجی طرحواره JSON برای جلوگیری از deserialization ناامن استفاده میکند. مثال با استفاده از ajv در Node.js:
از رده خارج کردن امن به معنای اعتبارسنجی است قبل از اعتماد. به JSON تکیه نکنید. پیشفرضها را برای حفظ امنیت خود رشتهای کنید؛ تعریف کنید که امنیت چگونه باشد.
تشخیص خطرات سریالسازی با Xygeni
حسابرسی دستی فقط تا حدی میتواند اطلاعات را جمعآوری کند. شیگنی قابلیت مشاهده نحوه استفاده از JSON.stringify در سراسر کدبیس شما را فراهم میکند. pipelines.
کاری که Xygeni انجام میدهد:
- ردیابی ها رشتهایسازی JSON استفاده از کد منبع تا استقرار.
- جریانهای ناامن deserialization را، به ویژه در سراسر میکروسرویسها و pipeline مراحل
- سریالسازی دادههای ناامن مانند متغیرهای محیطی، ورودی کاربر یا مصنوعات را علامتگذاری میکند.
- هشدارهایی در مورد انحرافات الگو، که نشان میدهد چه زمانی دادههای سریالی تغییر شکل میدهند یا از مرزهای اعتماد عبور میکنند.
این نوع قابلیت مشاهده هنگام مواجهه با خطرات ناامن deserialization که توسط JSON.stringify ایجاد میشوند، به ویژه در موارد زیر بسیار مهم است: CI/CD سیستمهایی که در آنها دادههای سریالی سریع و بیصدا حرکت میکنند.
ایمنسازی JSON. stringify: شما Shield در برابر Deserialization ناامن
JSON.stringify به خودی خود ناامن نیست. اما وقتی بدون احتیاط استفاده شود، به دروازهای برای deserialization ناامن تبدیل میشود.
اگر شما یک توسعهدهنده هستید که با JSON کار میکنید:
- استفاده شما از آن را در سرویسهای مختلف بررسی کنید، pipelineها، و ابزارها.
- دادههای deserialized شده را به عنوان دادههای غیرقابل اعتماد در نظر بگیرید.
- اعتبارسنجی طرحواره را اعمال کنید، انواع را اعمال کنید و امنیت را در خود ادغام کنید CI/CD.
و به بهترین شیوهها اکتفا نکنید، از Xygeni برای ردیابی، شناسایی و متوقف کردن خطرات ناامن deserialization قبل از اینکه به مرحله تولید برسند، استفاده کنید. سریالسازی خنثی نیست. از آن استفاده کنید JSON. رشتهای کردن امن است.





