امنیت

امنیت در سامانه نام دامنه

در اینترنتی که می شناسیم با سایت ها و آدرس های url سر و کار داریم. پروتکل TCP/IP از IP برای آدرس دهی سرورها استفاده می کنه و ما برای ارسال و گرفتن اطلاعات به یک سرور، باید IP اون رو بدونیم. برای راحت کردن استفاده کاربرها و برای اینکه همه مجبور نباشن برای مثال IP موتور جستجوی گوگل رو وارد کنن باید فکری می شد. بنابراین هر سایت یک آدرس منحصر به فرد انتخاب کرد که در مورد مثالمون google.com بود و وظیفه تبدیل این آدرس به IP برعهده ماشین ها گذاشته شد. سامانه نام دامنه یا Domain Name System که خلاصه اش می شه DNS این کار رو انجام می ده. در این پست به بخشی از مباحث امنیت در سامانه نام دامنه خواهم پرداخت و یکی دو نرم افزار برای بالابردن امنیت معرفی خواهم کرد.

خب بذارید ببینیم قبل از دیدن صفحه گوگل چه اتفاقاتی می افته و نقطه های خطر رو پیدا کنیم.

ابتدا مرورگر رو باز می کنیم و google.com رو تایپ کرده و از مرورگر می خوایم که این آدرس رو برامون بیاره. مرورگر نگاه می کنه ببینه آیا در کامپیوترمون IP متناظر با google.com ذخیره شده یا خیر (کش DNS). اگر شده باشه، همون IP رو به عنوان مقصد انتخاب می کنه و اطلاعات دریافتی از اون IP رو به عنوان سایت گوگل به ما نشون می ده.

در صورتیکه IP متناظر در سیستم عامل ما وجود نداشته باشه، از یک سرویس دهنده می پرسه که IP متناظر با گوگل چیه. اون سرویس دهنده از پایگاه داده ای که داره استفاده می کنه و نتیجه رو برای مرورگر ما ارسال می کنه و سپس مرورگر اطلاعات اون IP رو به عنوان google.com به ما نشون می ده. در ضمن در کش DNS سیستممون هم این IP متناظر با سایت google.com ثبت می شه که در مراجعه بعدی، سریعتر IP پیدا بشه.

سرویس دهنده ای که در پاراگراف قبل گفتم می تونه در تنظیمات سخت افزار شبکه (کارت شبکه) مشخص بشه. معمولا ISP های ایران در انتخاب اول DNS خودشون رو برای کاربر تعیین می کنند و در انتخاب بعدی DNS گوگل رو. سرویس دهنده های مختلف و بیشماری وجود دارند که کار تبدیل نام دامنه به IP رو برای کاربرها انجام می دن.

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

مهمترین خطر در بحث DNS، جایگزین کردن IP تقلبی با IP واقعی سایته که می تونه در سطح سیستم عامل و یا در سطح سرویس دهنده اتفاق بیافته. بسیاری از بدافزارها وقتی که سیستم ما رو آلوده می کنن، کش DNS یا در واقع IP های ذخیره شده رو تغییر می دن. یعنی اگر IP واقعی گوگل ۷۴.۱۲۵.۲۳۹.۱۰۱ باشه، بدافزار در ذخیره سیستم ما، اون رو به ۱۸۵.۱۸۵.۱۸۵.۱۸۵ (برای مثال) تغییر می ده. از این به بعد هروقت مرورگر خواست سایت گوگل رو باز کنه، اطلاعات ارسالی از یک سرور خطرناک رو برای ما میاره. موتور جستجوی گوگل حتی اگر تقلبی هم باشه ممکنه برای خیلی ها مهم نباشه ولی فرض کنیم سایت بانک ما هم تقلبی باشه، اون وقت تمام اطلاعاتی که وارد می کنیم مثل شماره حساب و پسورد، در اختیار هکرها قرار می گیره.

dns

با توجه به ارسال و دریافت اطلاعات به سرورهای ارائه دهنده سرویس نام دامنه، کسانی که در یک شبکه اند و یا کنترل نقطه های میانی اتصال را بر عهده دارند، می تونن این اطلاعات رو ببینند و حتی تغییر بدن.

از نمونه های واقعی این خطرها میشه به هک شدن سایت گوگل و یاهو در آذربایجان از طریق هک سرویس دهنده DNS منطقه ای اشاره کرد. در این حالت در واقع سایت ها هک نشدن بلکه کاربرها به سرورهای دیگری منتقل می شوند.

