
اختبارٌ مغلقأمانٌ أسريّ · Google Playدراسةُ حالة
تتبُّع
تطبيقُ موقعٍ لا يستطيع غريبٌ قراءتَه — مُثبَتٌ بفحوصٍ وطفراتٍ لا بوعد.
١٤ دقيقةمراجعةُ Playكيف قِيس هذا
وقتُ الإرسال ١٠:٢٢ ووقتُ الإصدار ١٠:٣٦، وكلاهما مسجَّلٌ في سجلّ الإصدارات.
١٧٦دولةً في الاختبار المغلقكيف قِيس هذا
قائمةُ الدول المختارة في الإصدار: ١٧٦ دولةً مع خيار بقيّة العالم.
٠١لماذا هذا بالذات صعب
تطبيقُ الأمان الأسريّ يحمل أخطرَ حقلٍ في برمجيّات المستهلك: موقعَ طفلٍ لحظيًّا. وكلُّ ميزةٍ سواه عاديّة؛ وهذا الحقلُ وحدَه يحوّل الخللَ البرمجيَّ إلى خطرٍ جسديّ.
والعطبُ المعتادُ ليس اختراقًا مدوّيًا، بل استعلامٌ عاديٌّ نُسي فيه مرشِّح، في شيفرةٍ يسكن قرارُ الأمن فيها طبقةَ التطبيق ويتكرّر في أربعين موضعًا.
٠٢الشرطُ الذي ألزمتُ نفسي به
الصلاحيّةُ لا تسكن التطبيق، بل قاعدةَ البيانات، سياساتِ أمانٍ على مستوى الصفّ (RLS)؛ فمرشِّحٌ منسيٌّ في شيفرة العميل لا يوسّع وصولًا — القاعدةُ ببساطةٍ لا تُرجع شيئًا.
ومقرُّ البيانات اختيارٌ مقصود: Supabase في الاتّحاد الأوروبيّ (فرانكفورت)، تحت نظامٍ له جوابٌ واضحٌ عمّن يملك إلزامَ الإفصاح.
٠٣القرارات
كلُّ جدولٍ يمنع افتراضًا. والوصولُ يُمنح بسياسةٍ صريحةٍ لكلّ صفٍّ ولكلّ دور. ولا وجودَ في الموضع كلِّه لاختصار «المستخدمون الموثَّقون يقرؤون».
العميلُ يُعامَل معاملةَ العدوّ. فلا يُؤتمَن شيءٌ يرسله التطبيق في تحديد هويّة السائل؛ والهويّةُ تؤخذ من الجلسة الموثَّقة في جهة الخادم.
إقراراتُ المتجر كُتبت قبل الميزات. نوعُ خدمة المقدّمة ومبرِّرُ الموقع الخلفيّ صُمّما داخل البناء، ولذلك لم تكن المراجعةُ مفاوضة.
٠٤كيف تحقّقتُ منه
النظرُ ليس دليلًا. فكتبتُ ٢٥ فحصًا على مستوى SQL تحاول، بكلّ دورٍ على حدة، عينَ ما يجب أن يفشل من قراءةٍ وكتابة — وتؤكّد أنّه فشل.
ثمّ هاجمتُ سياساتي: ٣٤ طفرةً تُضعف قواعدَ الأمن واحدةً واحدةً عمدًا، وكان على الفحوص أن تكشفها جميعًا. وطبقةُ سياسةٍ تصمد للطفرات هي طبقةٌ حاملةٌ فعلًا.
وكشف هذا المنهجُ فجواتٍ حقيقيّةً لم تكشفها قراءةُ السياسات. واثنتان تستحقّان التسمية لأنّ النظر أعمى عنهما: دالّةٌ ظلّت قابلةً للنداء عبر منحة PUBLIC الافتراضيّة في Postgres بعد سحبها من دور التطبيق — وهي الدالّةُ التي بدأت بها هذه الصفحة؛ وحارسٌ يقارن استخراجًا من JSON بـ<>، وهي تعطي NULL لا «خطأ» عند غياب المفتاح — فحصٌ يمرّر كلَّ شيءٍ بصمت.
٠٥النتيجة
اجتاز مراجعةَ Google Play في ١٤ دقيقة، ومعها صنفا الإقرار اللذان يعطّلان الإصداراتِ غالبًا.
وفُتح للاختبار المغلق في ١٧٦ دولة، بإفصاحٍ كاملٍ لأمان البيانات وإدراجٍ في فئة «الأبوّة».
٠٦ما كنتُ سأغيّره — وما لا يزال يكلّفه
نمت حزمةُ الفحوص بعد السياسات لا معها. ولو كُتبت أوّلًا لأمسكت بالعطبين قبل أن يبلغا ترحيلًا أصلًا.
والمقرُّ في فرانكفورت صوابٌ للخصوصيّة وخطأٌ لزمن الاستجابة من الخليج. وهي مقايضةٌ تعمّدتُها وأعيدها — لكنّها مقايضة، لا مكسبٌ بلا ثمن.
٠٧لقطات١٠
بياناتٌ تجريبيّةمُلتقطةٌ على بناء الإصدار 1.0.14 لأندرويد في محاكٍ، بحساباتِ فحصٍ ورحلةٍ اصطناعيّة — لا يظهر موقعُ أيّ أسرةٍ حقيقيّة.
٠٨ما يمكنك التحقّق منه بنفسك
كلُّ سطرٍ هنا مصدرٌ تفتحه أو طريقةٌ تكرّرها.
- الرابطفي اختبارٍ مغلقٍ على Google Play وTestFlight — لم يُنشر للعموم بعد.
- مقيس١٤ دقيقة زمن مراجعة Google Playوقتُ الإرسال ١٠:٢٢ ووقتُ الإصدار ١٠:٣٦، وكلاهما مسجَّلٌ في سجلّ الإصدارات.
- مقيس١٧٦ دولةً في الاختبار المغلققائمةُ الدول المختارة في الإصدار: ١٧٦ دولةً مع خيار بقيّة العالم.
- اللقطات١٠ لقطاتمُلتقطةٌ على بناء الإصدار 1.0.14 لأندرويد في محاكٍ، بحساباتِ فحصٍ ورحلةٍ اصطناعيّة — لا يظهر موقعُ أيّ أسرةٍ حقيقيّة.
تحدّث معي عن هذا المشروع
للمحكّمين والمرشدين وفرق الأمن السيبرانيّ — واتساب والبريد يصلان إليّ مباشرةً، وأردّ بنفسي. يسعدني الإرشاد والانضمام إلى برامج الأمن السيبرانيّ.