علی سلیمانی
علی سلیمانی
خواندن ۴ دقیقه·۱ سال پیش

چگونه از رمزگشایی ترافیک HTTPS بین نرم افزار و سرور توسط مهاجمان جلوگیری کنیم؟

توی دنیای امروز، امنیت اطلاعات خیلی مهمه، و به ویژه تو پروژه‌هایی که ارتباط بین نرم‌افزار و سرورشون می‌تونه تهدید بشه. یکی از حملات رایج توی این زمینه، حمله Man-in-the-Middle (MITM) هست که مهاجم می‌تونه ترافیک HTTPS بین نرم‌افزار و سرور رو رمزگشایی کنه و ازشون سو استفاده کنه. برای کاهش این نوع حملات، روش‌های مختلفی وجود دارن، و یکی از اونا استفاده از Dynamic Certificate Pinning (پین کردن گواهی SSL به شکل پویا) هست.

اگر به مطالعه به زبان انگلیسی علاقه‌مند هستید میتونید نسخه انگلیسی این مقاله رو در مدیوم بنده مطالعه کنید: https://medium.com/@alisolphp/a24f41a5996d
حمله MITM توسط کاربر برنامه با استفاده از
حمله MITM توسط کاربر برنامه با استفاده از


تحقیق و طوفان فکری:

ما اخیرا در یکی از پروژه‌ها برای افزایش امنیت نرم‌افزار ویندوز و اندروید به سراغ پیاده سازی روش Dynamic Certificate Pinning رفتیم. هدف اصلی این پروژه جلوگیری از حملات MITM و ندادن اجازه‌ی رمزگشایی ترافیک HTTPS بین نرم افزار ما و سرور بود. از طریق همکاری با سایر اعضای تیم توسعه، با استفاده از رویکرد Dynamic Certificate Pinning به این هدف دست پیدا کردیم.

ایده اصلی:

به واقع، من باید به checkmyhttps.net قدردانی کنم، چرا که ایده اصلی رو از اینجا به دست آوردم.
به واقع، من باید به checkmyhttps.net قدردانی کنم، چرا که ایده اصلی رو از اینجا به دست آوردم.


می‌تونید افزونه CheckMyHTTPS رو تو فایرفاکس یا کروم نصب کنید و ببینید که آیا ابزارهایی مثل Fiddler در حال رمزگشایی ترافیک HTTPS هستن یا نه.

فاز 1:

من به‌عنوان برنامه‌نویس بک‌اند در تیم، یک Restful API آماده کردم که اثر انگشت‌های مرتبط با گواهی‌های مورد استفاده در سرور را نمایش می‌دهد. این اثر انگشت‌ها کدهای منحصر به فردی هستن که می‌تونیم از آنها برای تأیید صحت یک گواهی استفاده کنیم.


اثر انگشت‌های مرتبط با گواهی استفاده شده در سرور
اثر انگشت‌های مرتبط با گواهی استفاده شده در سرور


می تونید نمونه کد PHP برای دریافت اثر انگشت گواهی SSL از یک دامنه رو در Github من مشاهده کنید: https://github.com/alisolphp/Get-SSL-Certificate-Fingerprints


فاز 2:

در ابتدا، برنامه‌های Windows و Android با درخواست به این API، این اثر انگشت‌ها رو دریافت می‌کنند. بعد با استفاده از یک تایمر پیوسته، درخواست‌هایی رو به طور مکرر به سرور ارسال می‌کنن و اثر انگشت گواهی‌های فعلی که مشاهده می‌کنن رو با اثر انگشت‌های به‌دست‌ اومده از API مقایسه می‌کنن.


فاز 3:

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


اثر انگشت‌های گواهی SSL سرورر
اثر انگشت‌های گواهی SSL سرورر


اثر انگشت‌های گواهی SSL که نرم‌افزار مشاهده می‌کنه وقتی که یک مهاجم مشغول رمزگشایی ترافیک HTTPS هست
اثر انگشت‌های گواهی SSL که نرم‌افزار مشاهده می‌کنه وقتی که یک مهاجم مشغول رمزگشایی ترافیک HTTPS هست


نتیجه:

با استفاده از روش Dynamic Certificate Pinning، ما تونستیم امنیت ارتباط بین برنامه های ویندوز و اندروید رو در پروژه افزایش بدیم. این روش یک لایه امنیتی اضافی فراهم می‌کنه و به نرم‌افزار کمک می‌کنه تا از حملات MITM توسط کاربر جلوگیری کنه.

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

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

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


در نتیجه، استفاده از روش Dynamic Certificate Pinning در پروژه‌های ویندوز و اندروید می‌تونه به طور قابل توجهی امنیت ارتباطات رو بهبود ببخشه و پیامدهای نامطلوب حملات MITM رو کاهش بده. با توجه به اهمیت امنیت اطلاعات، این روش می‌تونه به عنوان یک روش استاندارد در پروژه‌های آینده شما عمل کنه.


یه قدم بیشتر!

احتمالا الان به ذهن‌تون رسیده باشه که اگر مهاجم نتیجه درخواستی که نرم‌افزار به API میفرسته رو دستکاری کنه و اثر انگشت‌های گواهی خودش رو در اون جایگذاری کنه، میتونه نرم‌افزار رو فریب بده و این روش رو دور بزنه. بله درست حدس زدید!

حالا راه‌کار چیه؟ برای این‌کار لازمه اثر انگشت‌هایی که در جواب API برمیگردونیم رو با یک روش رمزگذاری مناسب مثل AES رمزگذاری کرده باشیم و فقط نرم‌افزار بتونه اون رو رمزگشایی کنه و همچنین با ایجاد یک وب پروکسی قبل از هر درخواست HTTP (به این صورت) میتونیم از خونده شدن ریکوئست‌هامون توسط ابزارهایی مثل Fiddler جلوگیری کنیم.


لطفاً اگر نظری در این مورد دارید یا تجربیات مشابهی دارید، در بخش نظرات به اشتراک بگذارید. متشکرم!

علی سلیمانی

برنامه نویس PHP Backend

نرم افزارترافیک httpsرمزگشایی ترافیکrestful api
یه PHP Developer که دوست داره با کد نویسی دنیا رو جای بهتری کنه.
شاید از این پست‌ها خوشتان بیاید