قبل شهر ، في
حفل Droid التالي
، فحصت كبيرة المطورين Danila Fetisov بالتفصيل مبدأ الخدمة ، المسؤولة عن وظائف إمكانية الوصول في Android. سوف تتعلم كيفية استخدامه لتحسين إمكانية الوصول إلى مشاريعك ، بالإضافة إلى ثغرة خطيرة تسمى النقر السريع.
- اسمي Danila Fetisov ، أنا من مكتب Yandex في موسكو ، وبشكل أكثر تحديدًا من Taxi ، وبشكل أكثر تحديدًا من Taximeter. اليوم سنتحدث عن ماهية إمكانية الوصول إلى Android ولماذا قررت أن أسمي مثل هذا الشيء المقدس المقدس للأشخاص ذوي الإعاقة الذئب في ملابس الأغنام.

لذا ، مخطط التقرير. أولاً ، سنرى كيف يمكن استخدام هذا الشيء وإنشائه وتخصيصه. ربما سأخبرك ببعض الاختراقات في الحياة ، nishtyaks البقالة. ثم عن الأكثر إثارة للاهتمام - عن سبب خطورة هذا الشيء.

كيف يمكننا تطبيق هذا على الإطلاق؟ بشكل عام ، ما هو لمن لا يعرفون؟ أي أحداث تحدث في النظام ، تقع في خدمتنا ، ونحن نعالجها.
بمجرد أن يسقط شيء ما بالنسبة لنا ، يمكننا أخذ المحتوى من هناك وصوته باستخدام نفس Yandex SpeechKit أو Google Text-to-Speech أو أي شيء آخر تريده. ولكن ما هو أكثر إثارة للاهتمام ، لا يمكننا فقط تلقي ، ولكن أيضًا إلقاء حدث النظام. لا يزال بإمكانك قول شيء. ألقى الحدث ، وضغط على الزر ، وكل شيء على ما يرام ، استمتع بالحياة.
إذا تحدثنا عن هاتين النقطتين ، فإنهما في الواقع متخلفان. أطلقت Google هذه الميزة حتى يتمكن الأشخاص ذوو الإعاقة من استخدام تطبيقك. لكن كما يعلم الجميع ، نحن المطورين لا نريد أن نشعر بالملل: نجلس وننظر إلى الرمز ونفكر: كيف يمكننا تطبيقه؟ وننطلق.
الأتمتة والاختبار من خلال محاكاة إجراءات المستخدم والإعلان السياقي. أنت تفهم: نظرًا لأننا نحصل على محتوى من الشاشة ، يمكننا أن نفهم كيفية إحباط هذا المستخدم.
ما الشيء الآخر المثير للاهتمام؟ معالجة طلبات USSD. لسوء الحظ ، ظهرت واجهة برمجة التطبيقات العادية فقط من SDK السادس والعشرين ، ويحتاج المطورون بطريقة ما إلى البقاء. وتتخيل أنهم يقومون بتحليل طلبات USSD بشكل جدي ، ويحللون واجهات المستخدم باستخدام AccessibilityService.
النقطة السادسة هي القطع الناقص. لماذا؟ لأنه بعد هذا التقرير ، سيكون لديك فهم حول كيفية تطبيقه ولماذا. ثم تفتح تدفق الخيال الخاص بك حرفيا ، وتناول كوب من الشاي والقهوة ، وتوجه لترميز ميزاتهم الرائعة.
من أين تبدأ؟ ستكون الشريحة التالية شائعة بشكل مؤلم.

نأخذ خدمة ونرثها من AccessibilityService ونستمتع بالحياة.
ثم نلقي هذه الخدمة في Manifest ، وما هو المثير للاهتمام هنا؟ في الأساس سجل خدمة منتظم. ولكن انتبه إلى حقل التسمية. الآن لن أقول ما هو. تذكر ، سيكون هذا بعد ذلك بقليل.


علاوة على ذلك ، على طول Manifest لدينا فقط ملف تكوين ، ولا شيء مثير للاهتمام أيضًا.

