واجهة GraphQL للغربان فيها حقل استعلام لا تعرضه الواجهة لكن الاستكشاف introspection مفعل فيكشف المخطط كامل الحقول ومنها الحقل المخفي الذي يحمل سرا
مستكشف GraphQL على api.ravens.lab. الاستعلام الافتراضي يسأل المخطط عن أنواعه وحقوله حقل واحد من حقول Query لا تستدعيه الواجهة أبدا لكنه موجود ويعيد سرا
لماذا نجح الحل
الاستكشاف يكشف كامل المخطط بما فيه الحقول غير المعلنة في الواجهة والاعتماد على إخفاء الحقل في الواجهة أمن بالغموض الحل تعطيل الاستكشاف في الإنتاج وفرض تفويض على كل حقل
السبب الجذري
الاستكشاف مفعل في الإنتاج فيكشف الحقول المخفية والحقل بلا تفويض الجذر الاعتماد على خفاء الحقل بدل حمايته
كيف يصلح الكود
عطل الاستكشاف في الإنتاج وافرض تفويضا على كل حقل لا تعتمد على إخفائه
الكود المصاب
// Introspection on, and the hidden field relies on the UI not calling it.
const server = new ApolloServer({ schema, introspection: true });
الكود الآمن
// Introspection off in production, and every resolver checks authorization.
const server = new ApolloServer({ schema, introspection: !isProd });
// secretNote: (p, a, ctx) => { requireRole(ctx, 'admin'); return note; }
الأثر في الواقع
الاستكشاف يرسم للمهاجم خريطة كاملة للواجهة ويكشف عمليات وحقولا حساسة لم تقصد الواجهة إظهارها
كيف يكتشفها المدافعون
المدافع يعطل الاستكشاف في الإنتاج ويفرض تفويضا على كل حقل ويرصد استعلامات __schema من العملاء