مصطفی جعفرزاده
مصطفی جعفرزاده
خواندن ۴ دقیقه·۳ ماه پیش

حملات اخیر به پروژه‌های Node.js و آسیب‌پذیری‌های بحرانی تا سال 2024


امنیت نرمافزار یکی از اولویتهای اصلی در دنیای توسعه است، بهویژه در پروژههای حیاتی مانند Node.js که بهطور گسترده در برنامههای سروری و شبکهای استفاده میشوند. طی سالهای اخیر، چندین آسیبپذیری خطرناک در Node.js کشف شدهاند که توسعهدهندگان و مدیران سیستمها باید نسبت به آنها آگاهی داشته باشند و اقدامات لازم را برای پیشگیری از وقوع حملات انجام دهند.
(در مقاله از هوش مصنوعی کمک گرفته شده است )

در ادامه به بررسی چهار حمله و آسیبپذیری مهم در Node.js تا سال 2024 میپردازیم:

---

1. CVE-2024-27980: اجرای دستورات دلخواه در سیستمهای ویندوز

این آسیبپذیری بحرانی به مهاجمان اجازه میدهد تا از طریق توابع `child_process.spawn` و `child_process.spawnSync` در سیستمهای ویندوز دستورات دلخواهی را اجرا کنند. حتی اگر تمهیدات امنیتی مانند غیرفعال کردن گزینهی `shell` فعال باشد، مهاجم همچنان میتواند این مکانیزم را دور بزند.

نحوه عملکرد:

این آسیبپذیری از طریق دستکاری ورودیهایی که به توابع `spawn` و `spawnSync` ارسال میشود، امکانپذیر است. توابع `child_process.spawn` و `spawnSync` در ویندوز برای اجرای دستورات سیستمعامل مانند `cmd` استفاده میشوند. اگر ورودیها به درستی اعتبارسنجی نشوند، مهاجم میتواند از آنها برای اجرای کدهای مخرب استفاده کند.

مثال کد:

فرض کنید شما از `child_process.spawn` برای اجرای یک فرمان استفاده میکنید:

const { spawn } = require('child_process');

const process = spawn('cmd', ['/c', 'dir']);

مهاجم میتواند بهجای دستور نمایش محتویات دایرکتوری، ورودیهایی ارسال کند که کدی مخرب را اجرا کند:

const process = spawn('cmd', ['/c', 'malicious_code']);

مکانیزم کار:

این مشکل ناشی از نحوه برخورد Node.js با ورودیهای دستورات سیستمعامل در ویندوز است. حتی اگر `shell` غیرفعال باشد، مهاجم همچنان میتواند از طریق دستورات ارسالشده کدی مخرب را اجرا کند.

نتیجه:

این آسیبپذیری به مهاجمان اجازه میدهد تا از طریق سیستمعامل ویندوز، بدون نیاز به دسترسی مستقیم به سرور، کدهای مخرب را اجرا کنند. این نوع حمله میتواند به نصب درب پشتی یا اجرای کدهای خطرناک دیگر منجر شود.

---

2. CVE-2024-22020: عبور از محدودیتهای واردات شبکهای با استفاده از URLهای دادهای

این آسیبپذیری به مهاجم اجازه میدهد تا با استفاده از URLهای دادهای (Data URLs)، محدودیتهای واردات شبکهای را دور بزند و کدهای دلخواهی را روی سیستم هدف اجرا کند.

نحوه عملکرد:

در شرایط عادی، یک اپلیکیشن Node.js ممکن است از تابع `import()` برای وارد کردن ماژولهای خارجی استفاده کند:

import('https://example.com/module.js');

اما مهاجم میتواند از یک URL دادهای استفاده کند تا کدهای جاوااسکریپت مخرب را مستقیماً وارد سیستم کند:

import('console.log("malicious code")');

در این مثال، کد جاوااسکریپت مستقیماً درون URL جاسازی شده و توسط سیستم اجرا میشود.

