گزارش ۰۱ — Google Messages

پیش‌نمایش لینک،
راهی برای افشای IP.

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

نویسنده: عباس حسینی·پژوهش مستقل امنیتی·سازنده: Google

Google Messages همان برنامه‌ای است که روی بیشتر گوشی‌های Android برای پیامک و گفتگوهای RCS استفاده می‌شود؛ برنامه‌ای که خیلی‌ها بدون توجه به نامش می‌شناسند. پیش‌نمایش لینک یک قابلیت ساده و کاربردی است: به جای فقط آدرس، عنوان صفحه، توضیح کوتاه و تصویر کوچکی در چت نمایش داده می‌شود. اما از نظر حریم خصوصی، سؤال مهم این است: چه کسی صفحه را دریافت می‌کند؟ اگر یک سرور واسط آن را دریافت کند، صاحب لینک همان سرور را می‌بیند. اگر گوشی شما مستقیم دریافتش کند، اطلاعات شما دیده می‌شود: شبکه، دستگاه و زمان درخواست.

مجموعه‌ای از گوشی‌های قفل‌شده مشابه؛ روی بعضی از آن‌ها لینکی از یک مخاطب ذخیره‌شده دیده می‌شود
تصویر ۱ — یک برنامه مشترک روی تعداد زیادی گوشی

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

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

خط‌های نقطه‌چین قرمز از چندین گوشی به یک سرور وصل می‌شوند
تصویر ۲ — درخواست‌های بی‌صدا، از گوشی‌های مختلف

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

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

لاگ سرور با درخواست‌های تکراری: IP یکسان گیرنده، User-Agent مربوط به GoogleMessages و زمان‌هایی با فاصله چند دقیقه
تصویر ۳ — چیزی که در سرور ثبت می‌شود

در سرور میزبان لینک، درخواست‌ها پشت سر هم ثبت می‌شوند: IP گیرنده، User-Agent و زمان درخواست‌ها با فاصله چند دقیقه. گیرنده برای ثبت این اطلاعات رضایتی نداده است.

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

نقشه‌ای با چند ناحیه قرمز مبهم و بدون نقطه دقیق، در ارتباط با یک گوشی قفل‌شده
تصویر ۴ — رد تقریبی شبکه و موقعیت در گذر زمان

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

این موضوع در مارس ۲۰۲۶ به Google گزارش شد. طبق زمان‌بندی پایین صفحه، Google پس از بررسی اولیه، گزارش را در 2026-03-17 بست. در بررسی دوباره در ۲۹ اکتبر ۲۰۲۶، این رفتار همچنان در نسخه نصب‌شده روی دستگاه آزمایش وجود داشت. این صفحه روشن می‌کند که کد و آزمایش روی یک دستگاه چه چیزی را تأیید می‌کنند و چه چیزی را تأیید نمی‌کنند.

گزارش فنی

Google Messages — یافته‌ها و بررسی فنی

خلاصه و شدت آسیب‌پذیری

Google Messages با شناسه com.google.android.apps.messaging روی Samsung Galaxy A26 (SM-A266B)، با Android 16 و بیلد BP4A.251205.006 بررسی شد. بسته نصب‌شده messages.android_20260910_03_RC02.phone_samsung_dynamic با کد نسخه 323089900 بود. پیام‌ها از طریق RCS ارسال می‌شدند. بررسی شامل تحلیل ایستای همان APK نصب‌شده، با SHA-256 فایل پایه 9e869a68…ff60b2، و رفتار مشاهده‌شده روی همین یک دستگاه است. امضای بسته نیز به‌عنوان نسخه معتبر Google تأیید شد.

شناسهیافتهCWECVSS 3.1شدت
F-PREVIEWافشای IP و فراداده از طریق پیش‌نمایش لینک روی دستگاه200/3594.3متوسط
F-UAدرخواست پیش‌نمایش با User-Agent جعلی که از راه دور تنظیم می‌شود؛ بررسی‌شده در F-PREVIEW451—اطلاعات تکمیلی
F-PREVIEW · CWE-200 / CWE-359

افشای IP و فراداده از طریق پیش‌نمایش لینک روی دستگاه

متوسط · CVSS 4.3

شرح

هنگام پردازش پیام دارای URL، Google Messages برای ساخت پیش‌نمایش یک درخواست HTTP(S) از نوع GET را از خود دستگاه به آن آدرس می‌فرستد، نه از پروکسی سمت سرور. بنابراین سرور لینک، IP خروجی فعلی شبکه گیرنده، User-Agent پیش‌نمایش، Accept-Language و زمان درخواست را دریافت می‌کند. درخواست‌های بعدی برای og:image یا آیکون سایت ممکن است User-Agent از نوع Dalvik هم داشته باشند که نسخه Android، مدل دستگاه و شماره بیلد را آشکار می‌کند.

چه چیزی دریافت لینک را فعال می‌کند

