Loading...

امنیت · 10 دقیقه مطالعه

OWASP Top 10، آن‌طور که یک WAF واقعاً اجرایش می‌کند

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

به‌روزرسانی

OWASP Top 10، آن‌طور که یک WAF واقعاً اجرایش می‌کند

Top 10 واقعاً چیست

OWASP — یعنی Open Worldwide Application Security Project — یک فهرست رتبه‌بندی‌شده از دسته‌های ریسک اپلیکیشن وب منتشر می‌کند، که هر چند سال یک‌بار بر اساس دادهٔ واقعی حادثه و اسکن بازبینی می‌شود. فهرست فعلی با Broken Access Control، Cryptographic Failures و Injection شروع می‌شود.

دو چیز از نحوهٔ ساخته‌شدنش نتیجه می‌شود، و هر دو در متن تبلیغاتی فروشنده‌ها گم می‌شوند.

این دسته‌هاست، نه آسیب‌پذیری‌ها. «Injection» شامل SQL injection، command injection، LDAP injection و template injection می‌شود. یک محصول نمی‌تواند از یک دسته «پشتیبانی» کند؛ فقط می‌تواند تکنیک‌های خاصی درون آن را تشخیص دهد.

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

یک WAF چیست، در یک پاراگراف

یک فایروال اپلیکیشن وب جلوی اپلیکیشن شما می‌نشیند و هر درخواست — مسیر، query string، هدرها، کوکی‌ها و بدنه — را در برابر یک مجموعه قانون بازرسی می‌کند. وقتی یک قانون مطابقت پیدا کند، درخواست پیش از آنکه اپلیکیشن شما اصلاً اجرا شود، مسدود می‌شود، لاگ می‌شود، یا هر دو.

rule set پایه‌ای که اکثر WAFها رویش ساخته شده‌اند OWASP Core Rule Set (CRS) است، یک مجموعه قاعدهٔ تشخیص عمومی که توسط همان بنیاد نگهداری می‌شود. همان rule setای است که ما روی ModSecurity، در edge، اجرا می‌کنیم. CRS قواعدش را در خانواده‌هایی با بازه‌های عددی گروه‌بندی می‌کند — 941 برای cross-site scripting، 942 برای SQL injection، 930 برای local file inclusion، 931 برای remote file inclusion، 932 برای remote command execution، 933 برای PHP injection — و برای همین یک درخواست مسدودشده را می‌شود به یک شمارهٔ قانون دقیق ردیابی کرد، نه یک «سیاست امنیتی» مبهم.

دسته به دسته: فایروال واقعاً چه‌کار می‌کند

Injection — یک WAF اینجا واقعاً قوی است. SQL injection، command injection و template injection همگی شکل‌های قابل‌تشخیصی در دادهٔ درخواست باقی می‌گذارند. این همان چیزی است که pattern matching در آن خوب است، و قواعد اکثر تلاش‌های فرصت‌طلبانه را رک‌وراست می‌گیرند. این کوئری‌های parameterized را اختیاری نمی‌کند؛ برایتان زمان می‌خرد و اکثریت خودکار را متوقف می‌کند.

Cross-site scripting — قوی، با چند نکتهٔ احتیاطی. payloadهای اسکریپت در پارامترها قابل‌تشخیص‌اند. Stored XSS که از مسیری می‌رسد که فایروال بازرسی نمی‌کند، یا یک مشکل DOM-based که هرگز به سرور شما دست نمی‌زند، خارج از دسترس است.

Security Misconfiguration — تا حدی. یک WAF می‌تواند یک banner سرور را پنهان کند، دسترسی به فایل‌های .git و backup را مسدود کند، و متدهای خطرناک را رد کند. نمی‌تواند یک سیاست CORS بیش‌ازحد باز را درست کند یا یک پنل مدیریتی با رمز پیش‌فرض را.

