آسیب‌پذیری Apache OpenWhisk

آسیب‌پذیری Apache OpenWhisk که میتوانست باعث تغییر کد توابع شود.

 آسیب‌پذیری Apache OpenWhisk

آسیب‌پذیری Apache OpenWhisk که میتوانست باعث تغییر کد توابع شود.

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

طرز کار به این صورت است که رویدادهای مختلفی می‌توانند باعث اجرای توابع (عملکردهای) (functions) مختلفی شوند که روی سرور قرار دارند.

«Apache OpenWhisk یک سکوی متن‌باز ابری بدون سرور است که در پاسخ به رویدادها در هر مقیاسی توابع را اجرا می‌کند.» IBM Cloud Functions یکی از سرویس‌دهنده‌های مبتنی بر OpenWhisk است.

در OpenWhisk هر عملکرد در یک کانتینر داکر اجرا می‌شود. برای برقراری ارتباط با عملکرد باید از طریق پورت 8080 به کانتینر درخواست REST ارسال شود. هر کانتینری که یک عملکرد در آن اجرا می‌شود، دو نقطه ورودی دارد:

/init کدی که باید داخل کانتینر اجرا شود را دریافت می‌کند.

/run آرگومان‌های تابع را گرفته و آن را اجرا می‌کند.

اما Puresec یک مشکل امنیتی را در OpenWhisk کشف کرده است: اگر تابع مورد نظر دارای آسیب‌پذیری‌ای باشد که به مهاجم اجازه ارسال درخواست به /init از طریق پورت 8080 را بدهد، مهاجم ممکن است بتواند کد تابع را بازنویسی کند. کد جدید می‌تواند کدی مخرب باشد و اطلاعاتی را سرقت کند. مشکل تنها به اینجا ختم نمی‌شود چون ممکن است افراد دیگری نیز در آینده به آن تابع درخواست بفرستند و اطلاعاتشان نشت کند.

 

مثالی از حمله:

کد زیر، یک عملکرد به زبان پایتون است که به کمک ابزار pdftotext در CLI نام یک فایل pdf را می‌گیرد و آن را به متن تبدیل می‌کند. همان طور که ملاحظه می‌شود، دستور Poepn یک دستور shell را اجرا می‌کند و با تزریق کد می‌توان دستورات دلخواه را به وسیله آن اجرا کرد.

 

 

در کد زیر یک ورودی به تابع فوق داده شده است که مقدار filename را برابر یک مقدار تهی قرار داده و پس از آن دستورات shell دیگری را فرامی‌خواند. بخش مهم این دستورات این است که تابع main بازتعریف می‌شود (def main(dict):…) و به پورت 8080 درخواست فرستاده می‌شود.

 

 

خروجی:

 

اما دفعات بعدی که عملکرد فراخوانی می‌شود خروجی آن به شکل زیر خواهد بود:

 

راه حلی که Puresec پیشنهاد داد، این بود که نقطه ورودی /init تنها یک بار قابل دسترسی باشد و درخواست‌های بعدی که به آن می‌رسند مسدود شوند. آپاچی و IBM Cloud Functions این راه حل را پیاده‌سازی کرده و مشکل را حل نمودند.

 

 

منابع:

 

https://www.youtube.com/watch?v=GQSyN4j6Cqc&feature=youtu.be

https://openwhisk.apache.org

https://www.puresec.io/hubfs/Apache%20OpenWhisk%20PureSec%20Security%20Advisory.pdf

https://nvd.nist.gov/vuln/detail/CVE-2018-11756

https://nvd.nist.gov/vuln/detail/CVE-2018-11757

https://threatpost.com/apache-ibm-patch-critical-cloud-vulnerability/134341/

 

 

 

کلمات کلیدی