این بخش باید دقیق توضیح داده شود، چون در تعیین شدت آسیب‌پذیری نقش دارد. فرایند دو مرحله دارد:

  1. پس از دریافت پیام و ثبت نهایی آن در پایگاه داده، کار request_link_preview زمان‌بندی می‌شود (dfvl/bcnl → btlr.b()). برای لینک جدید، مرحله اول می‌تواند فقط یک رکورد پیش‌نمایش با وضعیت deferred بسازد و پیش از هر درخواست شبکه برگردد (btln).
  2. وقتی گفتگو تعاملی می‌شود، یعنی چت باز می‌شود، onMessageListInteractive یک ناظر را شروع می‌کند (ahxw → aied). این ناظر رکوردهای deferred همان گفتگو را دنبال می‌کند و کار دومی با deferred=true زمان‌بندی می‌کند (aieb → btlr.a()). این کار پس از عبور از شرایط زیر می‌تواند لینک را دریافت کند.

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

شرایط لازم پیش از دریافت لینک

  • تنظیم پیش‌نمایش. پیش‌نمایش خودکار باید فعال باشد (aqck). Google Messages گزینه‌های نمایش همه پیش‌نمایش‌ها، نمایش فقط پیش‌نمایش لینک‌های وب و غیرفعال کردن را ارائه می‌کند.
  • اعتماد به فرستنده. فرستنده باید شرط اعتماد btez.m() را برآورده کند. وجود مقدار در lookup_key مخاطب یکی از حالت‌های پذیرفته‌شده است؛ دو وضعیت دیگر برای شرکت‌کننده نیز پذیرفته می‌شوند. مسیر جداگانه‌ای بر اساس یک فلگ می‌تواند تعداد بارگذاری‌های دستی پیش‌نمایش را بشمارد؛ آستانه پیش‌فرض APK برابر 3 است و برای هر شرکت‌کننده ذخیره می‌شود. مقدار پیش‌فرض enable_link_preview_untrusted_senders در APK برابر false است. باز کردن چت یا خوانده‌شده علامت زدن پیام با بارگذاری دستی پیش‌نمایش یکی نیست. مقادیر زنده تنظیمات از راه دور خوانده نشده‌اند.
  • نوع آدرس. پردازشگر فقط http و https را می‌پذیرد و ws: و wss: را بازنویسی می‌کند. آدرس‌های file:// و content:// رد می‌شوند. مسیر دریافت تصویر نیز از همین کلاینت محدود به HTTP عبور می‌کند.

پیامدهایی که شواهد تأیید می‌کنند

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

فرستنده «مورد اعتماد» یعنی چه کسی؟

مخاطب ذخیره‌شده فقط دوستان و افرادی نیست که با آن‌ها چت می‌کنید. ممکن است شماره فروشگاه، پیک یا بانکی باشد که زمانی ذخیره کرده‌اید. اینکه فرستندگان تجاری تأییدشده هم از این شرط عبور می‌کنند یا نه، آزمایش نشده است. منظور سرویس‌های انبوه SMS/RCS شرکت‌هاست که با نام تجاری و بدون هشدار فرستنده ناشناس پیام می‌فرستند. این موضوع به‌عنوان سؤال برای Google باقی می‌ماند. در هر صورت، فرستندگانی که می‌توانند دریافت خودکار را فعال کنند، فقط دوستان شما نیستند.

جزئیات امتیاز CVSS 3.1

AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N امتیاز پایه: 4.3، متوسط

اثر این مورد، افشای IP، User-Agent و اطلاعات دستگاه است که در دسته C:Low قرار می‌گیرد. بنابراین حتی اگر هر درخواست تعامل کمی بخواهد، شدت در حد متوسط باقی می‌ماند. مقدار UI:R با کد سازگار است، چون زنجیره دریافت به باز شدن گفتگو وابسته است. توصیف قبلی «بحرانی / بدون کلیک» قابل دفاع نیست: هم به مسیر UI:N در گفتگوی هرگز بازنشده تکیه داشت که در کد اثبات نشده، و هم به اثر C:High که افشای IP و فراداده به آن نمی‌رسد.

راه اصلاح

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

توضیح امتیاز شدت

امتیاز پایه CVSS از مسیر حمله، تعامل لازم و اثر بر محرمانگی، یکپارچگی و دسترس‌پذیری محاسبه می‌شود؛ نه از نگران‌کننده بودن موضوع. افشای IP و بخشی از اطلاعات دستگاه در دسته C:Low است. حتی تعامل بسیار کم هم آن را به شدت بالا نمی‌رساند. «بدون کلیک» فقط معیار تعامل را تغییر می‌دهد، نه میزان اثر را. اینجا حتی مسیر بدون کلیک در چتی که هرگز باز نشده هم با کد تأیید نمی‌شود؛ بنابراین مقدار قابل دفاع UI:R و امتیاز پایه 4.3 است.

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

محدوده یافته و ادعاهای گزارش

موارد زیر هم بررسی شدند، اما جزو ادعاهای این یافته نیستند:

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

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

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

روند گزارش و انتشار

چه زمانی این مورد را اصلاح‌شده می‌دانم

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


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