نکته بعدی در بحث امنیت DNS بیشتر به حریم خصوصی مربوط می شه. درواقع سرویس دهنده نام دامنه ما، کلیه سایت هایی که بازدید کردیم رو می دونه. شاید خواسته یا ناخواسته یک سایت بزرگسالان رو باز کنیم و نخوایم که ISP بدونه. ضمن اینکه در بسیاری از کشورها، ISP ها لیست وبسایت های بازدید شده کاربران رو برای مدت های طولانی نگه می دارن و در اختیار مراجع رسمی می ذارن. بازدید از سایت های به اشتراک گذاری فیلم و موزیک، می تونه نشون دهنده دانلود غیر قانونی باشه که در برخی کشورها تبعاتی برای کاربر داره. نمونه های مشابه بسیاره.

برای جلوگیری از خطرات گفته شده چند کار رو همزمان باید انجام بدیم.

  • اول اینکه با بالابردن سطح امنیت کامپیوتر و استفاده از آنتی ویروس و فایروال و غیره، مطمئن بشیم که سیستم ما آلوده به بدافزار نیست.
  • دوم اینکه کش DNS رو به صورت دوره ای پاک کنیم که در صورت تغییر این فایل، مشکلات در سیستم باقی نمونه.
  • سوم اینکه از سرویس های امن تری به جای سرویس ISP استفاده کنیم. یکی از مشهورترین سرویس ها  در این زمینه OpenDNS است.
  • و در آخر اینکه از رمزگذاری برای رد و بدل اطلاعات با سرویس دهنده نام دامنه استفاده کنیم تا احتمال تغییر اطلاعات در بین راه رو کم کنیم (چیزی شبیه استفاده از https به جای http).

سرویس دهنده OpenDNS ابزاری برای رمزگذاری ترافیک DNS ارائه کرده به اسم DNSCrypt. استفاده از DNSCrypt می تونه ردیف ۳ و ۴ لیست بالا رو همزمان انجام بده. درضمن این نرم افزار به صورت متن بار منتشر شده که می تونه در بحث امنیت یک قدم به جلو باشه.

با توجه به انتشار متن این نرم افزار، توسعه دهنده های دیگری با استفاده از این منبع، ابزارهای دیگری ساختند که دست کاربر رو بازتر می کنه. یک نمونه خوب از این نرم افزارها در سیستم عامل ویندوز DNSCrypt Windows Service Manager است.

DNSCrypt Windows Service Manager با اینکه ظاهر ساده ای داره اما این امکان رو به کاربر می ده که از سروری غیر از سرور OpenDNS استفاده کنه. همچنین می تونیم پروتکل UDP یا TCP رو انتخاب کنیم و یا از IP v6 به جای IP v4 استفاده کنیم.

قبل از انتخاب سرورهای لیست شده در این نرم افزار مطمئن بشید که اون سرویس دهنده تاریخچه وبگردی شما رو نگه نمی داره یا با سایت های تبلیغاتی و دولت ها به اشتراک نمیذاره.

این نرم افزار در مراحل اولیه است و توسعه دهنده اش گزینه های زیادی برای نسخه های بعدی در نظر گرفته.

هرچند استفاده از سرورهای امن DNS و رمزگذاری ترافیک راه خوبی برای بالا بهتر کردن امنیت و حریم خصوصیه اما در صورتیکه از شبکه های عمومی استفاده می کنید و یا از شبکه های که بهش مشکوکید و احتمال نفوذ و یا کنترل داره (مثل WiFi رستوران و هتل)، پیشنهاد می شه از شبکه خصوصی مجازی یا VPN کمک بگیرید.

Standard
امنیت

شناسایی درهای پشتی در کدهای PHP

چند وقته که در کنار کتاب و مقاله هایی که می خونم و کارهایی که می کنم، علاقه زیادی به آنالیز کدهای مخرب پیدا کردم. یکی از این علاقه ها، شناسایی درهای پشتی در کدهای PHP است. در ادامه اشاره کوتاهی خواهم کرد به نشونه هایی که می تونه منجر به شناسایی کدهای مخرب بشه و البته روش های بدافزارنویس ها برای دور موندن از چشم کارشناس های امنیتی.

phpbackdoor

backdoor یا درپشتی در واقع یک تکه کده که به هکر امکان دسترسی مجدد به سایت هک شده رو می ده حتی اگه ادمین تموم پسوردها رو تغییر بده. این تکه کد می تونه ۱۰۰خط باشه یا یکی دو خط.  یکی از ابتدایی ترین شیوه ها گذاشتن یک درپشتی واضح و سر راسته:

این یک خط کد می تونه در یک فایل PHP جدید گذاشته بشه و یا به راحتی در یکی از چندین فایل قالب سایت اضافه بشه و از چشم ادمین دور بمونه. البته افزونه ها و یا نرم افزارهای امنیتی با چک کردن کل فایل های سایت و استفاده از پترن های شناخته شده این درهای پشتی رو خیلی زود پیدا می کنند. افزونه ها معمولا دنبال این توابع می گردن:

به دلیل پیشرفته تر شدن کارشناسان امنیتی و نرم افزارهاشون، هکرها هم به سمت آموزش و استفاده از روش های جدیدتر رفتن. روش هایی که بعضی مواقع زمان زیادی رو از کارشناسان امنیتی می گیره تا بتونن کشفش کنن. مثلا با استفاده از یک سری توابع PHP کدشون رو ناخوانا می کنند. کد زیر در واقع همون درپشنی در مثال قبله با این تفاوت که کل کد با متد base64 رمز شده.

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

روش دیگه ناخوانا کردن یک در پشتی می تونه مثال زیر باشه. این روش هم هرچند قابل پیدا شدنه اما با کمی خلاقیت می شه اون رو از چشم افزونه های امنیتی دور کرد و یا حداقل کاری که می کنه رو مخفی کرد:

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

نمونه های زیادی وجود داره که می شه مثال زد و بررسی که چکار می کنه اما در پایان می خوام اشاره ای بکنم به نمونه ای که یکی از سایت های فعال در بحث امنیت اون رو پیدا کرده و خب قاعدتا به زودی پترن های استفاده و کشفش در افزونه های امنیتی اضافه می شه.

در این نمونه نویسنده درپشتی، از فراخوانی توابع در تابع های عادی PHP استفاده کرده:

کاری که array_diff_ukey می کنه اینه که دوتا آرایه رو بر اساس کلید ها مقایسه می کنه و تفاوت ها رو بر می گردونه. یه گزینه دیگه هم داره که می تونه یک تابع دیگه رو فرابخونه و  این تفاوت های پیدا شده رو به اون بده و اون تابع رو اجرا کنه. مثلا تصویر زیر می تونه جمله All your data belong to me! رو در خروجی نشون بده

array_diff_ukey

در کد اصلی سه متغیر از  کاربر گرفته می شه که تفاوت دو تا به عنوان ورودی تابع عمل خواهد کرد و خود تابع نیز از طریق متغیر سوم مشخص می شه.

می بینید که هیچ نکته غیر عادی در کد وجود نداره. ضمن اینکه این شیوه محدود به تابع array_diff_ukey نیست و با همین شیوه می شه از همه توابعی که تابع دیگه ای رو فراخوانی می کنن، استفاده کرد. باید پترنی رو پیدا کرد که تشخیص خودکار این روش رو ممکن کنه.

در پایان باید بگم:
اگر تجربه هک شدن سایتتون رو دارید حتما کار پاک سازی رو به یک کاردان بسپرید و به تغییر پسوردها بسنده نکنید هرچند که تغییر پسورد قدم اوله.
اگر از CMS هایی مثل وردپرس و جوملا استفاده می کنید حتما افزونه های امنیتی رو به کار ببرید.
هرگز از قالب و افزونه هایی که منتشر کننده ناشناس یا غیرمعتبر داره استفاده نکنید و یا اونها رو از سایت های متفرقه دانلود نکنید. همونطور که دیدید فقط یک خط در یکی از فایل هایی که روی سرور میذارید می تونه منجر به هک بشه.

 

Standard
امنیت

اپلیکیشن های موبایل چی از ما می دونن؟

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

گستره زیادی از اطلاعات جمع آوری می شه از مکان جغرافیایی و شماره تلفن و شماره شناسه گوشی تا اطلاعات شخصی مثل سن و جنسیت و لیست شماره دوستان و غیره.

وال استریت ژورنال در یک تحقیق یه سری اپلیکیشن (از جمله اپ خودشون) رو بررسی کرده تا ببینه کدوم ها این اطلاعات رو جمع می کنن و به کی ارسال می کنن. این اپلیکیشن ها از لیست محبوب ترین های هر سیستم عامل انتخاب شدن.

در تصویر زیر اپلیکیشن های اندرویدی رو خواهید دید و هرجا که در ستون مربوطه پر رنگ بود یعنی اطلاعات به شرکت هایی غیر از سازنده اصلی اپلیکیشن ارسال می شه و هرجا کم رنگ (راه راهه در واقع) بود یعنی اطلاعات اون ستون به سرورهای سازنده اپ ارسال می شه.

WSJ-android

 

وضعیت اپلیکیشن های آیفون هم وضعیت بهتری نداره.

WSJ-iphone

Standard