اختبار أمان التطبيقات الثابت (SAST)
فهم SAST: الأمان على مستوى الكود
3 دقيقة للقراءة
اختبار أمان التطبيقات الثابت (SAST) يحلل الكود المصدري للعثور على الثغرات الأمنية دون تنفيذ التطبيق. فكر فيه كمدقق إملائي للأمان—يقرأ كودك ويشير إلى المشاكل المحتملة.
كيف يعمل SAST
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ الكود المصدر│ ──▶ │ محرك SAST │ ──▶ │ التقرير │
│ (.py, .js) │ │ (محلل + │ │ (الثغرات + │
│ │ │ قواعد) │ │ المواقع) │
└─────────────┘ └──────────────┘ └─────────────┘
أدوات SAST:
- تحلل كودك إلى شجرة تركيب مجردة (AST)
- تطبق قواعد لاكتشاف الأنماط الضعيفة
- تقدم تقريراً بالنتائج مع مواقع الملفات ونصائح المعالجة
ما يجده SAST
| نوع الثغرة | مثال | كشف SAST |
|---|---|---|
| SQL Injection | query = "SELECT * FROM users WHERE id=" + user_input |
مطابقة الأنماط على ربط السلاسل في الاستعلامات |
| XSS | innerHTML = userInput |
تتبع البيانات غير الموثوقة إلى نقاط DOM |
| الأسرار المشفرة | api_key = "sk-1234abcd" |
أنماط regex لصيغ مفاتيح API |
| اجتياز المسار | open(user_path) |
تتبع مدخلات المستخدم لعمليات الملفات |
| إلغاء التسلسل غير الآمن | pickle.loads(data) |
استدعاءات دوال خطرة معروفة |
SAST مقابل DAST: نهجان متكاملان
| الجانب | SAST | DAST |
|---|---|---|
| متى | قبل وقت التشغيل (مرحلة البناء) | أثناء وقت التشغيل (مرحلة الاختبار) |
| ما يراه | الكود المصدري | التطبيق قيد التشغيل |
| التغطية | جميع مسارات الكود | فقط المسارات المنفذة |
| الإيجابيات الخاطئة | أعلى (بدون سياق وقت التشغيل) | أقل (يتحقق من الاستغلال) |
| السرعة | سريع (دقائق) | أبطأ (ساعات) |
| اللغات | خاص بلغة معينة | لا يعتمد على اللغة |
أنواع تحليل SAST
1. مطابقة الأنماط
كشف بسيط قائم على regex:
# مكتشف بنمط: password\s*=\s*["'][^"']+["']
password = "hardcoded123" # SAST يشير إلى هذا
2. تحليل تدفق البيانات
يتتبع البيانات من المصادر إلى المصارف:
# المصدر: مدخلات المستخدم
user_input = request.args.get('query')
# ... الكود ...
# المصرف: استعلام قاعدة البيانات (SAST يتتبع التدفق)
cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")
3. تحليل تدفق التحكم
يفهم مسارات التنفيذ:
def process(data):
if validate(data): # مسار آمن
safe_process(data)
else:
# SAST يعرف أن هذا المسار موجود
unsafe_process(data) # قد يشير إلى هذا
قيود SAST
كن على دراية بما لا يستطيع SAST فعله:
- سلوك وقت التشغيل: لا يكتشف المشاكل التي تظهر فقط أثناء التشغيل
- عيوب منطق الأعمال: لا يفهم قصد تطبيقك
- مشاكل التكوين: عادةً يركز على الكود، ليس ملفات التكوين
- الكود مغلق المصدر من الطرف الثالث: يمكنه فقط تحليل المصدر الذي تقدمه
اختيار نتائج SAST للعمل عليها
ليست كل النتائج متساوية. رتب الأولويات حسب:
- الخطورة: حرج > عالي > متوسط > منخفض
- الثقة: النتائج عالية الثقة أكثر احتمالاً أن تكون إيجابيات حقيقية
- قابلية الاستغلال: هل يمكن للمهاجم الوصول لهذه الثغرة؟
- حساسية البيانات: هل هذا يؤثر على PII أو بيانات الاعتماد أو البيانات المالية؟
بعد ذلك، سنستكشف أفضل أدوات SAST ومتى تستخدم كل منها. :::