Ushbu bo'limda insecure deserialization nima ekanini va u vebsaytlarni qanday qilib yuqori jiddiylikdagi hujumlarga ochib qo'yishini ko'rib chiqamiz. PHP, Ruby va Java deserializatsiyasi misollarida keng qo'llaniladigan usullarni ko'rsatamiz va o'z saytlaringizda bu zaifliklardan qochish yo'llarini beramiz.

Serializatsiya — murakkab ma'lumot tuzilmalarini (obyektlar va ularning maydonlarini) ketma-ket bayt oqimi sifatida yuborish va qabul qilish mumkin bo'lgan "yassiroq" formatga aylantirish jarayoni. Bu murakkab ma'lumotni faylga yoki bazaga yozishni, hamda tarmoq orqali yoki API chaqiruvida yuborishni ancha osonlashtiradi. Muhimi: obyekt serializatsiya qilinganda uning holati ham saqlanadi — ya'ni obyekt atributlari o'z qiymatlari bilan birga saqlanib qoladi.
Deserializatsiya — bu bayt oqimini asl obyektning to'liq ishlaydigan, aynan serializatsiya qilingan paytdagi holatidagi nusxasiga qayta tiklash jarayoni. Vebsayt logikasi keyin bu deserializatsiya qilingan obyekt bilan xuddi boshqa obyekt kabi ishlashi mumkin.

Ko'p dasturlash tillari serializatsiyani tabiiy qo'llab-quvvatlaydi. Asl obyektning barcha atributlari, jumladan maxfiy (private) maydonlar ham serializatsiya qilingan oqimda saqlanadi. Maydon serializatsiya qilinmasligi uchun u klass e'lonida "transient" deb belgilanishi kerak. E'tibor bering: serializatsiya ba'zi tillarda boshqacha ataladi — Ruby'da marshalling, Python'da pickling.
Insecure deserialization — vebsayt foydalanuvchi boshqaradigan ma'lumotni deserializatsiya qilishidir. Bu hujumchiga serializatsiya qilingan obyektlarni manipulyatsiya qilib, ilova kodiga zararli ma'lumot uzatishga imkon beradi. Hatto serializatsiya qilingan obyektni butunlay boshqa klass obyekti bilan almashtirish ham mumkin. Vebsaytga mavjud har qanday klass obyekti, kutilgan klassdan qat'i nazar, deserializatsiya qilinadi va instansiyalanadi. Shu sabab insecure deserialization ba'zan "object injection" zaifligi deb ataladi.
Kutilmagan klass obyekti istisnoga sabab bo'lishi mumkin, lekin bu paytga kelib zarar allaqachon yetkazilgan bo'lishi mumkin. Ko'p deserializatsiyaga asoslangan hujumlar deserializatsiya tugashdan oldin yakunlanadi — ya'ni deserializatsiya jarayonining o'zi hujumni boshlab yuborishi mumkin. Shu sabab kuchli tiplashgan (strongly typed) tillarga asoslangan saytlar ham bu usullarga zaif bo'lishi mumkin.
Insecure deserialization odatda foydalanuvchi boshqaradigan ma'lumotni deserializatsiya qilish qanchalik xavfli ekanini umumiy tushunmaslik sababli yuzaga keladi. Ideal holatda foydalanuvchi kiritmasi umuman deserializatsiya qilinmasligi kerak. Ba'zan sayt egalari deserializatsiya qilingan ma'lumotga qandaydir qo'shimcha tekshiruv qo'shsa, o'zlarini xavfsiz deb o'ylaydi. Bu ko'pincha samarasiz, chunki tekshiruv ma'lumot deserializatsiya qilingandan keyin bajariladi — ko'p holatda bu hujumning oldini olish uchun juda kech bo'ladi.
Zamonaviy saytlardagi ko'p sonli bog'liqliklar (dependencies) ham bu hujumlarni mumkin qiladi. Tipik sayt ko'p kutubxonani qo'llaydi, ularning har biri o'z bog'liqliklariga ega — bu boshqarish qiyin bo'lgan ulkan klass va metodlar to'plamini yaratadi. Qisqasi, ishonchsiz kiritmani xavfsiz deserializatsiya qilib bo'lmaydi deyish mumkin.
Insecure deserialization ta'siri juda jiddiy bo'lishi mumkin, chunki u hujum yuzasini keskin oshiradi. U hujumchiga mavjud ilova kodini zararli tarzda qayta ishlatishga imkon berib, ko'plab boshqa zaifliklarga, ko'pincha masofaviy kod bajarishga (RCE) olib keladi. RCE mumkin bo'lmagan holatda ham insecure deserialization imtiyoz oshirish, ixtiyoriy faylga kirish va DoS hujumlariga olib kelishi mumkin.
Serializatsiya va deserializatsiya asoslarini bilib olganingizdan so'ng, insecure deserialization zaifliklarini qanday ekspluatatsiya qilishni ko'rib chiqishimiz mumkin. Batafsil: Insecure deserialization zaifliklarini ekspluatatsiya qilish.
Umuman olganda, foydalanuvchi kiritmasini deserializatsiya qilishdan, agar mutlaqo zarur bo'lmasa, qochish kerak. Agar ishonchsiz manbalardan ma'lumotni deserializatsiya qilish kerak bo'lsa, uning buzilmaganini tekshirish uchun mustahkam choralar (masalan raqamli imzo) qo'shing — lekin har qanday tekshiruv deserializatsiya jarayoni boshlanishdan OLDIN bajarilishi kerak. Iloji bo'lsa umumiy (generic) deserializatsiya funksiyalaridan butunlay qoching va o'z klassga xos serializatsiya metodlarini yarating. Nihoyat, zaiflik — foydalanuvchi kiritmasini deserializatsiya qilish ekanini unutmang, testda topgan gadget chain'larni yo'qotishga tayanmang.