امنیت در بازی های آنلاین
فهرست مطالب
در این مقاله ی مهم همراه تمامی کاربران و توسعه دهندگان بازی هستیم تا امنیت در بازی را از بعد دیگری مورد بررسی قرار دهیم.
امنیت بازی شامل بخش های متنوعی می باشد که در اینجا ما قصد بررسی امنیت در بازی های آنلاین را داریم.
بازی های آنلاین بیشترین خطر و تهدید را در مسائل امنیتی سمت سرور و کلاینت دارند ؛ به همین خاطر رعایت نکاتی که در ادامه به آن می پردازیم ، بسیار حائز اهمیت می باشد.
و این امنیت زمانی یک مسئله ی حیاتی می شود که تراکنشات مالی نیز در بازی وجود داشته باشد و اطلاعات مهمی از کاربران در بازی شما ثبت شود.
با ما همراه باشید.
(ما قبلا در مقاله ی امنیت بازی و اپلیکیشن وجه دیگری از امنیت بازی را به صورت کلی بررسی کرده ایم ، که برای مطالعه ی نکات اولیه می توانید از آن مقاله دیدن کنید.)
فرایند کار یک بازی آنلاین
یک بازی آنلاین به طور همزمان روی هزاران ماشین اجرا می شود.
به طور معمول ، یک central server کانکشن را برقرار می کند و ارتباط را با فرآیندهای کلاینت در حال اجرا بر روی ماشین های بازیکنان هماهنگ می کند.
یک شبکه سراسری (اینترنت) داده ها را بین کلاینت ها و سرور حمل می کند.
در بازی های یک یا دو نفره ، تقلب یک مسئله جزئی است ، زیرا فقط یک یا دو نفر را در یک زمان تحت تاثیر قرار می دهد.
با این حال ، یک تقلب در یک بازی آنلاین می تواند هزاران نفر را تحت تاثیر قرار دهد و پیامدهای ماندگار مخربی داشته باشد.
از بین تمام مسائلی که توسعهدهنده بازی آنلاین باید به آن توجه داشته باشد، ممکن است امنیت در ابتدا یک مشکل پیش پا افتاده به نظر برسد.
با این حال ، برای فعال نگه داشتن یک سیستم بسیار مهم است.
اجرا تا پروسه ی کار بازی
بازی حاوی یک سری کد هایی است که با استفاده از یک پروتکل سفارشی طراحی شده با سرور ارتباط برقرار می کند.
دادههای استاتیک بزرگ ، مانند فایلهای گرافیکی ، صداها ، موسیقی و Layout معمولاً بخشی از نصب اولیه روی کلاینت هستند.
وقتی بازی بیشتر از یک سشن طول بکشد ، مقابله با بازیکنانی که خودسرانه وارد بازی می شوند و از بازی خارج می شوند، دشوار می شود.
Performance نیز مشکل ساز می شود ، زیرا مقدار game state به صورت خطی با تعداد بازیکنان افزایش می یابد ، در حالی که مقدار پهنای باند شبکه ثابت می ماند.
یک بازی شبکه ای ساده ، game state بسیار کمی دارد ؛ شاید به اندازه مختصات همه بازیکنان و هیولاها، سلاح ها و مهمات آنها.
این به هر کلاینت بازی اجازه می دهد تا کل game state را بداند و این امکان را فراهم می کند که تمام تغییرات game state های ایجاد شده توسط یک کلاینت را به دیگران منتقل کند.
برای حل مشکلات یک بازی در مقیاس بزرگ ، از طرفی ، یک یا چند سرور بازی در یک مکان مرکزی راه اندازی می شوند تا game state را پیگیری کنند.
هر یک از کلاینتهای بازی تغییرات خود را منحصراً به یک سرور بازی منتقل میکند ، که این تغییرات را فقط به کلاینتهایی که نیاز به دریافت آنها دارند، منتقل میکند.
به عنوان مثال ، اگر یک کاربر کاراکتر خود را جابجا کند ، سرور فقط باید به سایر کلاینت های مجاور کاربر اطلاع دهد.
این امر استفاده از پهنای باند بازی را تا حدی کاهش می دهد.
علاوه بر سرورهای بازی ، احتمالاً فرآیندهای دیگری نیز برای کارکرد کل سیستم در یک محیط تجاری مورد نیاز است.
اطلاعات حساب کاربر ممکن است در یک پایگاه داده خارجی ذخیره شود،
بهروزرسانیهای پویای بازی ممکن است از سرورهای FTP استفاده کنند و ارسالهای خودکار ممکن است به سرور SMTP نیاز داشته باشد.
این فرآیندها میتوانند روی همان ماشین بازی اجرا شوند ، اما به دلایل Performance ، معمولاً روی ماشینهای جداگانه اجرا میشوند.
اقدامات امنیتی لازم برای یک بازی آنلاین
اطلاعات حساس
دو هدف امنیتی در یک بازی آنلاین وجود دارد :
از اطلاعات حساس مانند شماره کارت اعتباری بازیکنان محافظت کنید.
level playing مساوی را فراهم کنید تا تقلب تا حد امکان دشوار باشد.
حفاظت از اطلاعات حساس عمدتاً به پیکربندی صحیح مجموعه سرور بستگی دارد.
هر دستگاه متصل به بازی ، مانند هر وب سرور ، FTP یا پایگاه داده، باید ایمن باشد.
همه سرورهای بازی باید پشت یک فایروال قرار داشته باشند که فقط به داده ها اجازه می دهد از طریق پورت هایی که بازی برای کار به آنها نیاز دارد ، متصل شوند.
در نهایت، مجموعه سرور باید در یک منطقه قفل شده قرار گیرد، زیرا دسترسی فیزیکی به ماشین ها همه اقدامات احتیاطی امنیتی دیگر را دور می زند.
جلوگیری از تقلب
اولین قدم خوب برای جلوگیری از تقلب ، راه اندازی یک سیستم برای شناسایی خودکار تقلب است.
همه ورود و خروج بازیکنان و همچنین رویدادهای مهم بازی مانند پیشرفت بازیکن را ذخیره کنید.
مقادیر کلیدی بازی مانند کل پول و تعداد آیتم های کمیاب موجود را ردیابی کنید.
اگر مرتباً این آمارها را مرور کنید ، میتوانید متوجه شوید که چه زمانی یک مشکل اساسی وجود دارد ، مانند ظاهر شدن چندین نسخه از اقلامی که قرار است منحصربهفرد باشند، یا دو برابر شدن حجم.
حمله و دفاع
واضح است که عواقب یک حفره امنیتی در یک بازی آنلاین بسیار جدی تر از یک بازی آفلاین است.
یک بازیکن مخرب ممکن است از یک حفره امنیتی برای تقلب یا به خطر انداختن یکپارچگی بازی استفاده کند.
آزاد کردن هکرها راهی مطمئن برای از دست دادن بخش بزرگی از مشتریان پولی است ، بنابراین طراحی بازی باید از همان ابتدا این مشکل را برطرف کند.
سه مکان در بازی وجود دارد که در برابر حمله آسیب پذیر هستند :
- data files
- پروتکل کلاینت/سرور
- خود کلاینت قابل اجرا
یک روش ساده برای ایمن سازی data files در client machines ، رمزگذاری آنهاست.
از آنجایی که در زمان اجرا برای رمزگشایی فایل ها مشکل عملکردی وجود دارد ، تنها فایل هایی که حاوی اطلاعات مهم هستند نیاز به رمزگذاری دارند.
احتمالاً اجازه دادن به یک پلیر برای بررسی و تغییر موسیقی، صدا و فایل های گرافیکی ضرر کمی دارد یا اصلاً ضرری ندارد، در حالی که دسترسی به سطوح یا فایل های گفتاری ممکن است مزیت قابل توجهی به فرد بدهد.
با این حال ، رمزگذاری کاملاً کافی نیست.
صرفاً تغییر نام یا کپی کردن یک data file بر روی دیگری ممکن است به کسی اجازه دهد که کلاینت را فریب دهد تا فکر کند بازیکن در مکانی غیر از جایی که سرور ، پلیر را قرار می دهد، قرار دارد.
این میتواند پیامدهایی از رفتار عجیب بازیکن در ماشینهای دیگران تا دسترسی بازیکن به مناطقی که در غیر این صورت محدود شدهاند داشته باشد.
راه حل این است که سرور تأیید کند که مشتری از data files صحیح استفاده می کند، نه فقط از نام صحیح فایل.
هنگامی که کلاینت یک فایل را بارگذاری می کند، می تواند یک checksum برای فایل ها ، انجام دهد و به سرور ارسال کند (با توجه به اینکه فایل رمزگذاری شده است، محاسبه checksum می تواند بسیار ساده و کم هزینه باشد).
اگر سرور متوجه شود که checksum با انتظاراتش مطابقت ندارد، به این نتیجه میرسد که بازیکن تقلب کرده است و یا این اطلاعات را ثبت میکند یا اقدامات اصلاحی فوری انجام میدهد.
توجه داشته باشید که برای سرور کافی نیست که به سادگی از کلاینت بخواهد با مشکل برخورد کند، زیرا یک کاربر مخرب ممکن است چنین پیامی را مسدود کند.
در واقع ، حملات احتمالی زیادی به پروتکل کلاینت/سرور وجود دارد.
برای یک هکر استفاده از پکیج sniffer که برنامه ای است که تمام داده های منتقل شده از طریق شبکه را نمایش می دهد، بسیار آسان است.
یک هکر که با یک sniffer مسلح می شود، ممکن است سعی کند پروتکل کلاینت/سرور را با توجه به تغییر پکیج ها در هنگام ارسال آنها، مهندسی معکوس کند.
رمزگذاری پروتکل به طور موثر این مشکل خاص را حل می کند ، اما موارد دیگری نیز وجود دارد.
حتی زمانی که پکیج ها رمزگذاری شدهاند، یک هکر میتواند پکیج های خروجی را ضبط کرده و آن را دوباره بفرستد..
به عنوان مثال اگر پکیج درخواستی برای شلیک لیزرهای یک سفینه فضایی باشد ، replaying پکیج ها میتواند با شلیک سریع لیزرها ، مزیت قابل توجهی به پلیر بدهد.
یک راه خوب برای خنثی کردن replaying پکیج ، این است که به هر پکیج یک شماره ترتیبی اختصاص دهید که از یک پکیج به پکیج دیگر تغییر می کند.
اگر سرور پکیجی با شماره ترتیب اشتباه دریافت کند، می داند که فرستنده در حال تقلب است.
البته ، شماره دنباله باید بیش از یک عدد صحیح باشد که با هر پیام افزایش می یابد.
این طرح برای یک هکر بسیار آسان است که بتواند آن را تکرار کند.
در عوض ، شماره دنباله می تواند ترکیبی از هر چیزی باشد که به عنوان متغیر حالت برای پروتکل عمل می کند.
برای مثال ، میتواند تعداد کل بایتهایی باشد که از زمان شروع کار کلاینت ارسال شدهاند.
کار دیگری که یک هکر ممکن است انجام دهد این است که از یک پکیج sniffer به سادگی برای جلوگیری از رسیدن پیام های خاص به کلاینت یا سرور استفاده کند.
برای استدلال اجازه دهید یک مثال بزنیم.
فرض کنید که سلامتی بازیکن در سمت کلاینت ذخیره می شود و پیام هایی که آسیب وارد می کنند از رسیدن به کلاینت مسدود می شوند.
پلیری که پیام های آسیب را مسدود می کند ، آسیب ناپذیر می شود.
با ذخیره تمام داده های مهم در سرور، می توان از مسدود کردن پیام ها جلوگیری کرد.
نکته ی حائز اهمیت در اینجا این است که توسعه دهنده باید بداند چه بخشی از بازی سمت سرور و چه بخشی از آن سمت کلاینت پیاده سازی شود.
فایل اجرایی کلاینت در دستگاه پلیر قرار دارد و بنابراین در برابر حملات آسیب پذیر است.
بدتر از آن ، کلاینت هنگام اجرا دارای اطلاعات مهمی است ، از جمله محتویات data files ، که باید هنگام بارگذاری رمزگشایی شوند.
یک متقلب ممکن است از یک دیباگر برای مشاهده حافظه در حالی که کلاینت در حال اجرا است استفاده کند، یا حتی فایل اجرایی را برای غیرفعال کردن سایر بررسیهای امنیتی تغییر دهد.
متأسفانه ، دفاع کمی در برابر چنین حملاتی وجود دارد.
هر کاربری که به اندازه کافی پیچیده باشد تا فایل اجرایی را اصلاح کند، احتمالاً قادر خواهد بود ، تهدیدی برای این موضوع باشد.
با ذخیره سازی داده ها در سرور این مشکل حل می شود ، اما یک شبکه رفت و برگشتی برای بازیابی آن لازم است، که به performance آسیب می رساند و کد را پیچیده می کند.
یکی دیگر از مشکلات امنیتی احتمالی استفاده از برنامه های خودکار به نام ربات برای شبیه سازی اقدامات کاربر است.
استفاده متداول از یک ربات این است که یک عمل را به طور مکرر انجام دهد، سریعتر از یک شخص.
برای خنثی کردن رباتها، کلاینت باید نیاز داشته باشد که زمان مشخصی بین دو اقدام متوالی کاربر بگذرد.
مثالی از تمامی موارد امنیتی
خب اجازه دهید تمامی مواردی که در بالا آموختیم را در قالب یک مثال ارائه دهیم.
بیایید اصول بالا را در یک مثال عینی از یک بازی اکشن اعمال کنیم.
تمام دادههای دائمی روی سرور ذخیره میشوند و در بیشتر موارد، کلاینت هر بار که بازیکن درخواست عملی میکند، پیامی به سرور ارسال میکند.
تنها استثنا حرکت است.
برای ارائه یک محیط واقعی بازی ، باید به محض فشردن کلید ، حرکت بازیکن را نشان دهد.
این واقعیت ، پیامدهای مهمی برای طراحی و پروتکل بازی دارد.
هکری که متوجه میشود کلاینت در حال ارسال پیامهای حرکتی است، ممکن است سعی کند پیامها را تغییر دهد تا شخصیت او سریعتر حرکت کند.
رمزگذاری پروتکل باید برای جلوگیری از این حمله کافی باشد.
با این حال ، هکر ممکن است پکیج های حرکتی خروجی را ضبط کند و بعداً آنها را دوباره ارسال کند و به همان اثر دست یابد.
افزودن یک sequence number به هر پیام باید این مشکل را متوقف کند.
برای امنیت بیشتر ، سرور می تواند تلاش کند تا حرکات بازیکن را تأیید کند.
بررسی های ساده ، مانند محاسبه فاصله بین دو حرکت متوالی، می تواند جدی ترین تقلب ها را پیدا کند.
جایگزین دیگر انجام تشخیص برخورد کامل برای تأیید اعتبار هر پیام حرکتی دریافتی است.
در بسیاری از موارد ، تشخیص برخورد برای انجام روی سرور از لحاظ بهینه سازی بسیار هزینه بر است، اما در برخی از بازیها این امکان وجود دارد.
در مواردی که هزینه بر است ، سرور می تواند تنها نمونه ای از حرکات را که به طور تصادفی انتخاب شده است تأیید کند.
نمونه هایی از مشکلات امنیتی در بازی ها
۱- در Defcon 2019 ، بازیکنی به نام Manfred نشان داد که تقلب در محبوب ترین بازی های چند نفره چقدر آسان است.
او برای دور زدن هر روش رمزگذاری و مبهم سازی ، از تزریق کد به لایه های مختلف استفاده کرد که به او امکان خواندن و نوشتن کد برای کلاینت بازی ها را می داد.
۲- در بازی محبوب Ultima Online ، هر بازیکنی میتواند خانه خود را حذف کند ، اما ظاهراً شناسه خانه در request packet ارسال میشد و هیچ اعتبار سروری وجود نداشت که شناسه خانه ، متعلق به بازیکن درخواستکننده باشد. تنها کاری که هکرها باید انجام می دادند این بود که شناسه خانه را قبل از ارسال به سرور تغییر می دادند و اکنون می توانید خانه های بازیکنان دیگر را حذف کنید.
۳- در GTA 5 Online یک بازیکن میتواند با تغییر حافظه کلاینت ، مقدار بینهایت مهمات داشته باشد.
به سادگی آدرس حافظه ای را که مقدار مهمات را حفظ می کند، پیدا کنید، این کار را می توان به راحتی با نرم افزاری مانند «Cheat Engine» انجام داد، سپس مقدار مهمات فعلی خود را جستجو کنید (مثلاً 240) و یک گلوله شلیک کنید.
سپس در آدرس های یافت شده مقدار جدید (239) را جستجو کنید.
آدرسهای باقیمانده آنهایی هستند که مقدار مهمات را در خود جای دادهاند، بنابراین اکنون تنها کاری که متقلبان باید انجام میدادند این است که این مقادیر آدرس را ویرایش کنند.
نکات نهایی در رابطه با حفظ امنیت سرور و کلاینت
به روز کردن سرور
هرگز سرور را با result به روز نکنید ، بلکه با اقداماتی که منجر به آن شده است به روز کنید ، حتی اگر به معنای پردازش اضافی باشد.
به عنوان مثال ، بهجای بهروزرسانی سروری که بازیکن X آیتمها را به دست آورده است، دقیقاً همان کاری را که پلیر انجام داده است را بهروزرسانی کنید.
این به سرور اجازه می دهد بررسی های لازم را انجام دهد و نتیجه گیری های لازم را بکند.
ارسال پارامترها
از ارسال پارامترها از کلاینت به سرور، حتی به قیمت پردازش بیشتر، خودداری کنید.
به جای به روز رسانی سرور که بازیکن گلوله ای از نوع X را شلیک کرده است، به سرور اجازه دهید نوع سلاح را دوباره استخراج کند.
اعتبار سنجی
هر چیزی را که از کلاینت می آید اعتبار سنجی کنید و هرگونه بررسی انجام شده در سمت کلاینت را نادیده بگیرید.
به عنوان مثال در یک بازی شوتر ، قبل از شلیک گلوله ، اعتبار سنجی هایی که می تواند انجام شود به شرح زیر می باشد :
- آیا بازیکن یک سلاح در دست دارد ؟
- آیا سلاح آن گلوله ای دارد ؟
- آیا آنها حتی زنده هستند؟
- آیا پارامترهای دریافتی معتبر و در محدوده مقدار مورد انتظار هستند؟
کند کردن سرعت هکر
برای جلوگیری از فراخوانی عملکرد سرور در فاصله زمانی کمتر از آنچه باید، حداقل تأخیر را بین تماس های سرویس client-server اعمال کنید.
این کار باعث می شود که یک متقلب نتواند کل پروسه ی هک خود را در زمان مناسب و تا قبل از فهمیدن شما انجام دهد.
Environmental checks
انجام برخی از اعتبارسنجی ها به آسانی انجام نخواهد شد.
به عنوان مثال ، اگر بازیکن سعی کند با یک شی در جهان تعامل داشته باشد، می توانید فاصله بازیکن تا شی را بررسی کنید، اما اگر شی مسدود شده باشد و بازیکن نتواند با آن تعامل برقرار کند، چه؟
این نوع بررسی ها را می توان با استفاده از اعتبار سنجی های لازم در محیط موتور بازی سازی (به عنوان مثال، line traces ، بررسی collision) انجام داد ؛ که البته در برخی موارد ، ممکن است بر بار سرور تأثیر بگذارد.
جمع بندی
به عنوان جمع بندی قصد ارائه ی این نکته را داریم که سرور هنگام تشخیص مشکل امنیتی چه کاری باید انجام دهد ؟
یک پاسخ این است که فوراً حساب مجرم را قطع یا احتمالاً معلق کنید.
تعلیق ممکن است خیلی شدید باشد ؛ حتی یک تعلیق حساب اشتباه یک مشکل جدی در روابط کلاینت است.
یک واقعیت زندگی در تجارت امنیتی این است که هیچ دفاعی بیخطر نیست.
با توجه به زمان و پول کافی ، یک مهاجم همیشه می تواند هر طرح امنیتی را شکست دهد.
یک هکر می تواند کل کلاینت شما را از هم جدا کرده و بازنویسی کند.
وظیفه شما این است که تقلب را بسیار گران کنید ، به طوری که مهاجمان بالقوه تمایل کمی برای امتحان کردن داشته باشند.
مهرشاد شادان مهر
مدرس سئو ، طراح سایت ، انیماتور ، سناریو نویس بازی
کسی که به شما کمک می کند لزوما دوست نیست و کسی که شما را تنبیه می کند لزوما دشمن نیست.