# Runbook معالجة اختراق الخادم — HalaVoice

> **الحالة:** اختراق مؤكّد موثّق في `CLAUDE.md` (cron خبيث يتصل بـ`cavsystem.com`، إعادة إنشاء مستخدم `pakchoi` بكلمة سر `Kermit123@` + sudoers NOPASSWD، ~50 مفتاح SSH في `/root/.ssh/authorized_keys`).
> **مبدأ أساسي:** التنظيف = **احتواء** وليس معالجة. الخادم المخترق على مستوى root لا يُوثَق به بعد التنظيف — الهدف النهائي **إعادة بناء نظيفة + تدوير كل بيانات الاعتماد**.
> كل الأوامر أدناه تحتاج **root** (المساعد لا يملك sudo ولا يمكنه تنفيذها).

---

## المرحلة 0 — لقطة أدلة قبل أي تغيير (اختياري لكن مُستحسن)
قبل التنظيف، احفظ حالة النظام للطب الجنائي:
```bash
sudo mkdir -p /root/ir-$(date -u +%Y%m%d)
cd /root/ir-$(date -u +%Y%m%d)
sudo crontab -l > root-crontab.txt 2>&1
sudo cp -a /var/spool/cron ./spool-cron 2>/dev/null
sudo cp -a /etc/cron.d /etc/crontab ./ 2>/dev/null
sudo cp -a /etc/sudoers.d ./sudoers.d 2>/dev/null
sudo cp -a /root/.ssh/authorized_keys ./root-authorized_keys 2>/dev/null
ps auxww > processes.txt; sudo ss -tlnp > listening.txt
sudo last -50 > last-logins.txt
```

## المرحلة 1 — التقييم (قراءة فقط)
```bash
cd /home/ashraffarid2010/halavoice.store
sudo bash ops/security-scan.sh          # يفحص cron/sudoers/users/ssh/preload/شبكة/temp
```
راجع كل سطر `[IOC]` و`[?]`. لا تُكمل حتى تفهم كل بند.

## المرحلة 2 — الاحتواء (يزيل مؤشرات عالية الثقة فقط، مع نسخ احتياطي)
```bash
sudo bash ops/security-scan.sh --clean   # يطلب تأكيد YES؛ يعزل cron الخبيث + sudoers المهاجم
```
> ⚠️ إن كانت crontab مُدارة عبر Puppet/إدارة مركزية فقد **يُعاد زرعها آليًا** — راقب بإعادة الفحص بعد ساعة، وصعّد للمضيف.

## المرحلة 3 — تدقيق الحسابات و SSH (يدوي — يحكم عليه البشر)
```bash
# حسابات بصلاحية UID 0 (يجب أن يكون root فقط)
awk -F: '($3==0){print $1}' /etc/passwd
# مستخدم التطبيق pakchoi: إن كان uid 0 فهذه مشكلة جسيمة (التطبيق يعمل بصلاحية جذر فعليًا)
id pakchoi 2>/dev/null
# حسابات بكلمات سر فارغة
sudo awk -F: '($2==""){print $1}' /etc/shadow
# مفاتيح SSH — احذف كل مفتاح لا تعرفه (خاصة الـ~50 في root)
sudo wc -l /root/.ssh/authorized_keys
sudo nano /root/.ssh/authorized_keys   # أبقِ مفاتيحك أنت فقط
# تعطيل تسجيل الدخول بكلمة السر و root عبر SSH (استخدم المفاتيح فقط)
# في /etc/ssh/sshd_config: PermitRootLogin prohibit-password ; PasswordAuthentication no
sudo systemctl restart sshd
```
**قرار مهم:** إن كان `pakchoi` بـUID 0 — احذفه/جمّده وشغّل التطبيق بمستخدم غير مميّز (المرحلة 5).

## المرحلة 4 — تدوير كل بيانات الاعتماد (افترض أن الكل تسرّب)
| البند | الإجراء |
|------|---------|
| كلمة سر قاعدة البيانات | `ALTER USER agentlabs PASSWORD '...';` ثم حدّث `.env` فقط (تم سابقًا — كرّر) |
| `SESSION_SECRET` / `JWT_SECRET` | `openssl rand -base64 48` لكل منهما في `.env` (ينهي كل الجلسات — متوقع) |
| مفتاح gh token | `gh auth logout && gh auth login` + إبطال القديم من GitHub |
| مفاتيح المزوّدين | جدّد وأبطِل القديم: **OpenAI، ElevenLabs، Twilio (Auth Token)، Plivo، Groq** |
| بوابات الدفع | Stripe / Razorpay / PayPal / Paystack / MercadoPago — أبطِل القديمة |
| SMTP | كلمة سر تطبيق جديدة |
| مفاتيح SSH الخاصة بك | ولّد زوجًا جديدًا وأبدله |

بعد التدوير: `pm2 restart agentlabs halavoice-whatsapp` والتحقق من الصحة.

## المرحلة 5 — تشغيل التطبيق بمستخدم غير مميّز (سدّ ثغرة جذرية)
التطبيق يجب ألا يعمل بصلاحية root/uid0 أبدًا. شغّله كـ`ashraffarid2010`:
```bash
# أوقف نسخة root من PM2 إن وُجدت daemon مزدوج (راجع WORK_SUMMARY: كان يوجد /root/.pm2 و /home/.pm2)
sudo -u ashraffarid2010 pm2 resurrect     # أو start ecosystem.config.cjs
sudo -u ashraffarid2010 pm2 save
sudo pm2 kill    # اقتل daemon الجذر بعد التأكد أن نسخة المستخدم تخدم كل شيء
```
تحقق أن مستمعًا واحدًا فقط على المنفذ 5003 وأنه يعمل بمستخدم غير جذر: `ss -tlnp | grep 5003`.

## المرحلة 6 — إعادة البناء النظيفة (الحل الجذري الوحيد)
1. **الكود من GitHub** (المصدر النظيف): `github.com/NewBabyFace/halavoice-store` — لا من نسخ المضيف الاحتياطية (قد تكون ملوّثة).
2. **قاعدة البيانات** من dump نزّلته محليًا وفحصته (تحوي PII — لا تُدفع لـgit).
3. خادم/حاوية جديدة نظيفة، ثبّت التبعيات من الصفر (`ops/setup-modules.sh`)، طبّق `.env` الجديد كليًا (كل الأسرار مُدوّرة).
4. صعّد للمضيف (Hostinger/cPanel) لتأكيد نظافة المستوى الجذري قبل التحويل.

## المرحلة 7 — مراقبة مستمرة
- `ops/security-scan.sh` يعمل يوميًا عبر `/etc/cron.d/halavoice-security-scan` → `logs/security-scan.log` — راجعه.
- نبّه على أي `[IOC]` جديد (بريد/واتساب).
- `npm audit` دوري + تحديث التبعيات الحرجة.

---

## ملاحظتان اكتُشفتا أثناء هذه المراجعة (2026-07-22)
1. **تذبذب الملكية:** ملكية `dist/` و`plugins/` تنقلب بين `root` و`ashraffarid2010` بين الأوامر — يوحي بعملية root دورية تُعيد chown على الشجرة. يكسر البناء بشكل متقطّع ويحتاج تثبيتًا دائمًا للملكية (يفضّل: التطبيق ومساره كلّه يملكهما مستخدم غير جذر واحد).
2. **`node_modules/` مملوك لـroot** — يمنع `npm run build`/`npm install` من مستخدم الموقع. ثبّت ملكيته لـ`ashraffarid2010` ضمن المرحلة 5 حتى تعمل عمليات النشر بلا صلاحية جذر.