وملف التكوينات نفسه يبدو أكثر فظاعة. من ما ستحتاجه على الأرجح ، 85-90 في المائة هو حقل إعدادات التصفية للأحداث الواردة.
لنفترض أن الأمر يستحق هنا أننا نريد استقبال جميع الأحداث على الإطلاق. يمكنك وضع فلتر فقط على النقرات أو تغيير المحتوى أو على شيء آخر.
التالي هو مرشح لحزم التطبيقات. ما هذا؟ أنت تفهم تمامًا أن تلقي الأحداث من جميع التطبيقات في النظام سيكون أكثر من اللازم لتطبيق واحد. لذلك ، قررت Google الحد منه بطريقة أو بأخرى. تمت إضافة عامل تصفية.
مزيد من الوصف. كان هناك حقل تسمية ، والآن استخدم الوصف. في الواقع ، ينشئون زوجًا ، يخبر المستخدم بعد ذلك لماذا تحتاج إلى تمكين الخدمة الخاصة بك.
والنقطة الأخيرة: المحتوى مطلوب أو غير مطلوب من النافذة المفتوحة الحالية. إذا كنت ترغب فقط في فهم حدوث حدث ، فقم بتعيينه على خطأ ولا تعذب المستخدم مرة أخرى.

إدراج الخدمة. لسوء الحظ ، لتمكين هذه الميزة ، سيكون عليك تعذيب المستخدم وإجباره على المرور عبر سبع دوائر من جحيم الإعدادات ، بشكل نسبي.
أولاً ، نفتح فرصًا خاصة له. Cool AccessibilityService - هذا هو بالضبط نفس التسمية من البيان ، الذي أخبرتك عنه في الشرائح السابقة.

أبعد. يحتاج المستخدم إلى اختيار خدمتك ، ثم يبدأ في قراءة الوصف ، لماذا تريد تمكين هذه الخدمة والحصول على بعض التحكم في الجهاز.

حسنًا ، يشمل. ولكن كان هناك. يخرج نوع من الحوار المخيف ، الذي يقول: "يا رجل ، إذا قمت بتشغيله الآن ، فسوف نتحكم بشكل كامل في طلبك ، نسبياً ، كل شيء سيكون مخيفًا." لا يقرأ المستخدمون كل هذا دائمًا ، ما عليك سوى النقر فوق "موافق" حتى نكون خلفهم. لذلك نحن نعيش.
حسنًا ، أين هي معالجة الحدث في الواقع؟ الشريحة التالية أذكى قليلاً من الشريحة الأولى حول الخدمة ، ولكن مع ذلك.

إليك خدمة DummyAccessibilityService ، ونحن نسقط طريقتين هناك ، حيث سنكتب كل شيء. في الواقع ، المقاطعة هي طريقة يجب عليك فيها تنظيف الروابط الخاصة بك ، أو إيقاف الاشتراكات ، أو أي شيء آخر.
الأكثر إثارة للاهتمام هو فئة AccessibilityEvent ، التي تقع على عاتقنا. ماذا يمكن أن نخرج منه؟

بادئ ذي بدء ، يمكننا أن نفهم ما حدث بالفعل في نظامك. نأخذ EventType ، وما الذي نحصل عليه هنا؟
ونجد أن لدينا نوعًا من النشاط مفتوحًا ، أو Dialog ، أو Popup ، أو بشكل عام انخفض الإشعار. كل شيء يقع هناك على window_state_changed.
نحن نفهم أيضًا أن محتوى بعض المشاهدات قد تغير. قاموا بنقله ، وألقوا بعض السطر في عرض النص أو شيء من هذا القبيل.
ثم نكتشف عندما ينقر المستخدم ، أو يختار طريقة عرض. في رأيي ، 85 ، وحتى 98 ، على الأرجح ، النسبة المئوية لمهام المنتج الرئيسية التي تغطيها مع أنواع الأحداث هذه.
ولكن إذا لم يكن لديك ما يكفي منها ، من فضلك ، يمكنك الذهاب إلى الوثائق ، وسأعرض لك رابطًا في نهاية التقرير ، وبطبيعة الحال ، ستقوم بتنزيل التقرير ، يمكنك المتابعة. إنها مجرد قراءة للمساء كله ، هناك قائمة ضخمة. بجدية ، لن تتقنها في وقت واحد.