نتیجه:

این نوع حمله امکان میدهد کدهای مخرب را بدون نیاز به منابع خارجی و از طریق URL دادهای به سیستم وارد کرد. این روش محدودیتهای امنیتی واردات شبکهای را دور میزند و امنیت سرور را به خطر میاندازد.

---

3. CVE-2024-21896: حمله گذر از مسیر با تغییر داخلی Buffer

این آسیبپذیری شدید به مهاجمان اجازه میدهد تا از طریق تغییر داخلی `Buffer`، به حملات **گذر از مسیر** (Path Traversal) دست بزنند. مهاجم میتواند به فایلها و مسیرهایی که نباید دسترسی داشته باشد، دسترسی پیدا کند.

نحوه عملکرد:

در Node.js، از `Buffer` برای ذخیره و مدیریت دادههای باینری استفاده میشود. مهاجم میتواند متد `Buffer.prototype.utf8Write` را بازنویسی کند و به جای مسیر فایل درست، مسیر فایلهای حساس را بازگرداند.

مثال کد:

فرض کنید برنامهای یک مسیر فایل را به `Buffer` تبدیل میکند:

const fs = require('fs');

const path = require('path');

const filePath = path.resolve('/user/data');

const fileBuffer = Buffer.from(filePath);

```

مهاجم میتواند متد `utf8Write` را بازنویسی کند:

```javascript

Buffer.prototype.utf8Write = function () {

return '/etc/passwd';

};

این کار به مهاجم اجازه میدهد تا به فایلهای حساس سیستم دسترسی پیدا کند.

نتیجه:

مهاجم میتواند مسیرهای فایلهای حساس را دستکاری کرده و به اطلاعات حیاتی یا فایلهای سیستمی دسترسی پیدا کند. این حمله بهویژه در سیستمهایی که از مدل مجوز آزمایشی Node.js استفاده میکنند خطرناک است.

---

4. CVE-2024-22017: نگهداری امتیازات در `setuid()` به دلیل استفاده از io_uring

این آسیبپذیری زمانی رخ میدهد که `setuid()` برای تغییر امتیازات یک فرآیند استفاده میشود، اما `io_uring` به درستی تغییرات را اعمال نمیکند و همچنان از امتیازات روت استفاده میکند.

نحوه عملکرد:

در لینوکس، `setuid()` برای کاهش امتیازات فرآیند به یک کاربر عادی استفاده میشود:

process.setuid(non_root_user_id);

اما به دلیل مشکل در `io_uring`، این تغییر به درستی اعمال نمیشود و فرآیند همچنان با امتیازات روت کار میکند.

مثال کد:

فرآیندی که از `io_uring` برای انجام عملیات استفاده میکند، حتی پس از تغییر امتیازات، همچنان میتواند عملیاتهای دارای امتیازات روت را انجام دهد:

process.setuid(non_root_user_id);

io_uring.submit(); // انجام عملیات با امتیازات روت

نتیجه:

مهاجم میتواند از این نقص برای اجرای عملیاتهایی که نیاز به دسترسی روت دارند، حتی پس از تغییر امتیازات، استفاده کند. این امر منجر به افزایش خطر نفوذ به سیستم میشود.

---

نتیجهگیری کلی:

آسیبپذیریهای کشف شده در Node.js به وضوح نشان میدهند که بهروزرسانی منظم و رعایت نکات امنیتی چقدر در حفظ امنیت سیستمهای مبتنی بر این پلتفرم اهمیت دارد. برای پیشگیری از حملات احتمالی، توسعهدهندگان باید همواره از نسخههای بهروز Node.js استفاده کنند و ورودیهای ارسالشده به توابع مختلف را بهدقت اعتبارسنجی کنند.

۶۰ ۶۰hackingnodejs
برنامه نویس علاقه مند به طراحی الگوریتم
شاید از این پست‌ها خوشتان بیاید