معرفی CouchDB
CouchDB یک پایگاه دادهی پیشرفته #NoSql است که از محصولات شرکت Apache میباشد. درحقیقت، CouchDB برای اولین بار در سال 2005 منتشر شد و بعد از آن در سال 2008، امتیاز آن توسط Apacheخریداری شد.
در هنگام کار با حجم عظیم دادهها که نیاز به سازماندهی داشته باشند، استفاده از رویکردهای ساختار یافتهی RDBMSمانند SQLمشکلاتی از قبیل پایین آمدن کارایی به دنبال دارند. NoSQLیک چارچوب متفاوت از پایگاه داده با کارایی بالا و پردازش سریع در مقیاس های بزرگ ارائه میدهد.
چارچوب NoSQL، از زبان پرس و جوی ساخت یافته SQLیا مدل داده رابطهای استفاده نمیکند و از مزیتهای مهم آن میتوان به مقیاسپذیری و مدیریت دادههای کلان اشاره داشت.
پایگاه دادهی CouchDBا ز نوع پایگاه داده سندگرا (Document Base) است. این نوع از پایگاه دادهها، مجموعهای از اسناد هستند که به زبان JSON ذخیره شده و برای وب سایتها و برنامههای تحت وب مناسب میباشند. این اسناد به صورت مجموعهای از کلید/مقدار هستند که از طریق کلید میتوان به مقدار آن دسترسی داشت و ویژگیهای اعتبار سنجی دادهها، پرس و جو و تأیید هویت کاربر را دارند.
این پایگاه داده به زبان Erlang نوشته شده و در سیستم عاملهای مختلف قابل اجرا میباشد. CouchDBاز پروتکل HTTPبرای دسترسی و به روز رسانی اسناد استفاده میکند و برای کار با دادهها از زبان JavaScriptبهره میبرد.
در CouchDBبه طور پیش فرض پورت 5984 برای دسترسی در نظر گرفته شده است.
امنیت و اعتبارسنجی
در هنگام نصب پایگاه داده، به صورت پیش فرض کلیه کاربرانی که به پایگاه داده دسترسی دارند، نقش ادمین را دارند و ادمین میتواند کاربرانی را با نقش مدیر یا کاربر عادی با دسترسیهای مختلف ایجاد کند. با استفاده از توابع موجود میتوان اعتبارسنجی اسناد را انجام داده تا ورودیهای کاربران هنگام به روز رسانی و یا ایجاد اسناد بررسی شود.
تابع اعتبار سنجی که در پایگاه داده با نام (Validate_doc_update) شناخته میشود، سه پارامتر ورودی دریافت میکند:
- NewDoc: نسخه جدید سند
- oldDoc: نسخه فعلی سند
- userCtx: اطلاعات مربوط به کاربر مورد نظر
خروجی تابع اجازه به روز رسانی و یا عدم امکان به روز رسانی سند مورد نظر را مشخص میکند.
آسیبپذیریهای شناخته شده
CVE-2017-12635: پایگا داده CouchDB به کاربران اجازه میدهد که اسکریپت اعتبارسنجی اسناد را با جاوا اسکریپت ایجاد کنند. این اسکریپتها هنگامی که یک سند ایجاد یا به روز میشود، به طور خودکار ارزیابی میشوند.
CouchDB مدیریت حسابهای کاربری را از طریق یک پایگاه داده ویژه به نام users_ مدیریت میکند. هنگامی که کاربری در پایگاه داده CouchDB ایجاد شده و یا تغییر داده میشود (معمولاً با عمل PUTبه /_users/org.couchdb.user:your_username، انجام میشود)، سرور تغییرات پیشنهادی را با یک تابع validate_doc_update مقایسه میکند تا مطمئن شود که فرد درخواستکننده مجوز انجام عملیات مورد نظر را داشته باشد (به عنوان مثال قصد تغییر مجوز دسترسی خود به ادمین سیستم را نداشته باشد).
دلیل آسیبپذیری مورد نظر این است که بین پارسر Jscript JSONو پارسر داخلی به نام jiffyکه توسط CouchDBاستفاده میشود، اختلاف وجود دارد (در صورت وجود دو داده با کلید یکسان، jiffyهر دو مقدار را ذخیره خواهد کرد ولی پارسر جاوا اسکریپت، فقط آخرین مقدار را ذخیره میکند).
به عنوان مثال در صورتی که شئ {“guest”:”1”,”guest”:”2”}را داشته باشیم:
Erlang
jiffy:decode("{\"guest\":\"1\", \"guest\":\"2\"}") {[{<<"guest">>,<<"1">>},{<<"guest">>,<<"2">>}]}
JavaScript
JSON.parse("{\"guest\":\"1\", \"guest\": \"2\"}") {guest: "2"}
با این حال تابع برگرداننده برای نمایش در CouchDB تنها مقدار اول را باز میگرداند:
Within couch_util:get_value % .lists:keysearch(Key, 1, List)
در حالتی که برای یک کاربر دو مجوز تعریف شود، در Erlang تنها مجوز اول دیده میشود و جاوا اسکریپت، مجوز دوم را در نظر میگیرد. از آن جایی که تمامی منطق بررسی مجوز دسترسی و تعیین اعتبار در سمت Erlang صورت میگیرد، به همین دلیل میتوان برای کاربر دو مجوز با کلید یکسان که یکی مقدار ادمین و دیگری مقدار خالی داشته را ایجاد کرد. در این حالت در هنگام تایید مجوز، مجوز دوم یعنی مقدار خالی، بررسی میشود و در حال دریافت مجوز، مجوز اول یعنی دسترسی ادمین بررسی میشود و میتوان به پایگاه داده دسترسی داشت.
این آسیبپذیری در ورژنهای قبل از 1.7.0و از 2.x تا 2.1.0 وجود دارد.
CVE-2017-12636: پایگاه داده CouchDB آسیبپذیری شناخته شدهای دارد که تا زمانی که فرد دارای امتیازهای مدیریتی است اجازه میدهد تا از راه دور به اجرای کد بپردازد. کاربران با مجوز ادمین در CouchDB میتوانند سرور پایگاه داده را از طریق HTTP (S)پیکربندی کنند. برخی از گزینههای پیکربندی عبارتند از مسیرهای در سطح سیستم عامل که توسط CouchDB استفاده میشوند. این موضوع به کاربران ادمین اجازه میدهد در Apache CouchDB نسخهی قبل از 1.7.0و 2.xقبل از 2.1.1به اجرای دستورات دلخواه پوسته، از جمله دانلود و اجرای اسکریپت از اینترنت، به عنوان کاربر CouchDB بپردازند.
پیشنهادها و راهکارهای رفع آسیبپذیری
- به روز رسانی پایگاه داده به نسخه ی 1.7 یا 2.1.1 به بالا
- تغییر فایل local.ini (معمولاً در /etc/couchdb/قرار دارد) و اضافه کردن خط زیر به بخش [httpd]:
config_whitelist = []
در این حالت API _config کاملاً غیر فعال میشود. در صورت نیاز به تغییر تنظیمات در CouchDB باید این تغییر به صورت دستی در فایل local.ini انجام شود. این راه حل برای رفع آسیبپذیری CVE-2017-12635 قابل استفاده است.
- جلوگیری از ایجاد کاربر توسط افراد غیر ادمین: در CouchDB به صورت پیش فرض، افراد ناشناس میتوانند یک کاربر جدید در پایگاه داده ایجاد کنند. برای جلوگیری و یا محدود کردن این کار، میتوان به سند _design/_auth یک محدودیت اضافه کرد. در این سند بخشهایی برای محدود کردن عملکردهای کاربران وجود دارد. باید در تابع validate_doc_updateدر ابتدای بخش !is_server_or_database_admin(userCtx, secObj)خط زیر را برای جلوگیری از انجام عملیات توسط کاربرانی که ادمین نیستند، اضافه کرد.
throw({forbidden : 'Users can only be created by server or db admins in this specific CouchDB installation'})
در این حالت، تابع validate_doc_update به صورت زیر خواهد شد:
- 90