الآن لدينا سؤال: كيف تجد وجهة نظر؟ اكتشفنا ما حدث. والآن دعنا نفهم بأي وجهة نظر ، مع أي مكون حدث هذا.
خذ AccessibilityEvent.
نأخذ Source منه ، وفويلا ، لدينا بالفعل عرض المعلومات الوصفية.
ولكن ماذا لو كنت مطورًا متشددًا ، وليس لديك معلومات كافية حول طريقة عرض واحدة ، فأنت تريد أن تفهم ما يحدث بشكل أساسي على الشاشة الآن؟ هناك قيود على SDK ولكنها صغيرة.

نأخذ AccessibilityService الخاص بنا ، ونحصل في الواقع على إشارة إلى العنصر الجذر في التسلسل الهرمي بأكمله على الشاشة الحالية. وعندها فقط نحصل على معلومات التعريف الخاصة بنا.

هذا بالطبع رائع ، ولكن الآن يجب أن يكون لديك سؤال في رأسك: حسنًا ، حصلنا على رابط إلى عنصر الجذر. ماذا نفعل بعد ذلك؟
إذا كنت تريد أن تسلك الطريق الآمن ، فالرجاء ، الخيار الأول. خذ طريقة عرض معرف ، وابحث عن طريقة واحدة فقط.
إذا كان يبدو لك أنه أمر ممل إلى حد ما ، فإن الصيد شيء أكثر متعة ، ثم نأخذ النص من العرض ، ونجده من النص.
إذا لم يكن هذا مثيرًا للاهتمام بما فيه الكفاية بالنسبة لك - حسنًا يا رفاق ، خذ الطفل والعودة ، امشي عليه. ثم ستفهم بالضبط ما يحدث.
عظيم. اكتشفت أنا وأنت كيفية العثور على طريقة عرض. كيف تتفاعل معها الآن؟
مرة أخرى ، نأخذ AccessibilityNodeInfo ، ونحن الآن نقوم بالفعل بإدخال الإجراء إليه. ما العمل الذي يمكن أن نرميه هناك؟

بادئ ذي بدء ، يمكننا رمي Click. لماذا في النهاية لم أضع هنا فقط بعد Click ، ولكن أيضًا Click and Select؟ نعم ، نظرًا لوجود مجموعة من الزوايا ، عندما لا يوفر لك النقر المعتاد. افترض أن مستخدمًا حدد نصًا ، وسيؤدي النقر على طريقة العرض إلى إزالة التحديد من هذا النص. أو ، في بعض الأجهزة ، من حيث المبدأ ، لا يمكن النقر فوق العرض حتى تقوم بالاتصال تحديد عليه. بشكل عام ، الكثير من المشاكل. وإذا كنت ترغب فقط في أخذ حمام بخار - فاختر ، ثم انقر. عملان ، وهذا كل شيء ، هناك سعادة.
ما هي الخطوة التالية معنا؟ ثم لدينا تثبيت النص. هنا ، أيضًا ، كل شيء بسيط. خذ Action_set_text ، وأنشئ حزمة مع خطنا ، وعش.
والنقطة الثالثة هي الذهاب إلى التوثيق. مرة أخرى ، هذه هي الليلة الثانية التي سيكون لديك. حفنة من الإجراءات مباشرة ، في رأيي ، أكثر من الأحداث.
مرحى! أكثر جزء ممل من التقرير قد انتهى. حان الوقت الآن لجميع أنواع nishtyachkov.
لنفترض أنك أنشأت خدمة ، وقمت بتكوينها ، وألقت نوعًا من معالجة الأحداث. الآن أنت بحاجة إلى فهم كيفية إجبار المستخدم ، وكيف تطلب منه الاستمرار في تمكين هذه الخدمة. لفهم ذلك ، تحتاج إلى معرفة ، من حيث المبدأ ، أن الخدمة قيد التشغيل الآن أم لا.