Vulnerable and Outdated Components — تا حدی، و موقتاً. وقتی یک CVE عمومی می‌شود، قواعد عمومی اغلب شکل exploit منتشرشده را می‌گیرند، که کل ارزش «virtual patching» همین است: روزهای بین افشا و پنجرهٔ ارتقای شما را می‌خرد. جایگزینی برای ارتقادادن نیست.

Broken Access Control — بیشتر نه. اگر اپلیکیشن شما اجازه می‌دهد کاربر A با تغییردادن یک ID در آدرس، فاکتور کاربر B را بگیرد، هر دو درخواست برای یک فایروال یکسان به نظر می‌رسند. هیچ ایده‌ای ندارد فاکتور 4711 مال کیست. این دستهٔ اول فهرست فعلی است و یک باگ مجوزدهی در کد شماست.

Identification and Authentication Failures — تا حدی. Rate limiting روی endpointهای ورود، credential stuffing و brute force را کند می‌کند، که واقعی است و ارزش داشتنش را دارد. مدیریت ضعیف session یا یک فرآیند بازنشانی رمز که token نشت می‌دهد چیزی نیست که یک فایروال ببیند.

Insecure Design and Software Integrity Failures — نه. این‌ها معماری‌اند. هیچ الگوی درخواستی آن‌ها را بیان نمی‌کند.

مشکل false positive، و چرا همه‌چیز را تعیین می‌کند

هر rule setای که به‌اندازهٔ کافی تهاجمی باشد که injection را بگیرد، گاهی یک انسان را هم مسدود می‌کند. مورد کلاسیک یک ویرایشگر محتواست که مقاله‌ای حاوی یک نمونه‌کد را ذخیره می‌کند، یا یک فرم پشتیبانی که کسی در آن یک پیام خطای حاوی SQL را paste می‌کند. درخواست مشروع است؛ فقط شبیه یک حمله به نظر می‌رسد.

اینجاست که WAFها عملیاتی برده می‌شوند یا می‌بازند. اگر یک false positive یعنی «سایت برای آن فرد خراب است و هیچ‌کس نمی‌تواند توضیح دهد چرا»، WAF ظرف یک ماه خاموش می‌شود — که بدترین نتیجه است، چون محافظت بی‌سروصدا ناپدید می‌شود درحالی‌که همه فکر می‌کنند روشن است.

آنچه آن را قابل‌دوام می‌کند traceability (ردیابی‌پذیری) است. روی edge ما یک درخواست مسدودشده یک صفحهٔ 403 اختصاصی همراه با یک reference ID برمی‌گرداند، و آن شناسه به رکورد لاگ ممیزی همراه با قانونی که مطابقت داشته و فیلدی که رویش مطابقت داشته نگاشت می‌شود. یک گفت‌وگوی پشتیبانی به‌جای «سایت گاهی من را مسدود می‌کند»، به «قانون 942100 با فیلد content روی آدرس ویرایشگر مطابقت داشت» تبدیل می‌شود. راه‌حل بعد از آن یک استثنای باریک است: آن قانون، آن فیلد، آن مسیر. نه خانوادهٔ قانون، و نه کل سایت.

سطوح paranoia: دستگیره‌ای که هیچ‌کس توضیحش نمی‌دهد

Core Rule Set با paranoia levelهایی از 1 تا 4 عرضه می‌شود. سطح 1 موارد بدیهی را می‌گیرد و به‌ندرت یک انسان را مسدود می‌کند. هر سطح بالاتر قواعدی اضافه می‌کند که سخت‌گیرانه‌تر و مستعدتر به false positive‌اند، تا جایی که در سطح 4 یک فایروال چیزهایی را رد می‌کند که یک اپلیکیشن معمولی هر روز انجام می‌دهد.

توصیهٔ صادقانه هیجان‌انگیز نیست. از پیش‌فرض شروع کنید، یک هفته لاگ را تماشا کنید، و فقط اگر چیزی را محافظت می‌کنید که هزینهٔ عملیاتی را توجیه می‌کند سطح را بالا ببرید — و بعد اول آن را در یک محیط staging انجام دهید. اکثر سایت‌ها با یک سطح 1 خوب‌تنظیم‌شده بهتر سرویس داده می‌شوند تا یک سطح 3 که کسی بعد از سومین شکایت بی‌سروصدا غیرفعالش کرده.

