پرش به محتوای اصلی
پرش به محتوای مقاله

پلاگین ESLint: نقص‌های پیکربندی Vercel باعث مصرف بی‌رویه توکن‌هاست

·۱۰ مهر ۱۴۰۵۴ دقیقه مطالعه
راهنما
تصویر: عنوان مقاله با تایپ‌اسکریپت و سه آسیب‌پذیری امنیتی CWE در پس‌زمینه‌ای انتزاعی از فراخوانی‌های بدون محدودیت LLM.
تصویر: عنوان مقاله با تایپ‌اسکریپت و سه آسیب‌پذیری امنیتی CWE در پس‌زمینه‌ای انتزاعی از فراخوانی‌های بدون محدودیت LLM.
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

معرفی اولین پلاگین ESLint که باگ‌های مصرف منابع در Vercel AI SDK را مستقیماً به شناسه‌های امنیتی CWE متصل می‌کند و مدیریت توکن را به یک Primitive امنیتی تبدیل می‌کند.

یک فراخوانی ساده‌ی generateText وقتی هیچ سقفی برای منابع تعریف نشده باشد، چقدر می‌تواند هزینه داشته باشد؟ در ۲ اکتبر ۲۰۲۶، یک بررسی فنی عمیق فاش کرد که Vercel AI SDK به توسعه‌دهندگان اجازه می‌دهد فراخوانی‌های نامحدودی به مدل زبانی بزرگ (LLM) — شبیه کتابخانه‌داری که میلیاردها صفحه را خوانده و حالا با همان لحن جواب می‌دهد — ارسال کنند؛ اتفاقی که اپلیکیشن‌ها را در معرض توقف کامل و جهش‌های مالی شدید قرار می‌دهد. در واقع، این نقص فنی می‌تواند یک فراخوانی ساده‌ی تابع را به یک صورت‌حساب نامحدود تبدیل کند.

این ریسک درست زمانی رخ می‌دهد که توسعه‌دهندگان از پرامپت‌های ساده به سمت گردش‌های کاری عامل‌محور (Agentic) حرکت می‌کنند. همان‌طور که در تحلیل قبلی ما درباره‌ی تفاوت استدلال مدل‌ها با سیستم‌هایی مثل AlphaGo اشاره کردیم، چالش فعلی صنعت کمتر به منطق مربوط است و بیشتر به «لوله‌کشی» هوش مصنوعی در محیط عملیاتی برمی‌گردد. در یک محیط واقعی، یک مدل پرحرف یا یک حلقه‌ی تکرار ساده می‌تواند منابع را سریع‌تر از هر مهاجم بدخواشی تخلیه کند. این چالش‌های عملیاتی اغلب با محدودیت‌های زیرساختی گره خورده‌اند؛ برای مثال، گلوگاه پهنای‌باند حافظه یکی از دلایل اصلی شکست مقیاس‌دهی سنتی در مدل‌های زبانی است که هزینه‌های استنتاج را افزایش می‌دهد.

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

به نقل از مستندات فنی این بررسی، در زبان TypeScript، فراخوانی generateText تنها با یک مدل و پرامپت، معتبر شناخته می‌شود. سیستم تایپینگ اهمیتی نمی‌دهد که چه تعداد توکن (Token) — تکه‌های کوچکی از متن شبیه برش‌های کیک که مدل می‌خورد — بازگردانده می‌شود، فرآیند چقدر زمان می‌برد یا در نهایت چه کسی هزینه این نتیجه را پرداخت می‌کند.

این وضعیت نمونه‌ای خاص از استاندارد OWASP LLM10 است که با عنوان «مصرف نامحدود» (Unbounded Consumption) شناخته می‌شود. اگرچه این SDK از اجرای بی‌نهایت حلقه‌های فراخوانی ابزار (Tool-calling loops) جلوگیری می‌کند (زیرا مقدار stopWhen را به‌صورت پیش‌فرض روی stepCountIs(1) تنظیم کرده است)، اما سایر تخصیص‌های منابع بدون پیکربندی صریح، کاملاً باز و بدون سقف می‌مانند. این ناکارآمدی در تولید متن، دقیقاً همان نقطه‌ای است که معماری‌های فعلی AI در تصمیم‌گیری‌های سریع دچار کندی می‌شوند و باعث اتلاف منابع می‌گردند.

برای مقابله با این مشکل، پلاگین eslint-plugin-vercel-ai-security منتشر شد تا سه نقص خاص را که با استانداردهای CWE (ضعف‌های رایج امنیتی) مطابقت دارند، شناسایی کند. این‌ها صرفاً ترجیحات استایلی یا زیبایی‌شناسی کد نیستند، بلکه مرزهای امنیتی حیاتی هستند:

جزئیات سه نشت منبع

  • خروجی بدون سقف (CWE-770): فراخوانی generateText بدون تعیین maxOutputTokens یعنی مدل می‌تواند تا رسیدن به سخت‌ترین محدودیت داخلی خود، متن تولید کند. توسعه‌دهندگان اغلب این پارامتر را نادیده می‌گیرند چون اختیاری است و در «مسیر خوش‌بینانه» (Happy Path) به‌ندرت به آن نیاز است. اما چون صورت‌حساب‌ها بر اساس توکن است، نبود سقف یک ریسک مالی مستقیم است. نکته مهم این است که در نسخه ۴، این پارامتر maxTokens نام داشت؛ بنابراین راهنماهای نوشته شده برای نسخه ۴ ممکن است در بازبینی کد درست به نظر برسند، اما در عمل هیچ محدودیتی ایجاد نمی‌کنند.
  • درخواست‌های بی‌نهایت (CWE-400): این SDK هیچ مهلت زمانی (Timeout) پیش‌فرضی را تعریف نکرده است. در حالی که APIهایی با ساختار fetch معمولاً باید تایم‌اوت داشته باشند، این مورد ندارد. اگر ارائه‌دهنده مدل به‌جای خطا دادن، متوقف (Hang) شود، درخواست برای همیشه باز می‌ماند. از نسخه ۶.۰.۱۴، پارامتر timeout به عنوان یک پارامتر درجه اول اضافه شده است که از totalMs ،stepMs ،chunkMs و toolMs پشتیبانی می‌کند. اگر از نسخه‌های قدیمی‌تر استفاده می‌کنید، باید به‌صورت دستی یک AbortController پیاده‌سازی کنید.
  • جریان‌های زامبی (CWE-404): استفاده از streamText بدون abortSignal باعث ایجاد یک باگ رهاسازی (Release bug) می‌شود. وقتی کلاینت ارتباطش را قطع می‌کند، سرور همچنان به تولید توکن و صورت‌حساب برای خواننده‌ای که هرگز توکن‌ها را نخواهد دید، ادامه می‌دهد. این مورد در دسته CWE-404 قرار می‌گیرد زیرا منبع به‌درستی تخصیص یافته اما هرگز آزاد نشده است و اجازه می‌دهد هندلِ درخواست، طولانی‌تر از خودِ درخواست زنده بماند.

نمودار: LLM بدون محدودیت سقف، TypeScript مشکلی ندارد، اما سه آسیب‌پذیری CWE خطرناک‌اند.

پیاده‌سازی و راهکارهای اصلاحی

طبق گزارش نویسنده این ابزار، رفع این مشکلات نیازمند تغییر رویکرد از «پارامترهای اختیاری» به «مرزهای اجباری» است. برای مثال، توسعه‌دهندگان باید maxOutputTokens را روی طولانی‌ترین پاسخی تنظیم کنند که حاضرند هزینه آن را بپردازند. برای حل مشکل جریان‌های زامبی، الگوی پیشنهادی این است که سیگنال درخواست به یک AbortController متصل شود:

const ac = new AbortController(); req.signal.addEventListener("abort", () => ac.abort()); const stream = streamText({ model, prompt, abortSignal: ac.signal });

این تغییر، فرض بنیادی توسعه هوش مصنوعی را عوض می‌کند: دیگر «مسیر خوش‌بینانه»، مسیر امن نیست. با متصل کردن این مسائل به OWASP LLM10، صنعت در حال تبدیل مدیریت توکن از یک «تنظیم کیفیت» به یک «اصول امنیتی» (Security Primitive) است.

حاکمیت و ابزارها

برای کسانی که به‌جای لینتینگ ساده، مدیریت حاکمیتی (Governance) را بر عهده دارند، نویسنده پیشنهاد می‌کند به چارچوب NIST AI RMF ارجاع دهند. هدف این است که اطمینان حاصل شود هر تخصیص — چه توکن باشد، چه زمان ساعت-دیواری (Wall-clock time) یا طول عمر درخواست — یک سقف مرئی و تعریف شده داشته باشد.

توسعه‌دهندگان می‌توانند این پلاگین امنیتی را از طریق دستور npm install --save-dev eslint-plugin-vercel-ai-security نصب کنند. این ابزار به Node 18+ نیاز دارد و از ESLint 8، 9 و ۱۰ پشتیبانی می‌کند. برای کسانی که از oxlint استفاده می‌کنند، این پلاگین از طریق jsPlugins: ["eslint-plugin-vercel-ai-security/oxlint"] قابل افزودن است، هرچند این قابلیت هنوز در مرحله آلفا است و تحت قوانین semver قرار ندارد.

گام بعدی شما

  • اگر از Vercel AI SDK استفاده می‌کنید، فوراً پلاگین امنیتی مذکور را نصب کرده و کدهای خود را اسکن کنید.
  • برای تمام فراخوانی‌های generateText یک مقدار سخت‌گیرانه برای maxOutputTokens تعریف کنید.
  • در تمامی جریان‌های متنی (streamText)، پیاده‌سازی abortSignal را برای جلوگیری از هزینه‌های پنهان اجباری کنید.

اما مدیریت هزینه‌ها تنها بخشی از ماجراست؛ برای درک اینکه چگونه مدل‌های کوچک‌تر می‌توانند استنتاج را ارزان‌تر کنند، تحلیل ما درباره مدل‌های SLM را بخوانید.

چرا این موضوع مهم است؟

این موضوع بر اساس استانداردهای OWASP و NIST، مدیریت منابع در LLM را به یک ضرورت امنیتی تبدیل می‌کند. توسعه‌دهندگانی که این مرزها را تعریف نکنند، با ریسک توقف سرویس و هزینه‌های پیش‌بینی‌نشده مواجه خواهند شد.

تأثیر برای ایران

برای توسعه‌دهندگان ایرانی که با محدودیت بودجه ارزی برای APIها دست‌وپنجه نرم می‌کنند، استفاده از این پلاگین برای جلوگیری از اتلاف توکن‌ها و هزینه‌های ناخواسته حیاتی است.

·نگاه ما
تحریریه دات‌هوش

انتقال مدیریت توکن از لایه «بهینه‌سازی هزینه» به لایه «امنیت سیستم» نشان می‌دهد که صنعت از مرحله آزمایشگاه خارج شده و وارد فاز پایداری (Stability) شده است. این رویکرد ثابت می‌کند که در دنیای هوش مصنوعی، یک باگ در پیکربندی می‌تواند مستقیماً به یک بحران مالی تبدیل شود، چیزی که در نرم‌افزارهای سنتی کمتر با این شدت دیده می‌شد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.