كل شيء بسيط لدرجة التفاهة. نأخذ AccessibilityManager ونطلبها لجميع الخدمات المضمنة حاليًا في النظام ، وهناك نجد خدماتنا.
لكن كل شيء سيكون بالطبع رائعًا إذا كان AccessibilityManager رجلًا عاديًا ، ولم يكن هناك مثل هذا الذي تسأله: "يا صاح ، أعطني ، من فضلك ، جميع الخدمات المتاحة" ، ويقول: "عذرًا ، أنا لست اليوم في المزاج. هذه قائمة فارغة لك ". وأنت جالس وتفكر: "اللعنة ، لقد تحدثنا بشكل طبيعي."

حسنًا ، هناك أصدقاء قديمون جيدون - هؤلاء هم الإعدادات. Secure.getInt و getString. نسأل أولاً ما إذا كانت الخدمات مدرجة في النظام. إذا تم تضمينه ، فسيتم إلقاء كل شيء في سطر واحد ، وهناك نبحث بالفعل عن خطنا من خلال نوع من المحتوى.
وهنا نلتقي بحقيقة أننا فعلنا كل شيء بشكل صحيح. لقد أنشأنا التكوين ، أنشأنا إنشاء أي أحداث ، وقمنا بتشغيل الخدمة. نرى على وجه اليقين أننا قمنا بتشغيل الخدمة ، ولا تصل إلينا الأحداث. وهكذا ، إما يصلون ، أو لا يصلون. في تلك اللحظة ، اعتقدت أنه في حياتي جاء نوع من الخط الأسود. الحق لم يكن هناك خيارات.
فكرت ، فكرت ، أعيدت تسويتها ، أعيد بحثها ، ثم بينجو ، أدركت أن هذا هو Xiaomi مع MIUI. هذا مجرد ألم الرجال! هذا أمر خطير.
حسنًا ، افهم ماهية المشكلة. كيف تحلها الآن؟ لسوء الحظ ، يتم عمل كل شيء على بعض البرامج الثابتة في MIUI بحيث إذا لم يكن تطبيقك في التشغيل التلقائي ، فلن يبدأ النظام حتى في الخدمة من حيث المبدأ.

ولكن هنا حل واحد - نطلب من المستخدم إضافة تطبيقك إلى البدء التلقائي ، ونستمر في العيش والاستمتاع بالحياة.

ثم جاء الكرز على الكعكة. لماذا هذه الخدمة لطيفة جدا لذوي الإعاقة ذئب في ثياب الاغنام؟
يبدو لي أن الكثير منكم قد خمن بالفعل أنه إذا قام المستخدم بتشغيل هذه الخدمة ، فيمكننا بسهولة سرقة الكثير من المعلومات السرية من جهازه. لا يمكننا فقط سرقتها ، بل يمكننا إسقاطها في مكان ما ، على سبيل المثال ، فتح الشاشة إذا كانت مقفلة باستخدام رمز PIN. حسنًا ، افتح الشاشة. ما هي الخطوة التالية؟ نحن نعلن عن أنفسنا ، وسنربح الكثير من المال ، وسنعيش على الفور. وفي النهاية ، يمكننا أساسًا تقليد أي إجراءات من جانب المستخدم تمامًا ، ونفترض أن نضع نوعًا من التطبيق ، وأن نعطي حقوق المشرف ، ونقول للمستخدم: "وداعًا. قل وداعا لجهازك ".