چگونه «پوشش OWASP Top 10» یک فروشنده را ارزیابی کنیم

چهار سؤال اکثر تبلیغات را کنار می‌زند.

1. کدام rule set، و کدام نسخه؟ «مبتنی بر OWASP» می‌تواند به معنای Core Rule Set باشد یا قواعد خودِ فروشنده با نام‌هایی به سبک OWASP. نسخه هم مهم است — rule setها بازبینی می‌شوند، و اجرای یک نسخهٔ قدیمی‌تر یک مصالحهٔ واقعی است نه یک جزئیات. ما CRS را اجرا می‌کنیم و آن را عمداً ارتقا می‌دهیم، با تست در برابر الگوهای false positiveای که مشتریان خودمان به آن‌ها برخورد می‌کنند، نه ردیابی خودکار upstream.

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

3. چگونه یک فیلد را روی یک مسیر معاف کنم؟ اگر کوچک‌ترین استثنای موجود «غیرفعال‌کردن خانوادهٔ قانون برای این سایت» است، محصول دارد شما را به‌سمت خاموش‌کردن محافظت هل می‌دهد.

4. چه چیزی پوشش داده نشده؟ فروشنده‌ای که پاسخ می‌دهد «access control و منطق کسب‌وکار کد خودتان است، نه قواعد ما» دارد حقیقت را می‌گوید. کسی که ادعای پوشش کامل Top 10 می‌کند دارد یک فهرست دسته را توصیف می‌کند، نه یک قابلیت.

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

آیا یک WAF اپلیکیشن من را OWASP compliant می‌کند؟

چیزی به نام OWASP compliance وجود ندارد. Top 10 یک سند آگاهی‌بخشی و اولویت‌بندی است، نه یک استانداردی که در برابرش certify شوید. یک WAF در برخی دسته‌ها exposure را کم می‌کند و در بقیه هیچ کاری نمی‌کند؛ اپلیکیشن همچنان باید با دقت نوشته شود.

آیا OWASP Core Rule Set همان OWASP Top 10 است؟

نه. Top 10 فهرست ریسک است. Core Rule Set یک مجموعه قاعدهٔ تشخیص عمومی است که توسط همان بنیاد نگهداری می‌شود و توسط ModSecurity و موتورهای سازگار استفاده می‌شود. rule set چندین دسته از Top 10 را پوشش می‌دهد؛ فهرست را پیاده‌سازی نمی‌کند.

آیا یک WAF می‌تواند SQL injection را کاملاً متوقف کند؟

اکثریت بزرگ تلاش‌های فرصت‌طلبانه را متوقف می‌کند و تلاش لازم برای تلاش‌های هدفمند را بالا می‌برد. جایگزینی برای کوئری‌های parameterized نیست، چون یک مهاجم مصمم payload را برای فرارکردن از pattern matching تنظیم می‌کند. آن را به‌عنوان یک لایهٔ عمق در نظر بگیرید، نه راه‌حل نهایی.

virtual patching چیست؟

مسدودکردن شکل exploit یک آسیب‌پذیری شناخته‌شده در فایروال، درحالی‌که منتظر استقراردادن رفع واقعی هستید. در پنجرهٔ بین عمومی‌شدن یک CVE و رسیدن پنجرهٔ نگهداری شما واقعاً مفید است، و اگر پاسخ دائمی شود خطرناک است.

برای کدام دستهٔ Top 10 باید بیشتر نگران باشم؟

Broken Access Control، چون بالای فهرست فعلی نشسته، رایج است، و همان دسته‌ای است که فایروال شما نمی‌تواند در آن کمکی کند. بررسی کنید هر آبجکتی که API شما برمی‌گرداند چیزی باشد که کاربر احرازهویت‌شده به آن حق دارد — اکثر این باگ‌ها یک بررسی مالکیت گمشده در یک کنترلر هستند.