بررسی آماری داده‌های افشا شده از کاربران ایرانی تلگرام

روز ۳۰ام مارس سال ۲۰۲۰ گزارشی در مورد افشای اطلاعات ۴۲ میلیون رکورد از یکی از سامانه‌های حفاظت نشده ایرانی منتشر شد. از همان ساعت‌های ابتدایی انتشار این خبر نظرات مختلفی در مورد مبدا نشت این اطلاعات و خطراتی که متوجه کاربران ایرانی تلگرام خواهد بود ارائه شد. اما عدم امکان دسترسی به این اطلاعات کار بررسی بیشتر برای کارشناسان امنیتی را در این زمینه دشوار کرده بود. البته در همین زمان بعضی کارشناسان امنیتی با دسترسی به این داده‌ها امکان بررسی افشا شدن را به کاربران دادند اما تحلیل بیشتری تا امروز روی این داده‌ها منتشر نشده است.


با بررسی این داده‌ها سعی کردیم به چندین سوال در مورد این داده‌ها و البته بررسی برخی شاخص‌های آماری در مورد کاربران ایرانی بپردازیم که در این گزارش آن‌ها را شرح می‌دهیم.

حجم داده‌های افشا شده چقدر است؟

کل داده‌هایی که در دسترسی ما قرار داشت شامل 42,823,956 رکورد می‌شود که با ادعای گزارش‌های اولیه مطابقت می‌کرد. این تعداد رکورد شامل 35,859,697 شماره تلفن مختلف هستند که نشان دهنده تکرار شدن برخی شماره تلفن‌ها در این لیست است.

بررسی ما روی رکوردهای تکراری نشان می‌دهد تفاوت میان این رکوردها در مقدار access_hash (در مورد این مشخصه در ادامه کامل توضیح داده شده است) آن‌هاست. این به این معنی است که این داده‌ها توسط سیم‌کارت‌های مختلفی جمع‌آوری شده‌اند. در داده‌های نشت شده در بدترین حالت یک شماره تلفن 2585 تکرار شده است و این به این معنی است که در فرآیند جمع‌آوری این داده‌ها از اقلا 2585 کاربر مختلف (سیم کارت استفاده شده برای ساخت حساب تلگرام برای خزش) استفاده شده است.

یکی دیگر از نکاتی که در مورد شماره‌های تکراری وجود دارد تغییر زمان last seen و تصویر نمایه این شماره‌ها در دیتاست است. دیدن این رفتار در داده‌ها به نظر من ناشی از آپدیت دوره‌ای داده‌ها در طول زمان است.

این داده‌ها مربوط به چه زمانی هستند؟

در نمونه داده‌هایی که در اختیار ما قرار گرفته بود تنها مشخصه‌ای که مربوط به زمان می‌شد status.was_online و status.expires بود که به نظر ما آخرین زمان آنلاین بودن کاربر را نشان می‌داد. با این فرض و اینکه مقدار عددی این مشخصه احتمالا نشان دهنده زمان در قالب *UNIX epoch خواهد بود، مقدار حداکثر این فیلد را به دست آوردیم:

MAX(status.was_online) = 1568761603 -> 2019-09-17T23:06:43+00:00
MAX(status.expires) = 1568762833 -> 2019-09-17T23:27:13+00:00

این مقدار معادل با سه شنبه ۱۷ سپتامبر ۲۰۱۹ میلادی است. به نظر می‌رسد داده‌های افشا شده در جدیدترین حالت مربوط به این حوالی است. البته ما احتمال می‌دهیم این داده‌ها به صورت دوره‌ای به روز رسانی می‌شدند پس لزوما همه این اطلاعات افشا شده مربوط به این زمان نیستند. پر واضح است که این مقدار فقط برای کاربرانی که مقدار last seen آن‌ها به صورت عمومی قابل مشاهده است مکشوف است و در رکوردهای زیادی این مقدار خالی است.

