امروزآذر ۱۹, ۱۴۰۲

کدهای ناشناس به تاریخ پیوستند؛ هر برنامه نویس یک اثر انگشت قابل ردیابی دارد!

محققان حوزه استیلومتری – تحلیل آماری سبک زبانی – نوشتن را یک فرایند اختصاصی و منحصربه‌فرد می‌دادند. کلماتی که انتخاب می‌کنید، روش ترکیب آنها و تصمیمات دستورزبانی شما همگی حکم امضای شما پای نوشته‌هایتان را دارند. حتی ابزارهای خودکاری هم طراحی شده که در صورت داشتن داده‌های کافی می‌توانند نویسنده یک پست در انجمن‌های آنلاین را شناسایی کنند. اما تحقیقات جدیدتر نشان داده استیلومتری در حوزه زبان‌های مصنوعی – مثل کدهای کامپیوتری و حتی کدهای ناشناس – هم قابل استفاده است. این یعنی هر طراح نرم‌افزار یک اثر انگشت منحصربه‌فرد دارد که برای همیشه روی کارهایش می‌ماند!

راشل گرینستاد، دانشیار علوم کامپیوتر دانشگاه درکسل و آیلین کالیسکون، استادیار دانشگاه جرج واشنگتن در تحقیق جدیدشان نشان داده‌اند که کدها هم مثل سایر زبان‌های سبک‌شناسی شده کاملا ناشناس نیستند و امکان ردیابی آنها وجود دارد. این دو محقق با استفاده از تکنیک یادگیری ماشین موفق به شناسایی نویسنده چند نمونه از کدهای ناشناس شده‌اند. یافته‌های این تحقیق می‌تواند در حوزه‌های مختلف از جمله پرونده‌های مربوط به سرقت کد کارایی داشته باشد اما بحث نقض حریم خصوصی هم درباره این روش مطرح است؛ به‌ویژه برای هزاران برنامه‌نویس ناشناسی که کدهای متن‌باز را در سرتاسر جهان منتشر می‌کنند.

چگونه نویسنده کدهای ناشناس را شناسایی کنیم؟

در ادامه روش محققان برای شناسایی نویسنده کدهای ناشناس با استفاده از یادگیری ماشین را توضیح می‌دهیم. ابتدا الگوریتم طراحی شده تمام مشخصات یک بخش از نمونه کدها را شناسایی می‌کند. این مشخصات بسیار متنوع و متفاوت هستند. تمام جنبه‌های موجود در یک زبان را در نظر بگیرید؛ این جنبه‌ها شامل انتخاب لغات، روش ترکیب آنها، طول جملات و بسیاری موارد دیگر هستند. محققان برای تسهیل و افزایش دقت این روش، مشخصات را به مواردی محدود کردند که کدنویس‌ها را از یکدیگر متمایز می‌کنند. به این ترتیب لیست چند صدهزارتایی به ۵۰ مورد تقلیل یافت.

محققان برای شناسایی نویسنده کدها از مشخصات کم‌اهمیت – مثل نحوه فرمت‌ شدن کدها – استفاده نکردند. در عوض چند معیار انتزاعی براساس ترکیب و نحو کدها طراحی کردند که ساختارهای اصلی کدها را مشخص می‌کرد. این روش مثل این می‌ماند که به جای روی هر خط در یک بند تمرکز کنیم، دنبال مشخص کردن ساختار جمله‌بندی‌های نویسنده باشیم.
این الگوریتم برای شناسایی کدهای یک نویسنده باید از قبل نمونه کدهایش را دیده باشد. اگر یک حساب GitHub تصادفی بخشی از یک کد را منتشر کند، الگوریتم گرینستاد و کالیسون نمی‌تواند نویسنده آن را شناسایی کند چون فقط به یک نمونه از کدهای این نویسنده ناشناس دسترسی داشته است. البته برای شناسایی نویسنده یک کد ناشناس هم داده‌های زیادی مورد نیاز نیست و چند نمونه کد کوتاه و مختصر کفایت می‌کند.

مثلا گرینستاد و کالیسون در یک مقاله دیگر نشان داده‌اند که حتی بخش‌های کوتاهی از کدهای منتشر شده روی سایت‌‌هایی مثل GitHub برای متمایز کردن کدهای ناشناس چند نویسنده از یکدیگر کافی است (با دقت بسیار بالا).

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

