Angular يصلح ثغرة prototype pollution في TransferState على ثلاثة إصدارات في يوم واحد
نشر الإصلاح على إصدارات قديمة في اليوم نفسه تقدير من الفريق لخطورته، وأي تطبيق Angular يعمل بـ SSR معني به مباشرة لا في موعد التحديث القادم.
نشر فريق Angular في 26 أغسطس 2026 ثلاثة إصدارات في اليوم نفسه: 22.1.4 و21.2.22 و20.3.30. وأهم بند فيها، بحسب سجل التغييرات، منع ثغرة من نوع prototype pollution في TransferState. ونشر إصلاح على إصدارات قديمة إلى جانب الإصدار الحالي يعكس تقدير الفريق لجدية المسألة.
ولفهم الثغرة يلزم فهم دور TransferState. فعند تشغيل التطبيق بنمط SSR، أي تجهيز الصفحة على الخادم، يرسل الخادم مع الصفحة البيانات التي استخدمها، حتى لا يعيد المتصفح طلبها. وتُوضع هذه البيانات في الصفحة بصيغة JSON، والجزء الذي يحملها اسمه TransferState. والمفتاح في هذا الـ JSON يمكن أن يكون أي نص.
وفي JavaScript توجد أسماء مفاتيح لها معنى خاص، أشهرها proto. فإذا أمكن كتابة مفتاح من هذا النوع في الـ state، لا تبقى الكتابة داخل الكائن المقصود، بل قد تصل إلى Object.prototype، أي إلى الأصل الذي ترث منه كائنات التطبيق كلها. وهذا ما يسمى prototype pollution: تغيير في مكان واحد يمتد أثره إلى أجزاء لا علاقة لها به.
والإصلاح سطر واحد، إذ صار الـ state يُنشأ عبر Object.create(null)، أي كائن بلا prototype أصلًا، فلا يبقى شيء يمكن تلويثه. وإلى جانب السطر في الـ commit تعليق ينص على أن المفتاح قد يكون أي نص، بما في ذلك أسماء خصائص الـ prototype.
وفي اليوم نفسه صدر إصلاحان آخران: أحدهما لتجنب تصادم أسماء مع خصائص الـ prototype في وحدتي common وcore، والآخر في platform-server لتجنب حذف مسافات Unicode أثناء معالجة الروابط، ونُشر هو أيضًا على الإصدارين الأقدم.
وبالنسبة للفرق التي تشغّل تطبيقات Angular بنمط SSR، يصبح هذا التحديث من النوع الذي لا يحتمل التأجيل إلى دورة عمل لاحقة.