مقالات معمّقة حول التكنولوجيا التي تشكّل المستقبل.

عميل الـ API الخاص بك خزنة بيانات اعتماد: دقّقه

أمان عميل الـ API أهم مما تظن. تعلّم كيف تدقق أدوات المطورين على سطح المكتب بحثاً عن تثبيت الإضافات بصمت والتتبع وتسرب البيانات.

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

يفتح مطور عميل HTTP على جهاز Mac الخاص به. هذا كل شيء. لا نقرات، ولا نوافذ موافقة، ولا خانة "تفعيل ميزات الذكاء الاصطناعي". في اليوم التالي، يفشل وكيل البرمجة الخاص به في المصادقة أمام خادم MCP بعيد لم يُهيّئه أبداً، ويوجّه أعمال الـ API عبر مهارات لم يثبّتها أبداً، ويحمل خطاف بدء تشغيل موثوقاً تشفيرياً لم يوافق عليه أبداً. هذا ليس افتراضاً، بل ما تُظهره الأدلة في تقرير خطأ حديث وموثّق بدقة عن تطبيق Postman لسطح المكتب: تثبيت الإضافات تلقائياً في Codex وClaude Code، والكتابة في إعدادات الوكلاء العامة، ومحاولة وضع علامة "موثوق" على خطاف الجلسة الخاص به. إذا كان أمان عميل الـ API يهمك، فهذه الحادثة يجب أن تغيّر طريقة تعاملك مع كل أداة مطورين على سطح المكتب في جهازك.

ما الذي فعله تطبيق Postman لسطح المكتب فعلياً

تجاهل الضجيج وانظر إلى الأدلة الجنائية، فالمُبلِّغ قام بالعمل الذي لا يقوم به معظمنا. سجل Postman نفسه سجّل حدث auto-existing-upgrade: على تثبيت سطح مكتب موجود ومسجَّل دخوله، نفّذ سكربت وأبلغ عن claude-code:installed,codex:installed. دون أي مطالبة. أضاف إعداد Codex العام للمستخدم سوقاً جديداً يشير إلى مستودع git تابع لـ Postman، وإضافة مفعّلة، وسجل ثقة للخطاف. وأضافت إعدادات Claude Code إضافة مفعّلة وسجلات تثبيت بطوابع زمنية تتطابق مع النافذة الزمنية نفسها. وظهر ملف تنفيذي لـ Postman CLI في ~/.local/bin. وتم توجيه اتصال MCP بعيد إلى خوادم Postman، وهذا الاتصال فشل في المصادقة وأغرق السجلات بالأخطاء، وهذا هو السبب الوحيد الذي جعل المستخدم يلاحظ أي شيء.

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

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

لماذا عميل الـ API الخاص بك خزنة لبيانات الاعتماد

هذا الجزء الذي تقلل الفرق باستمرار من شأنه. عميل الـ API ليس محرر نصوص بزر إرسال. هنا تعيش رموز الـ bearer وكوكيز الجلسات وشهادات mTLS لعميل وأسرار OAuth وترويسات الطلبات الموقّعة. تُلصق فيه متغيرات البيئة التي تحتوي على روابط قواعد البيانات ومفاتيح الأطراف الثالثة. وإذا استخدمت صيغة القوالب مثل {{api_secret}}، فإن القيمة المحلولة تمر عبر التطبيق مع كل طلب، وقد تمر أيضاً عبر خط السجلات الخاص بالشركة المصنّعة حسب تصميم القياس عن بُعد لديها. أحد الممارسين الذين كانوا يحققون في امتثال HIPAA وجد بالضبط ذلك: قيم أسرار محلولة في حركة سجلات صادرة، مع تدهور أداء التطبيق عند حجب هذه النقطة. لا أستطيع التحقق من كل التفاصيل بشكل مستقل، لكنه يطابق النمط المعماري الذي رأيته في أدوات سطح مكتب "مفيدة" أخرى: تسجيل كامل للطلبات يُشحن كميزة.

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

