#!/bin/bash
set +e
L=$HOME/can_bcm_verify.log; : > "$L"
E(){ echo "$@" | tee -a "$L"; }
S(){ echo; echo "════════ $* ════════" | tee -a "$L"; }

S "1. هوية النظام"
E "date: $(date -u)"
E "hostname: $(hostname)"
E "kernel: $(uname -r)"
E "uptime: $(uptime)"
E "distro: $(grep PRETTY_NAME /etc/os-release)"

S "2. وحدة CAN BCM — الحضور"
if lsmod | grep -q "^can_bcm"; then
  E "[★] can_bcm محمّلة فعلاً في النواة"
  lsmod | grep -E "^can_bcm|^can " | tee -a "$L"
else
  E "[ ] can_bcm غير محمّلة حالياً"
fi

S "3. ملف الوحدة على القرص"
ls -la /lib/modules/$(uname -r)/kernel/net/can/can-bcm.ko 2>&1 | tee -a "$L"
modinfo can_bcm 2>&1 | tee -a "$L"

S "4. دعم النواة في الترجمة"
grep -E "CONFIG_CAN|CONFIG_CAN_BCM" /boot/config-$(uname -r) 2>/dev/null | tee -a "$L"

S "5. الـ API — هل يمكن لـ uid 1000 استخدام CAN_BCM؟"
python3 - <<'PY' 2>&1 | tee -a "$L"
import socket, os, errno
# CAN_BCM = 2 (protocol number)
# PF_CAN = 29
try:
    s = socket.socket(29, socket.SOCK_DGRAM, 2)
    print("[★] socket(PF_CAN, SOCK_DGRAM, CAN_BCM) نجح — API متاح لـ uid", os.getuid())
    s.close()
except OSError as e:
    print("[-] فشل:", e)
    if e.errno == errno.EPERM:
        print("    → EPERM: يحتاج CAP_NET_RAW أو السياسة تمنع")
    elif e.errno == errno.EAFNOSUPPORT:
        print("    → EAFNOSUPPORT: PF_CAN غير مسجل")
    elif e.errno == errno.EPROTONOSUPPORT:
        print("    → EPROTONOSUPPORT: CAN_BCM غير مسجل")
PY

S "6. نطاق CVE-2026-17523 الرسمي"
E "الأصل: net/can/bcm.c — bcm_tx_setup / bcm_release UAF"
E "النطاق: kernel 4.15.0-213 ضمن نطاق المحتمل (Red Hat أكد PoC على 4.18)"
E "الإصلاح: kernel 4.19.325 / 5.10.246 / 5.15.198 / 6.1.140 / 6.6.110 / 6.12.55 / 6.17.5"
E "نواتك: $(uname -r) — لم يُصلح (لا تحديث لـ 4.15 EOL)"
E "ubuntu EOL: 18.04 = أبريل 2023"

S "7. كشف أدلة إضافية"
E "userns: $(cat /proc/sys/kernel/unprivileged_userns_clone 2>/dev/null)"
E "ptrace_scope: $(cat /proc/sys/kernel/yama/ptrace_scope 2>/dev/null)"
E "dmesg_restrict: $(cat /proc/sys/kernel/dmesg_restrict 2>/dev/null)"
E "kptr_restrict: $(cat /proc/sys/kernel/kptr_restrict 2>/dev/null)"
E "randomize_va_space: $(cat /proc/sys/kernel/randomize_va_space 2>/dev/null)"
E "SMAP/SMEP على المعالج:"
grep -oE "smep|smap" /proc/cpuinfo | sort -u | head -4 | sed 's/^/   /' | tee -a "$L"

S "8. حالة تحديث النواة"
apt-cache policy linux-image-generic 2>/dev/null | head -4 | tee -a "$L"
apt list --upgradable 2>/dev/null | grep -i "linux-image" | tee -a "$L"

S "9. تقييم الفئة"
E "[★] kernel في نطاق CVE-2026-17523 المحتمل"
E "[★] can_bcm مثبتة في صورة النواة"
E "[★] لا يوجد إصلاح لـ 4.15 (EOL)"
E "[?] الإصابة الفعلية تحتاج PoC — لم يُنشر علناً بعد"
E "[?] هجوم من uid 1000 يتطلب CAP_NET_RAW (root only)"

S "10. توصية للمالك"
E "أ. ترقية النواة أو التوزيعة كاملة (4.15 → 5.15 LTS على الأقل)"
E "ب. أو: تعطيل الوحدة بشكل دائم"
E "   echo 'blacklist can_bcm' | sudo tee /etc/modprobe.d/blacklist-can.conf"
E "   sudo update-initramfs -u"
E "ج. أو: منع تحميل can_bcm لمن لا يحتاجه"
E "   echo 'install can_bcm /bin/false' | sudo tee -a /etc/modprobe.d/blacklist-can.conf"

S "11. تفاصيل الإصدار"
E "vermagic:"
modinfo can_bcm 2>/dev/null | grep -E "vermagic|srcversion" | tee -a "$L"

E "log: $L ($(wc -l < $L) lines)"
S "DONE"