حسنًا ، يمكننا القيام بكل هذا ، ولكن الآن ستقول: "أنت ، بالطبع ، أحسنت. قال لنا كيف يمكننا سرقة أي نوع من البيانات. ولكن كيف تجعل المستخدم يشغل AccessibilityService الخاص بك ، وإذا كان التطبيق أعسر؟ " حسنًا ، المستخدم ، يبدو لي ، يفتح الإعدادات فقط ، ويدرك أن هناك نوعًا من الهراء المكتوب هناك ، ويغلق ، ويزيل التطبيق وينسى. كما تعلم ، ستكون على صواب في أن الطريقة الأولى للتشغيل من خلال إعدادات النظام تذهب إلى "لا" ، لأن ، كما تعلم ، هذا نوع من الهراء. وهنا تأتي نقطة ضعف لمساعدتنا ، والتي تسمى ، في جوهرها ، النقر فوق النقر. كم منكم على دراية بطرق النقر؟ عظيم ، سيكون مثيرا للاهتمام.
لذا ، استنادًا إلى هذه الثغرة الأمنية ، بعض الأشخاص - أضع مرجعًا صغيرًا ، لأن جميع لقطات الشاشة التالية ستكون من موارد هؤلاء الرجال - خرجوا بهجوم يسمى Cloak و Dagger. في الواقع ، مع أذنين فقط وحد أدنى من تفاعل المستخدم ، يمكنك الوصول إلى التطبيق بالكامل مباشرة من كلمة "تمامًا".
ولكن حسنًا ، ما الذي يتعين علينا فعله لاختراق المستخدم؟
نحن نرمي تطبيقنا على Google Play. نأمل أن يكون مستخدم إصدار Android أقل من 8.
أنت تفهم ، قليلاً - 95٪ في الوقت الحالي. هذا كل شيء ، يقوم المستخدم بتنزيل تطبيقنا.

باختصار ، تخبر هذه البرامج الضارة المستخدم كيف يصبح رجلًا جيدًا ، ويعرض مقطع فيديو في النهاية. الآن سترى كل شيء بنفسك.

حسنًا ، فلنبدأ. نص صغير. يقال لنا: "إذا بدأت البرنامج التعليمي الآن ، ستصبح شابًا جيدًا." حسنًا ، بالطبع ، نحن نبدأ.

بعض النصوص الأخرى. علاوة على ذلك ، سيتم تقديم الناس في شكل رجال أخضر. حسنًا ، حسنًا ، لننقر على التالي.

نص آخر. حسنًا ، حسنًا. الآن سأنتهي من قراءته وسأرى بالتأكيد مقطع فيديو سيخبروني فيه عن كيف أصبح شابًا جيدًا.


انقر فوق "موافق" ، ويبدأ الفيديو. هذا ليس مهم جدا بالنسبة لنا. من المهم ما حدث بالفعل على الجهاز في تلك اللحظة. يقوم المستخدم بتشغيل التطبيق ، ومنذ أن قمنا بتثبيته من Google Play ، يتم منحنا إذنًا تلقائيًا للتراكب. فويلا ، نفتح نافذة الوصول ، وعلى القمة فقط تراكب. ينقر المستخدم على بدء البرنامج التعليمي ، ولكنه في الواقع يختار خدمة إمكانية الوصول الخاصة بنا. حسنًا ، أنت تفهم ما هي الخطوة التالية.

بعد ذلك ، انقر فوق "التالي" ، وحدد مفتاح التبديل.

في النهاية ، نقوم بتشغيل AccessibilityService ، ولا يدرك المستخدم حتى أن هذا حدث.
هل تعرف ما هي المشكلة؟ يتم ترتيب التراكب بطريقة تجعله يمتص جميع الأحداث تمامًا ، أو كل اللمس بعيدًا بالفعل ، أو يخطئ تمامًا. والهدف من هذا الهجوم بالذات هو أننا نملأ تراكب الشاشة بأكملها باستثناء مسافة واحدة. في هذه الحالة ، هذا هو الزر "موافق". هذا الزر هو حقا من الحوار. عندما نضغط عليه ، نحصل على حدث يقول أن اللمس بالخارج حدث ، وكل شيء على ما يرام.
كيف تستجيب Google لكل هذه المشاكل؟ كما تعلمون ، هذه نقطة ضعف وحشية إلى حد ما.

