بررسی امنیت کد با هوش مصنوعی: لایه‌ی اول، نه آخر

مدل کدام آسیب‌پذیری‌ها را واقعاً پیدا می‌کند، کدام دسته را هرگز نمی‌بیند، چرا فهرست بلند هشدار تیم را بی‌حس می‌کند، و چرا این کار جای تست نفوذ را نمی‌گیرد.

🍊 تیم نارنگی ⏱ 6 دقیقه مطالعه
صفحه‌ی کد باز روی نمایشگر با چند خط نشانه‌گذاری‌شده که ورودی کنترل‌نشده را نشان می‌دهد

یک تیم سه‌نفره پنل فروشگاه اینترنتی‌شان را بالا آورده و همه‌چیز کار می‌کند. تا صبحی که مشتری زنگ می‌زند: نشانی صفحه‌ی گزارش فروش را جایی اشتباهی فرستاده و حالا یک نفر دیگر هم فهرست سفارش‌ها و شماره‌ی خریدارها را دیده است. کسی هک نکرده بود؛ آن صفحه از اول ورود نمی‌خواست.

این جنس ایراد در بازبینی معمولی گم می‌شود، چون کد «کار می‌کند». تست‌ها سبزند و بازبین به نام متغیر نگاه می‌کند، نه به اینکه چه کسی حق دیدن این خروجی را دارد.

مدل‌های زبانی دقیقاً در همین شکاف مفیدند، با یک شرط: این کار لایه‌ی اول است، نه آخر.

فرقش با بازبینی معمولی کد

در بازبینی کد با هوش مصنوعی سؤال خوانایی و نگهداری کد است. اینجا سؤال فقط یکی است: اگر کسی بدخواه باشد، از کجا وارد می‌شود.

کدی که از نظر مهندسی تمیز است می‌تواند حفره‌ی بزرگی داشته باشد. اگر این زاویه را در پرامپت روشن نکنید، مدل به عادتش برمی‌گردد و درباره‌ی نام‌گذاری نظر می‌دهد.

پنج دسته‌ای که مدل واقعاً پیدا می‌کند

ورودی اعتبارسنجی‌نشده. پارامتری که مستقیم از درخواست خوانده و بدون بررسی نوع و بازه وارد منطق می‌شود. مدل این الگو را خوب می‌شناسد؛ شکل نوشتاری‌اش تکرارشونده است.

کوئری ناامن. هر جا رشته‌ی کوئری با الحاق ساخته شده باشد. قدیمی‌ترین و هنوز پرتکرارترین اشتباه؛ مدل تقریباً همیشه پیدایش می‌کند و جایگزین پارامتری‌شده می‌دهد. پیشینه‌اش در مدخل SQL injection و مبانی‌اش در نوشتن کوئری SQL آمده.

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

رمز و کلید داخل کد. توکن درگاه پرداخت، کلید پنل پیامکی، رمز پایگاه داده. مدل این‌ها را از روی شکل رشته و نام متغیر تشخیص می‌دهد و معمولاً درست می‌گوید.

کنترل دسترسی ناکافی. همان چیزی که سر تیم اول آمد: مسیری که فقط با ندانستن نشانی‌اش محافظت می‌شود. مدل وقتی می‌بیندش که بگویید چه کسی باید به آن دسترسی داشته باشد.

کدام هشدار ارزش وقت دارد

همه‌ی هشدارها هم‌وزن نیستند؛ این جدول تجربه‌ی عملی است، نه رتبه‌بندی رسمی:

دستهنشانه در کداتکا به هشدار
کوئری ناامنساخت رشته با الحاق ورودیزیاد
کلید داخل کدرشته‌ی ثابت کنار نام کلیدزیاد
افشای خطاچاپ مستقیم استثنا به کاربرزیاد
ورودی کنترل‌نشدهخواندن مستقیم از درخواستمتوسط
کنترل دسترسینبود بررسی مالکیت رکوردکم، بدون زمینه

سه چیزی که پیدا نمی‌کند

ایراد معماری. اینکه سرویس گزارش‌گیری اصلاً نباید به پایگاه داده‌ی کاربران دسترسی مستقیم داشته باشد، تصمیمی در سطح نقشه است. مدل فایل را می‌بیند، نه نقشه را.

