فا

‫ آشنایی با پایگاه داده CouchDB و آسیب پذیری های شناخته شده وراهکارهای رفع آنها

معرفی 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) شناخته می‌شود، سه پارامتر ورودی دریافت می‌کند:

  1. NewDoc: نسخه جدید سند
  2. oldDoc: نسخه فعلی سند
  3. 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به صورت زیر خواهد شد:


نظرات

بدون نظر
شما برای نظر دادن باید وارد شوید

نوشته

 
تاریخ ایجاد: 17 مرداد 1397

دسته‌ها

امتیاز

امتیاز شما
تعداد امتیازها: 0