بدأ كل شيء بشكل مثير للاهتمام - كل ذلك مع ثماني سنوات من الصمت. كشفت جوجل النقاب عن هذا الشيء الصغير ، قالت: "يا رفاق ، استخدموه. إنه آمن. أقول بالتأكيد ". حسنًا ، حسنًا. رمى جوجل. نفس الأشخاص الذين اخترعهم Cloak و Dagger ، ألقوا الدعم ، أصدروا متتبعات ، وتتبع الأخطاء.
ثم قالت جوجل ، "حسناً ، حسناً يا رفاق ، اهدأوا. سأغلق كليكجينغ في أوريو ". حسنًا ، أغلقه. ما زالوا يجلسون هناك ، يعتقدون: "حسنًا ، اللعنة ، يا شباب ، على الرغم من ذلك ، إذا أجبر المهاجمون المستخدم على تمكين إمكانية الوصول ، فسيكون ذلك سيئًا. دعونا نسخر من المطورين قليلا.
وأرسلوا رسالة: "افعلوا ذلك ، لا أعرف ماذا ، وإلا فسيتم حذف تطبيقك من Google Play". باختصار ، كانت الرسالة كما يلي: "يا شباب ، أخبرنا والمستخدمين لماذا تحتاج إلى AccessibiiltyService." كيف اقول؟ بأي تنسيق؟ الى اين؟ بشكل عام لا يوجد فهم. وفي الرسالة ، بالطبع ، لم يتم توضيح ذلك.
حسنًا ، حسنًا. خيوط ضخمة على reddit ، حفنة من الرسائل لدعم. ثم وضع بعض المطورين رسالة على reddit ، ويقول: "نعم هناك شباب ، لا شيء معقد. ضعه في الوصف الذي أظهرته لك ، بشكل واضح ، وضعه في الوصف على Google Play ، وكل شيء سيكون على ما يرام ، سأتركك وحدك ".
في تلك اللحظة فكرت: حسنًا ، حسنًا ، لقد وجدت هذه الرسالة على بعض هامش Reddit. ولكن ماذا لو كنت مطورًا شابًا ، فقد تعرفت للتو على AccessibilityService وأريد إصدار التطبيق بهذا؟ كيف يمكنني معرفة أنني بحاجة إلى تنفيذ مثل هذه الإجراءات ، هل أحتاج إلى إسقاطها في الوصف على Google Play ، وما إلى ذلك؟ فكرت ، فكرت ، بحثت ، بحثت ، وكما تعلمون ، يا رفاق ، لم أجد أي شيء ، من الكلمة على الإطلاق.
حسنا ، بجدية ، لا يوجد شيء. هناك فقط وصف في الوثائق الرئيسية: "يا شباب ، هذا محض للأشخاص ذوي الإعاقة ، هذه هي النقطة. لا يمكنك استخدام أي شيء آخر ". ولكن في الواقع ، اتضح أنه ممكن.

حسنًا ، لقد انتهينا أنا وأنت. ماذا يمكن ان نتحدث معك؟ تحدثنا عن كيفية استخدامه وفهم كيفية إنشائه بالكامل وتكوينه وفهم كيفية التعامل مع أحداث واجهة المستخدم. وبالطبع ، فهمنا كيف يمكن ذلك ، ولكنك لست بحاجة إلى التفاعل مع AccessibilityService. بالطبع ، لا أنصحك بالقيام بذلك ، فقد كان فقط للعلم. فيما يلي المصادر الموعودة:
-
developer.android.com/guide/topics/ui/accessibility/services-
developer.android.com/reference/android/view/accessibility/AccessibilityEvent-
developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo-
cloak-and-dagger.orgالرجال ، شكرا جزيلا لكم على اهتمامكم!