فقط إذا أنشأته أنت بنفسك، على هاتفك القديم، مع هاتفك الجديد مُصوَّباً نحو الشاشة. أي شخص آخر يلتقط صورة لذلك الرمز، لأي سبب كان، يحصل على وصول دائم إلى كل رمز مصادقة ثنائية لكل حساب في الحزمة.
يتيح Google Authenticator وعدد من التطبيقات المتوافقة (Aegis، Raivo OTP، 2FAS) "تصدير" حسابات المصادقة الثنائية المُخزَّنة لنقلها إلى جهاز جديد. يتخذ التصدير شكل رمز QR مع URI يبدأ بـotpauth-migration://. داخل ذلك الـ URI حزمة protocol-buffer واحدة (مخطط Google's MigrationPayload) تحمل كل حساب دفعة واحدة: المُصدِر واسم الحساب والبذرة السرية والخوارزمية وعدد الأرقام والنوع (HOTP / TOTP) والعداد.
لم يكن التنسيق موثَّقاً في البداية، لكنه جرى هندسته عكسياً وأصبح تنسيق التبادل الفعلي للنسخ الاحتياطية للمصادقة الثنائية. تطبيقات المصادقة التابعة لجهات أخرى تتعرف على نفس الرمز وتستورده.
يمكن لرمز واحد أن يحتوي على عشرات الحسابات. الرمز لا يمكن تمييزه بصرياً عن رمز إعداد TOTP عادي؛ لا توجد علامة بصرية تُخبر المراقب العابر أنه يحمل الحزمة الكاملة.
لماذا رمز الحزمة الواحدة خطير بشكل استثنائي
رمز الإعداد العادي لـotpauth:// خطير إذا مسحته دون طلب، لكن نطاق الضرر حساب واحد. نطاق ضرر رمز التهجير هو كل حساب في برنامج المصادقة لديك. إذا التقط مهاجم صورة للشاشة التي تعرض هذا الرمز، فوق كتفك في مقهى أو عبر كاميرا مراقبة أو من خلال نافذة زجاجية شفافة، فإنه ينصرف بقدرة على تجاوز المصادقة الثنائية على كل حساب تغطيه الحزمة. وبشكل دائم. حتى تُغيّر كل بذرة يدوياً، وهو ما لا تُيسّره معظم الخدمات.
لا انتهاء لصلاحية الأسرار في الحزمة. خلافاً لرمز الجلسة (الذي ينتهي)، وخلافاً لرمز المفتاح العبوري (الذي يُستخدم مرة واحدة)، البذور في حزمة التهجير صالحة حتى تستبدلها خدمةً بخدمة.
هذا هو سبب بدء حكم ماسحنا على كل رمز otpauth-migration:// من مستوى خطير على الأرجح وثباته عليه بصرف النظر عن السياق. التنسيق سليم؛ نموذج التهديد هو وجود التنسيق نفسه.
جسم base64، بمجرد فكّ ترميزه، هو protocol-buffer لـMigrationPayload مع هذه الحقول عالية المستوى:
otp_parameters، متكرر. مدخل واحد لكل حساب.
version: إصدار المخطط.
batch_size: إجمالي عدد المقاطع حين يُقسَّم التصدير عبر رموز متعددة.
batch_index: موضع هذا المقطع.
batch_id: معرّف فريد يربط المقاطع معاً.
لكل مدخل في otp_parameters:
السر: بايتات البذرة الخام. هذه هي مادة المفتاح الفعلية.
الاسم: تسمية الحساب (مثلاً alice@acme.com).
المُصدِر: اسم الخدمة (مثلاً ACME، GitHub).
الخوارزمية: SHA1 / SHA256 / SHA512 / MD5.
الأرقام: 6 أو 8 أرقام لكل رمز.
النوع: TOTP (مستند إلى الوقت) أو HOTP (مستند إلى العداد).
العداد: قيمة العداد الحالية لمدخلات HOTP.
ما يُظهره ماسحنا، وما لا يُظهره عمداً
✓ يُظهر
لكل مدخل في الحزمة، يُظهر الحكم المُصدِر (ACME، GitHub، AWS)، واسم الحساب (alice@acme.com)، والخوارزمية (SHA1)، وعدد الأرقام (6)، والنوع (TOTP). إفصاح الحكم يقرأ "المنح في هذه الحزمة: ACME / alice@acme.com؛ GitHub / bob@github؛ AWS / root؛ ..." ليتمكن المستخدم الذي يُجري التهجير فعلاً من مراجعة القائمة قبل الاستيراد.
إصدار المخطط وفهرس المجموعة وحجمها ومعرّفها يُظهرون أيضاً؛ مفيد حين يُقسَّم التصدير عبر رموز متعددة.
✗ لا يُفكَّك أبداً
لا تُفكَّك بايتات secret الخام في مخرجات الحكم أبداً. يقرأها محللنا فقط للتحقق من أن كل مدخل صالح هيكلياً (السر موجود وغير فارغ)، ثم يتجاهل القيمة قبل بناء النتائج.
هذا مُثبَّت في مجموعة الاختبارات؛ نُغذّي المحلل ببيانات بروتوكول مُصنوعة يدوياً تحتوي على سلاسل كاشفة (SECRET_SEED_1، SECRET_SEED_2) ونُؤكد أن هذه السلاسل لا تظهر أبداً في مخرجات الحكم المُسلسَلة. أي تراجع هناك يُخفق في الاختبار المستمر.
متى (وكيف) تستخدمه
حالة الاستخدام المشروعة: تُرقّي من هاتف إلى آخر. يعرض الهاتف القديم رمز التهجير على شاشته لمدة 30 ثانية تقريباً. تطبيق المصادقة على الهاتف الجديد يُصوَّب نحو الشاشة ويستورد. لا أحد آخر في الغرفة. تحذف التصدير من الهاتف القديم بعد التأكد من اكتمال الاستيراد.
أوجه الخطر هي:
لقطات شاشة للرمز. لقطة شاشة محفوظة في صور مُزامَنة مع السحابة تضع الرمز على كل جهاز مُزامَن مع ذلك الحساب.
مشاركة الرمز عبر الدردشة. حتى لو للحظة، يستطيع أي شخص يصل إلى الدردشة (الآن أو لاحقاً) استخراج الحزمة.
نشر الرمز في خيط منتدى مساعدة. هذا يحدث أكثر مما تتوقع؛ يطلب الناس المساعدة ويُرفقون صورة تصديرهم من المصادق عن طريق الخطأ.
ملصقات عامة / لافتات تُعرَّف خطأً على أنها رموز إعداد. التنسيق لا يمكن تمييزه بصرياً عن رمز إعداد حساب واحد.
إذا كنت تشك في أن رمز التهجير قد تعرّض للاطلاع
تعامل مع الأمر باعتباره تسريب بيانات اعتماد عبر كل حساب في الحزمة. خطوات الاسترداد، بالترتيب:
سجّل الدخول إلى كل خدمة متأثرة وغيّر سر المصادقة الثنائية. تتيح معظم الخدمات ذلك من الحساب ← الأمان ← المصادقة الثنائية ← تعطيل ثم إعادة التسجيل.
للخدمات التي لا تُتيح الاستبدال (نادرة لكن موجودة)، أزل الحساب وأضفه من جديد.
راجع نشاط تسجيل الدخول الأخير على كل حساب متأثر.
احذف رمز التصدير الأصلي من كل جهاز ومكتبة صور مُزامَنة مع السحابة قد تحتوي عليه.
مهاجم يمتلك الحزمة يستطيع إنتاج رموز مصادقة ثنائية صالحة لسنوات حتى تُغيّر. لا تُؤجّل.