با مقایسه این تاریخ‌ها با زمان از کار افتادن پوسته‌های معروف تلگرام مثل تلگرام طلایی (۱ تیر ۹۸) می‌توان نتیجه گرفت این اطلاعات از منبع دیگری جمع‌آوری شده‌اند.

کاربران ایرانی تلگرام چقدر و چطور آنلاین هستند؟

داده‌های مربوط به آخرین زمان آنلاین کاربران از نظر آماری جذابیت بیشتری برای ما داشت و به همین خاطر سعی کردیم دنبال جزئیات بیشتری در مورد این مشخصه باشیم. اولین مورد مربوط به مقادیر last seen کاربران می‌شد. در شکل زیر نمودار فراوانی مقادیر این مشخصه را مشاهده می‌کنید.


userStatusOffline -> 28,511,135
userStatusOnline -> 386,802
userStatusRecently -> 9,590,035
userStatusLastWeek -> 862,257
userStatusLastMonth -> 1,171,393

با بررسی این مقادیر مشخص می‌شود تعداد کاربران فعال ایرانی که در کمتر از یک ماه اخیر به تلگرام سر زده‌اند در این مجموعه داده 39,350,229 مورد است.

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

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


آیا اسامی استفاده شده در این داده‌ها صحیح هستند؟

یکی از موارد مشکوکی که از ابتدا در مورد این داده‌ها بیان می‌شد، عدم مطابقت اسامی رکوردها با usernameهای متناظرشان بود. این امر فرضیه ساختگی بودن این اسامی را تقویت می‌کرد. علاوه بر این با مرور روی این داده‌ها اسامی پرکاربرد ایرانی مانند «امیر»، «علی»، «محمد» و ... که ریشه عربی دارند اصلا در داده‌ها مشاهد نمی‌شد. به این ترتیب فرض ساختگی بودن نام و نام خانوادگی استفاده شده در داده‌ها تقویت شد و ما تصمیم گرفتیم شواهد بیشتری در تایید این فرض پیدا کنیم.

قدم اول در بررسی اسامی، پیدا کردن فراوانی هر نام در داده‌های فاش شده بود. در جدول زیر فراوانی ۲۰ نام پر استفاده در این داده‌ها را مشاهده می‌کنید:

https://gist.github.com/alireza-ebrahimi/00ae7a294844f6a71b3a5daeb4d63e94

به استثنای ۵ نام اول لیست که در حدود ۱۲۰هزار بار تکرار شده‌اند، بقیه اسامی (داده‌های مربوط به ۱۰۰۰ نام پرتکرار بررسی شده است) در حدود ۶۰ هزار بار تکرار شده اند. الگویی که در صورت واقعی بودن نام‌ها اصلا مورد انتظار نبود. این الگو شبیه رفتار برنامه‌هایی است که با توزیع یکنواخت از یک لیست نام انتخاب می‌کنند. اما در این میان ۵ نام پراستفاده نشانه‌ای بر رد این فرضیه بود. از طرفی دو برابر بودن فراوانی این نام‌ها این شک را در ما ایجاد کرد که احتمالا در لیست اسامی اولیه این نام‌ها ۲ بار تکرار شده‌اند. با این فرضیات سعی کردیم این لیست اسامی را در اینترنت پیدا کنیم. با جستجوی عبارت «لیست اسامی ایرانی» در گوگل و بررسی نتایج پیدا شده به این لیست در سایت عصرایران برخوردم. نکته جالب در مورد این اسامی این است که این لیست دقیقا مطابق لیست اسامی استفاده شده در دیتاست افشا شده است و البته ۵ نامی که در داده‌ها تقریبا ۲ برابر دیگر اسامی استفاده شده‌اند در این لیست ۲ بار تکرار شده‌اند. با توجه به شواهد و قرائن ما مطمئنیم که اسامی استفاده شده در داده‌ها به صورت تصادفی از لیست اسامی مذکور ساخته شده‌اند.

بررسی آماری نام‌های خانوادگی این دیتاست خیلی زودتر به نتیجه رسید. در جدول زیر ۲۰ نام‌خانوادگی پراستفاده در این داده‌ها را مشاهده می‌کنید:

https://gist.github.com/alireza-ebrahimi/68ff06f3fa1f757a38218d9d7bf04947


مجددا همان ۵ نام که البته به همراه پسوند «ی» استفاده شده‌اند. بررسی بیشتر نشان‌داد تمامی نام‌خانوادگی‌هایی که در این داده‌ها استفاده شده‌اند معادل لیست نام‌های استفاده شده به همراه پسوند «ی» هستند. بنابراین علاوه بر نام‌ها، نام‌های خانوادگی نیز به صورت تصادفی از یک لیست از پیش تعیین شده انتخاب شده‌اند و در کل نام و نام خانوادگی که در رکوردها استفاده شده است معتبر نیستند. دلیل استفاده از نام‌های ساختگی در این داده‌ها از نظر من استفاده از این نام‌ها برای ایجاد contactهای ساختگی برای گول زدن تلگرام بوده است. به همین دلیل سعی شده از نام‌هایی با ظاهر معتبر استفاده شود.

آیا اطلاعات خصوصی کاربران مثل چت‌ها و کانال‌ها افشا شده است؟

در داده‌هایی که به دست ما رسیده است تنها اطلاعات مربوط به contactهای کاربران موجود است. این اطلاعات شامل فیلدهای زیر است:

  • نام کاربری: برای آن دسته از کاربرانی که نام کاربری (همان نامی که با @ شروع می‌شود) برای خود انتخاب کرده‌اند، این مقادیر افشا شده است.
  • کد کاربری: یک کد داخلی است که برای مشخص شدن هر کاربر در تلگرام استفاده می‌شود، این کد برخلاف نام کاربری که به انتخاب کاربر مشخص می‌شود، از زمان تشکیل حساب مشخص می‌شود و قابل عوض کردن نیست مگر با پاک کردن اکانت تلگرام.
  • اطلاعات آخرین بازدید: همانطور که پیشتر هم اشاره کردیم، اطلاعات مربوط به آخرین بازدید کاربران نشت شده است.
  • تصاویر نمایه: اصل تصاویر نمایه کاربران در این داده‌ها نشت پیدا نکرده است اما اطلاعاتی که با استفاده از آن‌ها می‌توان با درخواست به API تلگرام به این فایل‌ها دست پیدا کرد در این داده‌ها موجود است. این تصاویر شامل ۲ تصویر است که یکی مربوط به اندازه کوچک تصویر نمایه است و دیگری همان تصویر با رزولوشن بالاتر است.
  • چکیده دسترسی: یکی از مقادیری که در نمونه داده‌های نشت شده مورد توجه قرار گرفت مشخصه access_hash بود. با بررسی مستندات مربوط به telegram API می‌توان متوجه شد هر کاربر برای ارتباط با موجودیت‌های تلگرام (گروه، کانال، کاربر، و ...) علاوه بر کدکاربری به یک چکیده دسترسی هم نیاز دارد. نکته در مورد این چکیده این است که مقدار چکیده برای هر دو جفت کاربر متفاوت است. یعنی یک مهاجم با استفاده از access_hashهای نشت شده در این دیتاست به بقیه اطلاعات کاربر دست پیدا کند. این چکیده برای تعامل با کاربر مورد استفاده قرار می‌گیرد. به عنوان مثال شما به تنهایی با داشتن کدکاربری نمی‌توانید برای یک کاربر پیام بفرستید و نیاز به access_hash برای این کار دارید. اما در صورتی که نام کاربری یک کاربر در دسترس باشد، به راحتی هر کاربر می‌تواند به access_hash آن کاربر دسترسی پیدا کند و با او تعامل کند. در ادامه در مورد این مشخصه در telegram API بیشتر توضیح می‌دهیم.
  • شماره تلفن: مهم‌ترین بخش از رکوردهای نشت شده مربوط به شماره تلفن همراه هر کاربر است. با استفاده از این مشخصه و موارد بالا، در صورتی که یک مهاجم به این داده‌ها دسترسی پیدا کند می‌تواند از طریق چت کردن با یک کاربر (که اطلاعاتش نشت شده) به شماره تلفن او دسترسی پیدا کند. در واقع در صورتی که یک مهاجم بتواند صفحه پروفایل یک کاربر ببیند (از طریق نام کاربری، عضویت در گروه مشترک و ...) می‌تواند به کدکاربری او دسترسی پیدا کند و نهایتا به شماره تلفن او برسد.

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

