آسیب پذیری دسکتاپ تلگرام امکان سرقت فایل هر کاربری را فراهم می کرد
آدرس مقاله: https://beaksec.github.io/posts/telegram-desktop-one-click-account-takeover/ آدرس نظرات: https://news.ycombinator.com/item?id=50029123 امتیاز: 229 # نظر: 116
شخصی شما را به یک گروه تلگرام اضافه می کند. یک لینک در چت نمایش داده می شود. روی آن کلیک می کنید و اکانت تلگرام شما دیگر تنها مال شما نیست.
دسکتاپ تلگرام روی پیوندهای نمونه در حال اجرا خود روی یک سوکت محلی، به عنوان متن کلیک می کند و هرگز از کاراکتری که برای جداسازی دستورات استفاده می کند فرار نمی کند. بنابراین یک پیوند ساخته شده به عنوان یک دستورالعمل به دست نمی آید: به صورت چندین می آید.
زنجیری که پیدا کردم دو عیب دارد. اولین مورد آن تزریق است. دوم چیزی است که دستور تزریق شده به آن می رسد: یک طرح URI داخلی، interpret: که فایلی را که در یک فایل دستورالعمل نامگذاری شده است می خواند و آن را به یک چت می فرستد، بدون اینکه بررسی کند چه کسی آن را درخواست کرده و بدون تأیید. آنها با هم یک پیوند کلیک شده را به خواندن فایل دلخواه تبدیل می کنند. در این پست من از زنجیره عبور می کنم و سپس از آن برای سرقت فایل هایی که ورود قربانی هستند استفاده می کنم.
سیستمهای عامل به برنامهها اجازه میدهند که یک طرح URI را ثبت کنند، تا بدانند وقتی با پیوندی از این نوع مواجه شدند، کدام برنامه را راهاندازی کنند. تلگرام دسکتاپ tg را ثبت می کند. از آن به بعد، سیستم میداند که پیوند tg://... متعلق به تلگرام است و آن را با URL به عنوان آرگومان خط فرمان راهاندازی میکند.
اگر تلگرام اجرا نشود، فرآیند شروع میشود، رشته را به عنوان پارامتر میگیرد، آن را به یک شی URL تبدیل میکند و آن را به صورت داخلی مدیریت میکند: یک فرآیند، و چیزی برای برقراری ارتباط نیست.
اما اگر تلگرام از قبل اجرا شده باشد چه؟ سیستم عامل نه می داند و نه بررسی می کند: به هر حال فرآیند جدیدی را راه اندازی می کند، مشابه فرآیند اول. خود تلگرام باید تشخیص دهد که این مورد زائد است و روشی که آن را انجام می دهد تلاش برای اتصال به یک سوکت محلی است.
نمونه ای که از قبل در حال اجرا است سرور است: از زمانی که شروع به کار کرده است در آن سوکت گوش می دهد. فرآیند جدید مشتری است. اگر موفق به اتصال شود، یک نمونه از قبل زنده است، بنابراین پیوند را تحویل داده و خارج می شود.
یک سوکت اشیاء را حمل نمی کند، بلکه بایت ها را حمل می کند. شی URL که فرآیند جدید در حافظه نگه می دارد نمی تواند از آن کانال عبور کند، بنابراین باید در یک خط متن صاف شود.
آن عملیات یک نام دارد: سریال سازی. معکوس آن، بازسازی شیء از روی متن، امری زدایی است. هر زمان که دادههای ساختیافته باید از یک مرز عبور کنند، هر دو اجتنابناپذیر هستند، و هر دو دقیقا نقطهای هستند که مرزهای داخل داده توسط ساختار متوقف میشوند و به شخصیتهایی در متن تبدیل میشوند.
تلگرام این کار را با فرمت خودش انجام می دهد، یک فرمت ساده. هر دستورالعمل یک کلمه کلیدی است، سپس آرگومان آن، سپس یک نقطه ویرگول که آن را می بندد. پیوندی برای باز کردن تبدیل می شود:
tg://x?a=1 با هیچ کنترل کننده ای در تلگرام مطابقت ندارد، بنابراین این پیوند به تنهایی هیچ کاری نمی کند. این فقط یک حامل است.
این خط در اینجا ساخته شده است، یک URL برای باز کردن:
از طرف دیگر، نمونه در حال اجرا غیرمستقیم میشود: بایتهای دریافتی را میخواند، آنها را در هر نقطه ویرگول برش میدهد، و هر قطعه را بهعنوان یک دستورالعمل در نظر میگیرد. برای هر قطعه ای که با OPEN شروع می شود: موارد زیر را می گیرد و آن را به عنوان URL بازسازی می کند، دقیقا همانطور که به تازگی وارد خط فرمان شده است.
بنابراین چه اتفاقی میافتد اگر یکی از مقادیر ارسالشده حاوی یک نقطه ویرگول مخصوص به خود باشد، همان کاراکتری که قالب از آن به عنوان جداکننده استفاده میکند؟ لینک قبلی را بردارید و چیزی به آن اضافه کنید:
فرآیند جدید آن را به عنوان یک URL واحد در نظر می گیرد، زیرا برای آن نقطه ویرگول فقط یک کاراکتر در داخل پرس و جو است. آن را صاف می کند و روی سوکت می نویسد:
نمونه در حال اجرا در هر نقطه ویرگول قطع می شود و به جای یک دستور دو دستور دریافت می کند:
آن تزریق است و اولین عیب از آن دو است.
مثال بالا CMD: را تزریق کرد، اما با نام گمراه نشوید: فقط نمایش و خروج را می پذیرد، بنابراین بدترین کاری که می تواند انجام دهد بستن برنامه است.
چهار دستور در مجموع پذیرفته شده است و سه تای آنها بی ضرر است. چهارمی OPEN است: و جزئیات آن وجود دارد: هر URL را میپذیرد، بدون فیلتر در طرح.
با کاوش در کد، یک طرح URI دیگر در تلگرام به نام interpret: مشاهده می شود.
سیستمعامل نمیداند با پیوندی که با interpret: شروع میشود چه کند، زیرا در هیچ کجا بهعنوان یک کنترلکننده پروتکل ثبت نشده است: فقط در کد خود تلگرام وجود دارد، که این طرح را از لیست URL شروع مانند سایر موارد انتخاب میکند.
این ابزاری بود که تلگرام برای انتشار نسخههای خود از آن استفاده میکرد. هنگامی که نسخه جدید ارسال می شد، آرشیو ساخت باید در کانالی با عنوان تغییرات به عنوان زیرنویس پست می شد. یک اسکریپت به جای انجام این کار به صورت دستی، یک فایل متنی کوچک با نام کانال، فایل برای ارسال و متن برای نوشتن نوشت، سپس تلگرام را با مسیر آن فایل راه اندازی کرد.
مقدار from: با شناسه حسابی که در حال حاضر وارد شدهاید مقایسه میشود: اپراتور را از انتشار نسخهای از یک حساب اشتباه باز میدارد. چک فقط در صورت وجود خط اجرا میشود، بنابراین حذف آن باعث رد شدن آن میشود. مقصد فقط با کانال تنظیم می شود: و باید یک کانال یا یک سوپرگروه باشد.
تابعی به نام InterpretSendPath این کار را انجام می دهد.
پس اشکال کجاست؟ interpret: یک عمل ممتاز را انجام میدهد، هر فایلی را از روی دیسک میخواند و آن را به چت میفرستد، بدون اینکه از کسی تأیید کند و بدون بررسی اینکه چه کسی آن را درخواست کرده است.
عملکرد هیچ بررسی مجوزی را انجام نمی دهد.
هنگامی که از خط فرمان می آید، که اسکریپت انتشار آن را فراخوانی می کند، مشکلی نیست: یک مهاجم از قبل به یک جای پایی روی دستگاه نیاز دارد، و با یکی از آنها می تواند خود فایل ها را بخواند. اما هنگامی که همان عمل از طریق سوکت و بنابراین از طریق تزریق قابل دسترسی است، یک عملکرد خطرناک از پیوندی که قربانی کلیک می کند در دسترس قرار می گیرد.
این یک مجوز مفقود است و دومی از دو نقص است.
مهاجمی که میتواند یک فایل دستورالعمل را روی دیسک قربانی قرار دهد، فایل اشارهای: در مسیری که ارزش دزدیدن دارد و کانال: در کانالی از خودش، میتواند هر فایلی را از آن دستگاه با چیزی بیش از یک لینک کلیک شده استخراج کند.
بنابراین چگونه یک مهاجم یک فایل متنی را در یک مسیر قابل پیش بینی روی دیسک شخص دیگری قرار می دهد؟ راه واضح این است که آن را به عنوان یک پیوست چت ارسال کنید.
همانطور که اتفاق می افتد، تلگرام دسکتاپ در تنظیمات پیش فرض خود فایل های دریافتی را به صورت گروهی تا حجم 8 مگابایت به صورت خودکار دانلود می کند، در حالی که در کانال های پخش، دانلود خودکار خاموش است. فایل در یک پوشه استاندارد، تحت همان نامی که فرستنده انتخاب کرده است، بدون کلیک قربانی روی آن، و در مکانی قابل پیش بینی قرار می گیرد (تصادف نام باعث می شود که تلگرام دستورالعمل ها را ذخیره کند1 (2).txt به جای آن). برخی از قالبها، مانند استیکرها، GIFها و پیامهای صوتی، به جای آن به حافظه پنهان داخلی میروند و به عنوان مسیر روی دیسک قابل دسترسی نیستند.
تلگرام خودش آن مسیر را می سازد (file_utilities.cpp:172-181). در ویندوز:
با ارسال فایل به گروه، مهاجم دقیقا می داند که در کجا ذخیره می شود. به نظر میرسد این مسیر هنوز یک ناشناخته دارد، نام کاربری ویندوز، اما تفسیر میکند: همچنین مسیرهای نسبی را میپذیرد، و یک مسیر نسبی از دایرکتوری کاری خود تلگرام، که پوشه داده آن است، حل میشود (logs.cpp:381). در ویندوزی که %APPDATA%\Telegram Desktop است، سه سطح زیر فهرست اصلی کاربر است و Downloads مستقیما در آن فهرست اصلی قرار دارد. بنابراین مسیری مانند این:
بدون نیاز به نام کاربری یک مسیر قطعی به مهاجم می دهد.
InterpretSendPath دقیقا یک فایل را در هر فراخوانی ارسال می کند: اگر یک فایل دستورالعمل چندین فایل: خطوط را در خود جای دهد، فقط آخرین مورد حساب می شود. دو چیز این محدودیت را برطرف می کند. هیچ چیز مهاجم را از ارسال هر تعداد فایل دستوری که می خواهد باز نمی دارد، و تزریق در اولین دستور متوقف نمی شود: هر نقطه ویرگول دیگری را باز می کند. بنابراین، سه هدف، سه فایل دستورالعمل و سه دستور انباشته شده در یک پیوند هستند.
ابتدایی در سرتاسر یکسان می ماند: فایل دلخواه خوانده می شود. آنچه شما می خوانید تغییر می کند: یک کلید خصوصی SSH، یک ذخیره رمز عبور مرورگر، یک فایل اعتبارنامه ابری، یا یک پیکربندی حاوی یک نشانه API.
تلگرام از بسته بندی کلید استفاده می کند. دو کلید درگیر است. اولین مورد، DEK (کلید رمزگذاری داده ها)، طولانی، تصادفی و با آنتروپی بالا است و داده های کاربر را رمزگذاری می کند. دومی، KEK (کلید رمزگذاری کلید)، فقط DEK را رمزگذاری می کند، و رمز عبور نیست: از رمز عبور از طریق یک تابع مشتق کلید (KDF)، همراه با نمک ذخیره شده در کنار DEK رمزگذاری شده مشتق شده است.
در شبه کد، زنجیره ای که داده های محلی را باز می کند به صورت زیر است:
به طور پیش فرض دسکتاپ تلگرام هیچ رمز عبور محلی ندارد: باید تنظیمات را باز کنید و یکی را تنظیم کنید. با تنظیم هیچ، رمز عبوری که مشتق را تغذیه می کند خالی است (storage_domain.cpp:102)، بنابراین KEK از رشته خالی و یک salt می آید، و آن salt در پاک در tdata/key_datas ذخیره می شود، همان فایلی که DEK رمزگذاری شده را نگه می دارد. خواندن آن یک فایل برای محاسبه مجدد KEK و باز کردن DEK کافی است.
بنابراین بدون تنظیم رمز عبور، هر کسی که key_datas را دریافت کند، DEK را دریافت میکند، و با DEK هر چیز دیگری رمزگشایی میشود، مجوز جلسه نیز شامل میشود.
سه پرونده درگیر است و فقط دو تای آنها راز دارند:
آن نام پوشه تصادفی نیست و مختص نصب نیست. از داده های رشته ای، نام داده پیش فرض (store_file_utilities.cpp:241-250) مشتق شده است. در هر نصب یکسان است.
فایل سوم یک فهرست است و هیچ رازی در آن وجود ندارد. هنوز جلسه بدون آن بارگیری نمیشود: تلگرام مجوز را فقط در حین خواندن این فهرست میخواند. با این حال، دزدیدن آن یک انتخاب است: یک مهاجم میتواند به خوبی یکی را بسازد. در این اثبات مفهوم، برای راحتی، به سادگی همراه با دو مورد دیگر گرفته شده است.
نتیجه این است که مهاجمی که هر سه را در اختیار دارد این حساب را دارد: آنها را در یک tdata جدید رها کنید، تلگرام را راه اندازی کنید و جلسه قربانی باز می شود.
حمله به یک کلیک از طرف قربانی نیاز دارد و باید از خارج از تلگرام انجام شود. پیوند tg:// که در چت تلگرام کلیک میشود، در حین پردازش ( click_handler_types.cpp:278 ) مدیریت میشود و هرگز به سوکت نمیرسد، بنابراین چیزی برای تزریق وجود ندارد. از طرف دیگر، لینکهای https معمولی در مرورگر سیستم (ui_integration.cpp:437) باز میشوند، زیرا دسکتاپ تلگرام هیچ جاسازیشدهای ندارد. بنابراین مهاجم یک لینک https معمولی می فرستد و سرور خود را دارد که آن را به tg://1 ساخته شده هدایت می کند.
بسته به مرورگر و اینکه قربانی قبلا از هندلر استفاده کرده است، سیستم ممکن است قبل از راهاندازی تلگرام درخواست تأیید کند.
مهاجم یک سوپرگروه ایجاد می کند و قربانی را به آن اضافه می کند. تنظیمات حریم خصوصی پیشفرض تلگرام این امکان را بدون تأیید دعوتکننده فراهم میکند.
مهاجم سه فایل متنی دستورالعمل را در گروه ارسال می کند، یکی برای هر فایلی که باید به سرقت برود، و همگی گروه خود مهاجم را به عنوان مقصد نام می برند. حذف خط از: بررسی حساب را به طور کامل رد می کند:
فایل باید متن ساده با انتهای خط LF و بدون علامت ترتیب بایت باشد. دو مورد دیگر به tdata/D877F783D5D3EF8Cs و tdata/D877F783D5D3EF8C/maps اشاره میکنند. وقتی قربانی گروه را باز میکند، دانلود خودکار هر سه را در دیسک قربانی ذخیره میکند، که به هر حال این کار را انجام میدهد، زیرا لینک مرحله 3 در آنجا منتظر است.
مهاجم یک پیوند بی ضرر را به چت ارسال می کند:
قربانی روی آن کلیک می کند. مرورگر از تغییر مسیر پیروی می کند، که این بار یک فرمان را برای هر هدف حمل می کند، در اینجا پیچیده شده اما به صورت یک خط ارسال می شود:
سیستم عامل فرآیند دوم تلگرام را راه اندازی می کند که URL را به آدرس در حال اجرا از طریق سوکت ارسال می کند. نقطه ویرگول های خارج نشده آن را می شکافند و تزریق شلیک می شود.
این سه تفسیر می کنند: دستورات اجرا می شوند و سه فایل در گروه مهاجم آپلود می شوند. هیچ گفتگوی تاییدی نشان داده نمی شود.
مهاجم tdata را از سه فایل بازسازی می کند و حساب قربانی را باز می کند.
به 7.2.9 یا بالاتر ارتقا دهید. این تنها چیزی است که در واقع مشکل را می بندد. بقیه قرار گرفتن در معرض را کاهش می دهد.
«بپرسید هر فایل کجا ذخیره شود» را روشن کنید. با این تنظیمات، دانلود خودکار اصلا اتفاق نمی افتد و فایل دستورالعمل هرگز به دیسک نمی رسد. این موثرترین کاهش برای ارتقاء است.
محدود کردن افرادی که می توانند شما را به گروه ها فقط به مخاطبین خود اضافه کنند. فایلهای دزدیده شده را فقط میتوان به یک کانال یا یک سوپرگروه ارسال کرد، بنابراین محلی که مهاجم میخواهد آنها را به آن تحویل دهد، از بین میبرد.
یک رمز عبور محلی تنظیم کنید و آن را مانند یک رمز عبور واقعی انتخاب کنید. این مانع از سرقت فایل ها نمی شود. فقط جلسه دزدیده شده را غیرقابل استفاده می کند.
اصلاح شده توسط commit db3405699f در 16 سپتامبر 2026. تاریخ تغییرات تاریخ 7.2.9 به همان روز است. این نسخه صبح روز بعد منتشر شد. commit طرح interpret:// و Support::InterpretSendPath را به طور کامل حذف میکند و از جداکننده رکورد در سوکت تک نمونه فرار میکند: مقادیر قبل از نوشتن و رمزگشایی پس از تقسیم، با یک رمزگذاری هگزا با درصد پیشوند خارج میشوند، بنابراین یک نقطه ویرگول در دادهها دیگر نمیتواند به مرز تبدیل شود.
همچنین دو معیار فراتر از آن اضافه میکند: رکوردهای CMD: و CTRL: زمانی که همان اتصال دارای یک OPEN: باشد حذف میشوند و مسیرهای فایل محلی پس از ظاهر شدن یک URL غیر محلی در آن اتصال حذف میشوند.
اصلاح بی سر و صدا ارسال شد: تغییرات 7.2.9 فقط یک اصلاح رندر را ذکر می کند، commit که زنجیره را می بندد با عنوان "Remove legacy interpret path helper" است و هیچ توصیه ای همراه با آن نیست.
اگر به این نوع چیزها علاقه دارید، من مطالب مربوط به امنیت سایبری را در BeakSec، کانال YouTube من منتشر می کنم. این جدید است، بنابراین اشتراک کمک می کند.
متن اصلی (انگلیسی)
Telegram Desktop vulnerability allowed any user's file to be stolen
Article URL: https://beaksec.github.io/posts/telegram-desktop-one-click-account-takeover/ Comments URL: https://news.ycombinator.com/item?id=50029123 Points: 229 # Comments: 116