کالیسون و همکارانش می‌توانند کدهای کامپایل‌شده را دوباره به زبان برنامه‌نویسی C++ برگردانند و در عین حال ویژگی‌های اختصاصی سبک برنامه‌نویس را هم حفظ کنند. تصور کنید یک مقاله می‌نویسید و با Google Translate آن را به یک زبان دیگر ترجمه می‌کنید. اگرچه متن مقاله دیگر آن متن اولیه نیست اما ویژگی‌های نوشتاری شما – مثلا روش خاص ترکیب کلمات – همچنان در متن نهفته است. همین وضعیت درباره کدهای کامپایل‌شده هم وجود دارد.

کالیسون و همکارانش برای این آزمایش از نمونه کدهای رقابت سالانه Code Jam گوگل استفاده کردند. یادگیری ماشین در ۹۶ درصد موارد موفق به شناسایی دقیق یک گروه ۱۰۰ نفره از برنامه‌نویس‌ها شد و برای اینکار فقط به ۸ نمونه کد از هر برنامه‌نویس دسترسی داشت. حتی وقتی سایز نمونه به ۸۰۰ برنامه‌نویس گسترش یافت هم الگوریتم با دقت ۸۳ درصدی نویسنده کدهای ناشناس را تشخیص می‌داد.

هر برنامه‌نویس سبک به خصوصی در کدنویسی دارد که حکم اثر انگشت او را دارد

هر برنامه‌نویس سبک به خصوصی در کدنویسی دارد که حکم اثر انگشت او را دارد

شناسایی برنامه‌نویس‌های ناشناس چه پیامدهایی دارد؟

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

پیامدهای استفاده از چنین الگوریتمی همیشه مثبت نیست؛ مثلا مقامات دولتی می‌توانند از ابزارهای شناسایی کدهای ناشناس برای پیدا کردن طراح ابزارهای ضدسانسور استفاده کنند! چنین الگوریتمی پیامدهایی هم برای امنیت و حریم خصوصی برنامه‌نویس‌های ناشناسی دارد که نرم‌افزارهای متن باز طراحی می‌کنند؛ به خصوص اگر مرتبا از یک حساب GitHub استفاده کنند.

همانطور که گرینستاد اشاره می‌کند امکان پنهان کردن ۱۰۰درصدی هویت در چنین فعالیت‌هایی وجود ندارد. مثلا گرینستاد و کالیسکون به این نتیجه رسیدند که برخی از روش‌ها و ابزارهای ابهام‌زایی – که برنامه‌نویس از آنها برای پیچیده‌تر کردن و ایمن کردن کدها استفاده می‌کند – به مخفی کردن سبک اختصاصی برنامه‌نویس کمک نمی‌کنند. البته محققان امیدوارند برنامه‌نویس‌ها بتوانند در آینده و با استفاده از روش‌های پیچیده‌تر، هویت خودشان را کاملا پنهان کنند.

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

کدنویسی هر روز خطرناک‌تر می‌شود

تحقیق درباره شناسایی کدهای ناشناس، گرینستاد و کالیسکون را به نتایج جالبی درباره ماهیت برنامه‌نویسی رسانده است. مثلا این دو محقق متوجه شدند شناسایی برنامه‌نویس‌های باتجربه ساده‌تر است! به نظر می‌رسد هرچه برنامه‌نویس ماهرتر باشد، سبک کدنویسی او هم اختصاصی‌تر می‌شود. به نظر می‌رسد علت این تناقض جالب، تمایل برنامه‌نویس‌های تازه‌کار به کپی کردن کدهای آماده از وب‌سایت‌هایی مثل Stack Overflow باشد.

به همین ترتیب کدهایی که برای پاسخ دادن به مشکلات پیچیده‌تری نوشته شده باشند، راحت‌تر شناسایی می‌شوند. وقتی محققان نمونه کدهای ۶۲ برنامه‌نویس برای یک حل هفت مشکل ساده را به الگوریتم دادند، دقت شناسایی نویسنده ۹۰ درصد بود. اما وقتی کدهای همین نویسنده‌ها برای حل هفت مشکل دشوار بررسی شد، دقت تشخیص الگوریتم به ۹۵ درصد افزایش یافت!

گرینستاد و کالیسکون قصد دارند درباره نحوه تاثیرگذاری عواملی مثل همکاری با یک مجموعه روی سبک کدنویسی افراد تحقیق کنند. یکی دیگر از اهداف این دو محقق پیدا کردن تفاوت‌های ناشی از ملیت کدنویس‌ها روی سبک کدنویسی آنهاست. گرینستاد و کالیسکون در یک یک تحقیق اولیه موفق شدند با دقت ۹۰ درصدی کدنویس‌های کانادایی را از کدنویس‌های چینی تشخیص بدهند!

منبع

دیدگاهتان را بنویسید