خانه » CVE-2025-13836

CVE-2025-13836

Excessive read buffering DoS in http.client

توسط Vulnerbyte Alerts
175 بازدید
هشدار سایبری CVE-2025-13836

چکیده

آسیب‌پذیری در ماژول http.client از کتابخانه استاندارد CPython باعث می‌شود کلاینت هنگام خواندن پاسخ HTTP (بدون تعیین اندازه خواندن) بر اساس مقدار هدر Content‑Length حافظه زیادی را یکجا تخصیص دهد. در این وضعیت، یک سرور مخرب می‌تواند با قرار دادن مقدار غیرواقعی و بسیار بزرگ در این هدر، کلاینت را مجبور به مصرف بیش از حد حافظه (OOM) کند حتی اگر داده واقعی ارسال نشود که نتیجه آن حمله انکار سرویس (DoS) است.

توضیحات

آسیب‌پذیری CVE‑2025‑13836 در ماژول http.client از کتابخانه استاندارد CPython، که وظیفه پیاده‌سازی ارتباطات مبتنی بر پروتکل انتقال ابرمتن (HTTP) را بر عهده دارد، ناشی از مصرف کنترل‌نشده منابع مطابق با CWE‑400 است. این ضعف زمانی بروز می‌کند که متد خواندن پاسخ HTTP یعنی HTTPResponse.read بدون هیچ آرگومانی فراخوانی می‌شود. در این وضعیت، عملکرد پیش‌فرض ماژول به این صورت است که مقدار هدر طول محتوا (Content‑Length) را به‌عنوان حجم داده‌ای که باید خوانده شود در نظر می‌گیرد.

اگر یک سرور مخرب مقدار Content‑Length را به عددی بسیار بزرگ تنظیم کند، کلاینت از همان ابتدا، حتی پیش از دریافت هر مقدار داده واقعی از سوکت ارتباطی (TCP socket) تلاش می‌کند یک بافر حافظه متناسب با مقدار اعلام‌شده تخصیص دهد. این عملکرد می‌تواند باعث مصرف بیش از حد حافظه (OOM)، افزایش مصرف پردازنده و حتی جابجایی حافظه به دیسک (swapping) شود و در نهایت کلاینت را دچار انکار سرویس (DoS) کند. این ضعف حتی در شرایطی رخ می‌دهد که سرور عملاً داده ناچیزی ارسال کند یا هیچ داده‌ای نفرستد، زیرا تخصیص حافظه پیش از شروع دریافت داده انجام می‌شود.

در حالت معمول، اگر مقدار واقعی داده کمتر از مقدار اعلام‌شده در Content‑Length باشد، کلاینت در پایان، خطای خواندن ناقص (IncompleteRead) دریافت می‌کند؛ اما پیش از وقوع این خطا، حافظه عظیمی تخصیص یافته و شرایط انکار سرویس ایجاد شده است. به همین دلیل، این آسیب‌پذیری حتی با پاسخ‌های بسیار کوچک نیز به‌طور کامل قابل بهره‌برداری است. در سناریوی حمله، مهاجم در نقش یک سرور HTTP قرار می‌گیرد و با ارسال یک پاسخ دارای هدر Content‑Length بسیار بزرگ، کلاینت را مجبور به تخصیص حافظه سنگین می‌کند. این حمله از راه دور ، بدون نیاز به تعامل کاربر و بدون نیاز به مجوز یا دسترسی ویژه انجام می‌شود و به‌سادگی می‌تواند به‌طور خودکار پیاده‌سازی شود. توسعه‌دهندگان CPython برای رفع این ضعف عملکرد خواندن پاسخ در ماژول http.client را اصلاح کرده‌اند تا داده‌ها به‌صورت چند بخشی(Chunked Reading) دریافت شوند. در این مکانیزم، میزان حافظه تنها متناسب با مقدار واقعی داده دریافتی تخصیص می‌یابد و مقدار Content‑Length دیگر نمی‌تواند منجر به تخصیص غیرعادی حافظه شود. این پچ در نسخه‌های 3.13.11، 3.14.1، 3.15.0 و نسخه‌های جدیدتر اعمال شده است.

CVSS

Score Severity Version Vector String
6.3 MEDIUM 4.0 CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:L

لیست محصولات آسیب پذیر

Versions Product
affected from 0 before 3.13.11

affected from 3.14.0 before 3.14.1

affected from 3.15.0a1 before 3.15.0

CPython

لیست محصولات بروز شده

Versions Product
3.13.11

3.14.1

3.15.0

CPython

استفاده محصول در ایران

در این جدول، تعداد صفحات ایندکس‌شده در گوگل با دامنه .ir که CPython را ذکر کرده اند، ثبت شده است. این داده صرفاً برای برآورد تقریبی حضور محصولات در وب ایران استفاده شده و نمایانگر میزان نصب دقیق و استفاده واقعی نیست.

Approx. Usage in .ir Domain via Google

(Total Pages)

Search Query (Dork) Product
19,400 site:.ir “CPython” CPython

نتیجه گیری