إذا عاملت نموذج التهديد بصدق، فالنتيجة مزعجة: عميل الـ API على سطح المكتب يقع عند تقاطع الأسرار والوصول إلى الشبكة، وبشكل متزايد، مستويات تحكم الوكلاء. وهو يستحق نفس التدقيق الذي تمنحه لمدير كلمات المرور أو لمشغّل CI. قلّما يحظى بذلك التدقيق. هذه الفجوة هي ما تستغله هذه الحادثة، ولهذا يجب أن تكون الاستجابة إجرائية وليست عاطفية فقط.

لماذا تفشل خيارات إلغاء الاشتراك وإعدادات التبديل لدى المورّد

أول ما يتبادر إلى الذهن بعد حادثة كهذه هو البحث في تفضيلات التطبيق عن مفتاح القياس عن بُعد وتعطيله والمضي قدماً. رأيت فرقاً كاملة تفعل ذلك وتسميه معالجة. إنه مسرح لثلاثة أسباب.

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

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

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

لماذا تفشل عمليات التدقيق الأمني لمرة واحدة أيضاً

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

لقد احترقت بهذه الفجوة تحديداً. قبل سنوات وافقت على عميل مزامنة بعد مراجعة دقيقة: التقاط حركة نظيف، وأذونات معقولة، ولا آليات استمرارية. بعد ستة أشهر أضاف تحديث LaunchAgent ومستمعاً للمقبس. اكتشفنا ذلك فقط لأن حاسوباً محمولاً مع VPN متقطع ظل يُظهر محاولات اتصال غريبة في سجل الجدار الناري. لم يُعد أحد مراجعة أي شيء، لأن لا عملية لدى أحد تطلب ذلك. كانت الموافقة لقطة، والبرمجية كانت فيلماً.

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

عدسة مكبرة فوق لوحة دوائر مطبوعة بمسار واحد ينكسر عند حدود.
التدقيق في لحظة واحدة يرى اللوحة مرة واحدة، والسلوك يتغير في كل مرة يعمل فيها المحدّث.

كيف تدقق أدوات مطوري سطح المكتب فعلياً

المنهج العملي له ثلاثة محاور: خذ لقطة للحالة المهمة، وراقب الشبكة، واحتوِ ما لا تستطيع التحقق منه بالكامل. لا يتطلب أي من هذه الأدوات حلولاً للمؤسسات، بل يتطلب انضباطاً وحوالي ساعة من الإعداد.

اكتشف تثبيت الإضافات الصامت عبر لقطات الإعدادات

كل وكيل برمجة وكل أداة مطور على جهازك لديها مجموعة صغيرة من الملفات التي تحدد سلوكها: ~/.codex/config.toml، و~/.claude/settings.json ومجلد الإضافات، وإعدادات MCP، وملفات rc الخاصة بالصدفة، و~/Library/LaunchAgents، و~/.local/bin. هذه الملفات هي حدود الموافقة. أي شيء يعدّلها دون أن يسألك هو ما تحاول اكتشافه. لذلك قم بتجزئة هذه الملفات يومياً وقارن النتائج:

#!/usr/bin/env bash
# snapshot-agent-configs.sh — hash every file your agents and shells read,
# then diff against yesterday. Run from cron or launchd.
set -euo pipefail
SNAP_DIR="$HOME/.config-audit"
mkdir -p "$SNAP_DIR"
TODAY="$SNAP_DIR/$(date +%F).txt"
find \
"$HOME/.codex" \
"$HOME/.claude" \
"$HOME/.config" \
"$HOME/.local/bin" \
"$HOME/Library/LaunchAgents" \
-type f 2>/dev/null \
| sort \
| xargs shasum -a 256 > "$TODAY"
PREV=$(ls -t "$SNAP_DIR"/*.txt 2>/dev/null | sed -n '2p' || true)
if [ -n "${PREV:-}" ]; then
if ! diff -u "$PREV" "$TODAY" > "$SNAP_DIR/latest.diff"; then
echo "config drift detected — see $SNAP_DIR/latest.diff" \
| mail -s "agent config drift" you@example.com || \
cat "$SNAP_DIR/latest.diff"
fi
fi

هذا بسيط وهذا جيد. لو كان هذا السكربت يعمل على جهاز المُبلِّغ، لكانت تغيير Codex في config.toml وسجلات إضافة Claude الجديدة وملف CLI التنفيذي في ~/.local/bin ستظهر كلها في فرق واحد صباح اليوم التالي. نسبة الإشارة إلى الضجيج ممتازة لأن هذه المجلدات هادئة في الأصل، فتعديلاتك أنت هي التغييرات المشروعة الوحيدة، وأنت تعرف متى أجريتها. أضف إليه مخرجات launchctl list | grep -v com.apple ضمن نفس اللقطة، وستلتقط آليات الاستمرارية في اليوم الذي تظهر فيه أيضاً.

راقب الخروج إلى الشبكة، لا الملفات فقط

سلامة الملفات تخبرك بما تغيّر على القرص، لكنها لن تخبرك بما غادر المبنى. للخروج تحتاج رؤية لكل تطبيق على حدة. على macOS، سينبهك Little Snitch أو جدار LuLu الناري مفتوح المصدر عند كل اتصال صادر جديد لكل عملية، فأول مرة يحاول فيها محدّث Postman أو ملف CLI جديد الوصول إلى مضيف غير مألوف، ستحصل على مطالبة بدلاً من أمر منجز. على Linux، يؤدي opensnitch المهمة نفسها. وإذا أردت فحصاً يدوياً سريعاً لما يفعله تطبيق ثرثار الآن:

# Every established outbound connection, grouped by process
sudo lsof -iTCP -sTCP:ESTABLISHED -P -n | awk '{print $1, $9}' | sort | uniq -c | sort -rn
# Watch one vendor's traffic live (find the process name first)
sudo tcpdump -i any -n host mcp.postman.com

هناك أمران تبحث عنهما: وجهات لا علاقة لها بالوظيفة المعلنة للأداة، واتصالات تستمر عندما يكون التطبيق خاملاً. يجب أن يكون عميل HTTP هادئاً عندما لا تضغط على إرسال. ونقاط القياس عن بُعد ليست مدانة تلقائياً، لكن كما تُظهر قصة تحقيق HIPAA السابقة، ما يهم هو الحمولة. إذا كان عميلك يحلّ {{secrets}} على الجهاز ويسجّل التفاصيل الكاملة للطلب على الخادم، فإن "بيانات الاستخدام المجهولة" ليست مجهولة. الطريقة الوحيدة للتأكد هي الالتقاط والقراءة، ويفضل خلال جلسة حمّلت فيها عمداً رمز كاناري، أي بيانات اعتماد وهمية فريدة، في متغير بيئة، وراقبت إن كانت تعبر إلى أي مكان لا ينبغي أن تعبر إليه. رموز الكاناري تحوّل "نظن أنهم ربما" إلى "نعلم أنهم فعلوا".

احتوِ ما لا تستطيع الوثوق به بالكامل

المحور الأخير يقبل بأنك لن تلتقط كل شيء. لذلك قلّل نطاق الضرر. شغّل الأدوات كثيفة بيانات الاعتماد في حساب مستخدم نظام تشغيل مخصص أو في جهاز افتراضي خفيف، بحيث يتوقف وصولها إلى الملفات عند حافة الحاوية. يجعل كل من macOS وLinux إنشاء مستخدم ثانٍ رخيصاً، ويمكن لأدوات مثل firejail على Linux منع شجرات مجلدات كاملة لكل تطبيق. أبقِ أسرار الإنتاج الحقيقية بعيدة عن أدوات سطح المكتب تماماً: استخدم رموزاً قصيرة العمر، وحسابات خدمة محدودة النطاق، وتوقيعاً للطلبات ينتهي صلاحيته. إذا كانت الأداة تطلب بيانات اعتماد إنتاج طويلة الأمد كي تكون مفيدة، فهذا الطلب بحد ذاته نتيجة تدقيق. وسبق أن ناقشنا أن الاحتواء يتفوق على المراقبة عندما تكون تكلفة الخطأ عالية، وبالنسبة للوكلاء وللأدوات التي تُهيئها، فالاحتواء هو الطبقة التي تستمر في العمل في اليوم الذي تكون فيه المراقبة لديك نقطة عمياء.

كتيب استرجاع لحوادث الأدوات

عندما تكتشف شيئاً ما، فإن حذف التطبيق المخالف هو الخطوة الأولى من نحو ستّ خطوات. قائمة الإزالة التي اعتمدها مُبلِّغ Postman هي الشكل الصحيح، ويستحق أن تستوعبها قبل أن تحتاجها:

  1. احفظ الأدلة أولاً. انسخ السجلات والإعدادات وأرقام الإصدارات إلى مكان آمن قبل إلغاء التثبيت. كان main.log الخاص بـ Postman الدليل الدامغ هنا، وسكربتات الإزالة تحب حذفه.
  2. أزل التطبيق ومساعديه. حزمة التطبيق، إضافة إلى أي شيء أسقطه في ~/.local/bin وApplication Support والذاكرة المؤقتة.
  3. نظّف إعدادات الوكلاء. أزل إدخالات الأسواق، ومقاطع الإضافات المفعّلة، وتعريفات خوادم MCP، ومجلدات الإضافات المخزّنة من كل مضيف وكيل، وليس الواضح فقط.
  4. ألغِ سجلات الثقة. احذف أي إدخالات trusted_hash لخطافات لم توافق عليها. ثم افحص الخطافات الأخرى في الملف نفسه، فإذا تسلل واحد، تحقق من البقية.
  5. تحقق من آليات الاستمرارية. LaunchAgents وLaunchDaemons وعناصر تسجيل الدخول ومهام cron وإضافات ملفات rc الخاصة بالصدفة.
  6. دوّر كل ما مرّ عبره. أي بيانات اعتماد عاشت في بيئات الأداة أو مجموعاتها يجب اعتبارها مكشوفة. التدوير مزعج، لكن الاستجابة للحوادث أسوأ.
  7. تحقق من أن الإزالة ثابتة. أبقِ سكربت اللقطات يعمل لبضعة أسابيع. إعادة التثبيت بعلامة مختلفة نمط معروف.

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

شخص بظل يفصل كابلات عن معدات خادم ويلفها.
الاستجابة الجيدة للحوادث منهجية: احفظ، أزل، نظّف، دوّر، ثم تحقق.

الدرس الأكبر في أمان أدوات المطورين

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

استجابة السوق مرئية بالفعل، وهي مفيدة: عملاء الـ API المعتمدون على العمل دون اتصال والمتمحورون حول git، مثل Bruno وKreya وYaak، يشهدون لحظتهم تحديداً لأن نموذج ثقتهم واضح. ملفات في مستودعك، وطلبات من جهازك، ولا حاجة لحساب. عندما يكون تنسيق التخزين لدى الأداة مجلداً من ملفات نصية، فإن تدقيقها يعني git diff. هذا ليس حنيناً للماضي، بل معمارية أمنية. وحادثة سلسلة التوريد الخاصة بـ LiteLLM علّمت الدرس نفسه من جهة سجلات الحزم: القطع التي يمكنك فحصها وتثبيتها هي التي تستطيع الدفاع عنها.

الموافقة التي تعيش في علامة ميزة ليست موافقة. إذا كانت الأداة قادرة على تغيير ما تفعله دون تغيير رقم إصدارها، فموافقتك عليها لا تعني شيئاً.

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