در این بخش قصد داریم تا بیشتر در مورد مفهوم access_hash در telegram API توضیح دهیم. همانطور که پیشتر توضیح دادیم برای بسیاری از API callها در تلگرام علاوه بر userid به یک access_hash نیز نیاز است. این مقادیر در نوع داده‌ای InputPeerUser جا می‌گیرند که در توابع زیادی مورد استفاده هستند. معرفی چنین مشخصه‌ای برای جلوگیری از امکان brute force روی useridهای تلگرام برای بدست آوردن اطلاعات پروفایل آن‌هاست است. در برخی از توابع که نیاز به دانستن access_hash نیست، نوع داده‌ای PeerUser مورد استفاده قرار می‌گیرد که صرفا شامل userid است. داشتن Peer برای شناسایی یک کاربر کفایت می‌کند اما برای ایجاد درخواست با آن‌ها کافی نیست. برای اینکار نیاز به access_hash داریم تا به InputPeerUser برسیم. به صورت کلی مشخصه access_hash از طریق ایجاد کنش با کاربر قابل دسترسی است. این کنش‌ها شامل داشتن شماره تلفن کاربر، وجود کاربر در دیالوگ‌های تلگرام، فوروارد پیام از کاربر یا دیدن لیست کاربران گروه است**.

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

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

برای مقایسه این آمار با داده‌های واقعی به گزارش رگولاتوری که در دی‌ماه ۹۸ منتشر شده است استناد کردیم. بر اساس این گزارش تعداد مشترکین همراه اول، ایرانسل، و رایتل به ترتیب حدودا ۶۲ میلیون، ۵۰ میلیون و ۴ میلیون گزارش شده است که به ترتیب معادل ۵۳ درصد، ۴۳ درصد، و ۳ درصد کل شماره‌های همراه کشور هستند. شباهت این آمار با داده‌های نشت پیدا کرده سند دیگری بر کامل بودن این داده‌ها و همچنین درست بودن شماره تلفن‌های این مجموعه داده است.

علاوه بر این در جدول زیر لیست تعداد رکوردهای هر پیش‌شماره ارائه شده است که می‌تواند برای محققین این حوزه جالب توجه باشد***.

https://gist.github.com/alireza-ebrahimi/d43897089460b3ab811c083189adf021


کلام آخر

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

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

علاوه بر این، این داده‌ها نشان‌دهنده شدت استفاده از تلگرام به عنوان یک پیام‌رسان فیلتر شده در میان کاربران ایرانی است. بنظر من این شواهد می‌تواند نشان‌دهنده شکست رویکرد فیلترینگ تلگرام در ایران باشد. رویکردی که باعث شده ده‌ها میلیون ایرانی به صورت مستمر از ابزارهای دور زدن فیلترینگ استفاده کنند که در تضاد با هدف اولیه فیلترینگ از نظر دست‌اندرکاران فیترینگ، یعنی حفاظت از افراد در برابر محتوای نامناسب است.


* نشان‌دهنده تعداد ثانیه‌هایی است که از مبدا زمان در سیستم‌عامل لینوکس یعنی نیمه شب اول ژانویه 1970 گذشته است، این قالب برای کد کردن زمان در سامانه‌های رایانه‌ای بسیار رایج است.

** برای کسب اطلاعات بیشتر در مورد این خصیصه به مستندات telethon در این مورد مراجعه کنید

*** برای مشخص کردن پیش‌شماره‌های هر اپراتور از این مقاله ویکیپدیا کمک گرفتیم