این آسیب‌پذیری با شدت متوسط در ماژول http.client از کتابخانه CPython امکان ایجاد حمله انکار سرویس را از طریق مصرف کنترل‌نشده حافظه فراهم می‌کند. در این ضعف، کلاینت هنگام فراخوانی read بدون آرگومان، تلاش می‌کند بر اساس مقدار اعلام‌شده در هدر Content‑Length، یکباره فضای حافظه بزرگی را تخصیص دهد، حتی زمانی که سرور داده واقعی ارسال نکند. این عملکرد می‌تواند منجر به OOM، کرش برنامه یا اختلال در عملکرد سیستم شود؛ به‌ویژه در سناریوهایی که کلاینت با سروری مخرب در تعامل است. با توجه به انتشار پچ‌های امنیتی، اجرای اقدامات زیر برای جلوگیری از بهره‌برداری و کاهش سطح ریسک ضروری است:

  • به‌روزرسانی فوری: مهم‌ترین اقدام، ارتقای محیط‌های Python به نسخه‌های امن 3.13.11، 3.14.1، 3.15.0 و جدیدتر است. این پچ، عملکرد پاسخ را به حالت چندبخشی (Chunked Reading) تغییر داده و از تخصیص غیرعادی حافظه جلوگیری می‌کند. سایر اقدامات نقش مکمل را دارند و می‌توانند به کاهش ریسک این آسیب پذیری و مقابله با حملات مشابه کمک کنند.
  • کنترل اندازه خواندن: در کد، به‌جای read بدون آرگومان از read(size) با اندازه محدود استفاده شود تا تخصیص حافظه تحت کنترل باشد و مقدار Content‑Length نتواند منجر به مصرف بیش از حد حافظه شود.
  • اعمال محدودیت منابع: در محیط‌های سروری، ابزارهایی مانند ulimit یا cgroups برای محدودکردن حافظه استفاده شوند تا در صورت وقوع OOM، آسیب به کل سیستم محدود بماند.
  • نظارت و ثبت لاگ: لاگ‌های Python را با سطح DEBUG فعال کنید و از ابزارهایی مانند Sentry) یا ELK Stack برای شناسایی الگوهای مصرف حافظه بالا در client استفاده نمایید. هشدارهای خودکار برای IncompleteRead یا OOM تنظیم کنید.
  • ایزوله‌سازی کلاینت: اجرای برنامه‌ها در محیط‌هایی مانند Docker و محدودکردن دسترسی شبکه با فایروال‌هایی مانند iptables می‌تواند احتمال تعامل با سرورهای مخرب را کاهش دهد.
  • تست امنیتی: ارزیابی دوره‌ای کد با ابزارهایی مانند Bandit و OWASP ZAP و همچنین استفاده از Fuzzing برای آزمایش هدر Content‑Length، به شناسایی سناریوهای DoS کمک می‌کند.
  • سیاست‌های امنیتی: اصل حداقل دسترسی را برای فرآیندهای Python اعمال کنید تا دسترسی به حافظه و شبکه محدود شود و از پروکسی‌های HTTP مانند mitmproxy برای فیلتر کردن هدرهای مشکوک (مانند مقادیر بسیار بزرگ Content-Length) استفاده نمایید.

اجرای این اقدامات، به‌ویژه به‌روزرسانی سریع و کنترل اندازه خواندن، ریسک بهره‌برداری از این آسیب پذیری را به حداقل رسانده و امنیت کلی کلاینت‌های HTTP در اکوسیستم Python را در برابر حملات DoS مبتنی بر منابع تقویت می‌کند.

امکان استفاده در تاکتیک های Mitre Attack

Initial Access (TA0001)

در این سناریو، مهاجم نقش یک سرور HTTP را دارد و کلاینت Python خودش به‌صورت عادی درخواست ارسال می‌کند؛ بنابراین این بخش بیشتر حالت «کمکی» دارد. ورودی مخرب از طریق پاسخ HTTP دریافت می‌شود و مهاجم بدون نیاز به احراز هویت، صرفاً با ارائه سرویس HTTP کنترل‌شده، مسیر ورود داده مخرب را فراهم می‌کند.

Defense Evasion (TA0005)

این ضعف نیازمند هیچ تکنیک فرار یا پنهان‌کاری نیست؛ رفتار مخرب در قالب یک پاسخ HTTP استاندارد اتفاق می‌افتد و معمولاً در سیستم‌های فاقد کنترل مصرف منابع شناسایی نمی‌شود. پچ جدید با محدودسازی تخصیص حافظه، امکان عبور این حمله را از بین می‌برد.

Impact (TA0040)

تأثیر نهایی، انکار سرویس از طریق مصرف کنترل‌نشده حافظه است. کلاینت Python حتی با داده واقعی بسیار کم، در اثر تخصیص بافر بر اساس Content‑Length غیرواقعی، به OOM، کرش یا اختلال عملکرد می‌رسد. این حمله بدون تعامل کاربر و بدون نیاز به مجوز انجام می‌شود و روی سرویس‌هایی که از http.client برای ارتباطات خودکار استفاده می‌کنند، اثر عملیاتی جدی دارد.

منابع

  1. https://www.cve.org/CVERecord?id=CVE-2025-13836
  2. https://www.cvedetails.com/cve/CVE-2025-13836/
  3. https://mail.python.org/archives/list/security-announce@python.org/thread/OQ6G7MKRQIS3OAREC3HNG3D2DPOU34XO/
  4. https://vulmon.com/vulnerabilitydetails?qid=CVE-2025-13836
  5. https://vuldb.com/?id.333914
  6. https://github.com/python/cpython/issues/119451
  7. https://github.com/python/cpython/pull/119454
  8. https://github.com/python/cpython/commit/4ce27904b597c77d74dd93f2c912676021a99155
  9. https://github.com/python/cpython/commit/5a4c4a033a4a54481be6870aa1896fad732555b5
  10. https://github.com/python/cpython/commit/289f29b0fe38baf2d7cb5854f4bb573cc34a6a15
  11. https://nvd.nist.gov/vuln/detail/CVE-2025-13836
  12. https://cwe.mitre.org/data/definitions/400.html

همچنین ممکن است دوست داشته باشید

پیام بگذارید