منطق کسب‌وکار. فرض کنید کد تخفیف دو بار روی یک سفارش می‌نشیند، مبلغ نهایی منفی می‌شود و به کیف پول کاربر برمی‌گردد. هیچ خطی اینجا «ناامن» نیست؛ قاعده‌ی کسب‌وکار غلط است و مدل قاعده‌ی شما را نمی‌داند.

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

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

مثبت کاذب و بی‌حس شدن تیم

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

خطر واقعی خودِ اشتباه نیست، عادت است. تیمی که سه بار هشدارها را بررسی کند و هر بار ببیند بیشترشان بی‌مورد بوده‌اند، بار چهارم فهرست را نمی‌خواند. همان بار چهارم است که یک مورد درست گم می‌شود.

⚠️ فهرست بلند را نپذیرید

اگر خروجی بیش از پنج، شش مورد بود، پرامپت را تنگ‌تر کنید و فهرست را همان‌طور به تیم ندهید. فقط مواردی را بخواهید که سناریوی سوءاستفاده‌ی مشخص دارند.

کدی که خود هوش مصنوعی نوشته

سرعت تولید که بالا می‌رود، الگوهای ناامن هم سریع‌تر تکثیر می‌شوند. سه مورد مکرر: نمونه‌ی کاریِ بی‌اعتبارسنجی که همان‌طور به تولید می‌رود؛ بررسی توکن به شکل مقایسه‌ی ساده‌ی رشته‌ای؛ و تنظیمات دسترسی باز برای اینکه «فعلاً کار کند».

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

پکیجی که وجود ندارد

مدل‌ها گاهی نام کتابخانه‌ای می‌سازند که هرگز منتشر نشده؛ همان توهم هوش مصنوعی. در حالت بی‌خطر، دستور نصب خطا می‌دهد. در حالت بد، کسی همان نام حدس‌زدنی را زودتر ثبت کرده و کد مخربش با اولین نصب وارد پروژه می‌شود.

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

پرامپتی که خروجی قابل استفاده می‌دهد

تفاوت «این کد را امنیتی بررسی کن» با الگوی زیر، تفاوت بیست هشدار مبهم و چهار هشدار قابل اقدام است:

نقش: بازبین امنیتی کد
زبان و چارچوب: [PHP و لاراول]
مسیر ورود داده: [فرم عمومی سایت، بدون ورود کاربر]
دسترسی موردانتظار: [فقط مدیر فروشگاه]
لایه‌های قبلی: [اعتبارسنجی فرم در لایه‌ی بالاتر]

فقط این دسته‌ها را بررسی کن:
ورودی اعتبارسنجی‌نشده، کوئری ناامن، افشای اطلاعات در خطا،
کلید و رمز داخل کد، کنترل دسترسی ناکافی

برای هر مورد بنویس: شماره‌ی خط، سناریوی سوءاستفاده در یک جمله،
اصلاح پیشنهادی به‌صورت کد
اگر مطمئن نیستی بنویس نامطمئن؛ حدس نزن
درباره‌ی سبک کد و نام‌گذاری چیزی ننویس

«سناریوی سوءاستفاده در یک جمله» بیشترین اثر را دارد: مدل باید برای هر هشدار روایتی واقعی بسازد و هشدارهای بی‌پشتوانه همان‌جا می‌ریزند. ساختن چنین قالب‌هایی در پرامپت‌نویسی فارسی باز شده و در نارنگی می‌شود امتحانش کرد.

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

کجای روند کار بگذاریمش

بهترین جا پیش از ارسال درخواست ادغام است، روی همان چند فایل تغییرکرده: کد را با یک توضیح یک‌خطی درباره‌ی مسیر ورود داده بدهید، خروجی را خودتان فیلتر کنید و فقط موارد تأییدشده را به تیم ببرید.

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

جایی که این کار جواب نمی‌دهد

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

برای هر چیزی که پول یا داده‌ی هویتی جابه‌جا می‌کند، آزمون نفوذ توسط متخصص جایگزین ندارد و این متن هم توصیه‌ی امنیتی اختصاصی برای سامانه‌ی شما نیست؛ فهرست مرجع دسته‌ها را OWASP Top Ten نگه می‌دارد. و کد محرمانه‌ی کارفرما را بی‌اجازه داخل ابزار نریزید — چرایی‌اش در امنیت اطلاعات در هوش مصنوعی آمده.

جمع‌بندی

بررسی امنیت کد با مدل زبانی یک کار را خوب انجام می‌دهد: الگوهای خطرناکِ محلی و تکرارشونده را ارزان و بی‌خستگی زودتر از انسان می‌بیند. همان پنج دسته‌ی اول، بخش بزرگی از اشتباهات روزمره را پوشش می‌دهند.

و یک کار را اصلاً نمی‌کند: نگاه کردن به کل سامانه از چشم مهاجم. معماری، منطق کسب‌وکار و زنجیره‌ی حفره‌های کوچک بیرون از توان اوست.

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

برای ادامه:

پرسش‌های پرتکرار

آیا هوش مصنوعی می‌تواند جای متخصص امنیت را بگیرد؟ +
نه، و کسی که این را وعده می‌دهد یا ابزار می‌فروشد یا تجربه‌ی حمله‌ی واقعی ندارد. مدل روی کدی که می‌بیند دنبال الگوی خطرناک می‌گردد، ولی سامانه‌ی شما را در حال اجرا نمی‌بیند، سرور و تنظیمات و شبکه را نمی‌شناسد، و نمی‌داند مهاجم واقعی از کجا شروع می‌کند. جایگاه درستش قبل از رسیدن کد به دست متخصص است، نه به‌جای او.
چرا مدل گاهی چیزی را آسیب‌پذیری می‌داند که آسیب‌پذیر نیست؟ +
چون فقط همان قطعه کد را می‌بیند و نمی‌داند بیرون از آن چه محافظتی وجود دارد. اگر ورودی یک تابع دو لایه بالاتر پاک‌سازی شده باشد یا مسیر پشت میان‌افزار احراز هویت باشد، مدل خبر ندارد و همان الگو را خطرناک اعلام می‌کند. راه کم کردنش این است که در پرامپت بنویسید داده از کجا می‌آید و چه لایه‌هایی قبلاً روی آن اعمال شده است.
کدی که خود هوش مصنوعی نوشته را می‌شود با همان مدل بررسی کرد؟ +
می‌شود، ولی در جلسه‌ی جداگانه و بدون تاریخچه‌ی نوشتن آن. وقتی مدل در همان گفتگو کد را نوشته باشد، تمایل دارد از انتخاب‌های خودش دفاع کند و ایرادهای ساختاری را کوچک نشان بدهد. یک گفتگوی تازه با نقش صریح بازبین امنیتی، خروجی به‌مراتب سخت‌گیرانه‌تری می‌دهد.
اسم پکیجی که مدل پیشنهاد می‌دهد را چطور راستی‌آزمایی کنم؟ +
قبل از نصب، نام دقیق را در مخزن رسمی همان زبان جست‌وجو کنید و به تاریخ آخرین انتشار، تعداد نسخه‌ها و مخزن کد نگاه کنید. مدل‌ها گاهی نام کتابخانه‌ای می‌سازند که وجود ندارد و کسی می‌تواند همان نام را ثبت کند و کد مخرب داخلش بگذارد. اگر پکیج فقط چند روز عمر دارد و مخزن عمومی ندارد، نصبش نکنید.
برای بررسی امنیتی، کد را تکه‌تکه بدهم یا کل پروژه را؟ +
تکه‌تکه، ولی با زمینه. یک فایل کنترلر همراه با توضیح یک‌خطی از اینکه داده از کجا می‌آید و چه کسی باید به آن دسترسی داشته باشد، نتیجه‌ی بسیار بهتری می‌دهد تا ریختن کل مخزن که مدل در آن گم می‌شود و سطحی‌ترین ایرادها را برمی‌گرداند. فایل‌های حساس را اولویت بدهید: احراز هویت، پرداخت، آپلود و هر جایی که ورودی کاربر مستقیم وارد می‌شود.
#امنیت کد #آسیب‌پذیری نرم‌افزار #بازبینی امنیتی کد #تزریق SQL #کد امن
به‌دردِ کسی می‌خورد؟ تلگرام واتساپ
🍊

خواندنش خوب بود — حالا امتحانش کن

هرچه در این صفحه خواندی، همین حالا داخلِ نارنگی قابلِ اجراست. ثبت‌نام با شماره‌ی موبایل، نارنگیِ رایگانِ شروع، بدونِ نیاز به کارت یا تحریم‌شکن.

بدونِ نصب هم کار می‌کند — ولی در اپ سریع‌تر است