چگونه بات تلگرام منجر به آسیب پذیری PII و نشت دادهی کاربران میشود؟
آنچه میخوانید، رایتاپ رامین فرجپور، برنامهنویس و محقّق امنیتی، از فرآیند بررسی وجود آسیبپذیریPII است.
پیامرسان تلگرام این روزها امکانی را فراهم کرده که بر روی بسیاری از سایتها به چشم میخورد. برنامهنویسها میتوانند با استفاده از یک بات تلگرامی به نام @BotFather باتهای موردنظر خودشان را بسازند و مدیریت کنند. به این ترتیب هر کسبوکاری میتواند یک بات مختص به خود را داشته باشد و کارهای مختلفی را با این بات انجام دهد. در همین حین، اگر کسبوکارها به نکات امنیتی استفاده از بات آشنا نباشند، این عدم آشنایی باعث میشود که دادههایی از کاربران نشت پیدا کند و برای مقاصد مختلفی همچون کلاهبرداری یا تبلیغات از این دادهها استفاده شود.
در ادامه به نمونهای از نشت دادههای یک بات تلگرامی میپردازیم:
در این رایتاپ قصد دارم ماجرای آسیب پذیریای را شرح دهم که شاید برای شما هم اتفاق بیافتد! سایت کسبوکار آنلاینی، از بات برای اطلاعرسانی به کاربران (مانند نمایش اطلاعات کاربر، نمایش اعلانها و ...) استفاده کرده بود. اما بهدلیل پیادهسازی ناامن ( که احتمالا بهدلیل ناآشنایی کافی با معماری بودهاست) باعث مشکل امنیتی شده بود. چه مشکلی؟ منجر به آسیب پذیری PII و نشت دادههای کاربران شده بود.
معماری
معماری سایت برای تعامل با بات تلگرام اینگونه بود: کاربران با استفاده ازID تلگرام، میتوانستند Notificationهای سایت (اعلانهای مربوط به ایجاد تیکت، پاسخ به تیکت، دریافت اطلاعات کاربر و ... ) را بر روی حساب کاربری تلگرام خود دریافت کنند. در این روند بهخودیخود مشکلی وجود ندارد. مشکل از آنجایی شروع میشود که هر کاربر یک ID تلگرام دارد و همچنین در سایت هم یک ID جداگانه به هر کاربر در جدول Users اختصاص داده شده است. فرآیند ادغام این دو باید طوری طراحی شوند که هنگام ارسال درخواست کاربر به بات، بر اساس نشست فعال کاربر در اپلیکیشن تلگرام و با استفاده از ID تلگرام کاربر، بتوان ID کاربر در سایت را متوجه شد و در گام بعدی اطلاع رسانی موردنظر و مطابق با آن ID ، توسط بات به حساب تلگرام کاربر متناظر با ID ارسال شود.
معماری از نحوهی ارتباط بات با API
خب! زمانی که کاربر عضو بات میشود، مشاهده میگردد که عملکرد بات بر اساس Username است. یعنی در اینجا کاربر Username را به عنوان ورودی وارد میکند. سپس بات این Username را به همراه ID تلگرام کاربر به API ارسال میکند و در نهایت ID تلگرام ارسالی به عنوان ID تلگرام متناظر با Username کاربر (که خودش دارای یک ID در سایت است) در نظر گرفته میشود.
یعنی به اینصورت:
نحوهی ارسال Username به همراه Telegram ID
طبق معماری اعلامشده، چگونگی عملکرد بات و نحوهی ارتباط با آن مشخص است. ضروری است که وجود چند آسیبپذیری امنیتی بررسی شود.
آسیب پذیری هایی که ما باید در این قسمت به آنها توجه کنیم، عبارتند از:
SQL Injection
IDOR
SSRF
...
من با بررسی آسیبپذیریهای احتمالی در این فرایند، موفق به کشف آسیبپذیری IDOR شدم.
حالا بیایید معماری فوق را که ممکن است باعث بروز مشکل امنیتی شود، بیشتر مورد بررسی قرار دهیم.
در بررسی ارتباط بات تلگرام و API سایت، لازم است که چند نکته مورد توجه قرار بگیرد:
بهعنوان یک مسئلهی مهم باید بررسی شود که آیا من میتوانم هر username دلخواهی را وارد کنم و به اطلاعات دیگر کاربران دسترسی پیدا کنم؟ (در حالی که من صاحب اصلی این username نیستم.)
دریافت نام کاربری سایت
دریافت اطلاعات کاربری با واردکردن نام کاربری
و شد، آنچه که نباید میشد. ؛)
دریافت غیرمجاز اطلاعات سایر کاربران با وارد کردن نام کاربری آنها
دریافت غیرمجاز اعلانهای سایر کاربران (برای هر نام کاربری دلخواه)
همانطور که در تصاویر فوق مشاهده میکنید، سناریوی حمله موفقیتآمیز بوده و به راحتی نشت داده (اطلاعات سایر کاربران) رخ داده است. در این بات تلگرام هیچگونه بررسی و صحتسنجی در ارتباط با این که " آیا کاربر ارسالکنندهی یک username به بات، واقعا مالک همان حساب کاربری است، یا خیر؟" وجود ندارد.
برای جلوگیری از این آسیب پذیری چه باید کرد؟
برای رفع این آسیبپذیری، معماری باید به گونهای اصلاح شود که API دریافتکنندهی درخواست از بات تلگرام، به جای دریافت مستقیم username، یک شناسهی یکتا و تصادفی برای کاربر ایجاد کند و پس از ثبت این شناسه توسط کاربر در سایت، بات تلگرام به حساب کاربری کاربر موردنظر متصل شود. همچنین میتوان معماری را به نحوی تغییر داد که یک لینک فعالسازی توسط بات در اختیار کاربر قرار بگیرد و پس از مراجعهی کاربر به لینک فعالسازی، بات به حساب کاربری او متصل شود. به این ترتیب آسیبپذیری IDOR رفع خواهد شد.
بهعنوان نمونه، تصویر زیر نحوهی رفع آسیبپذیری با ارسال لینک فعالسازی برای کاربر را نمایش میدهد:
با این روش جلوی این حمله گرفته شده و آسیب پذیری رفع گردیده است.
به عنوان یک نمونهی دیگر، بات تلگرام سینما (30nama) را بررسی میکنیم:
در این بات امکان دریافت توکن فعالسازی اعلانها وجود دارد که به عنوان یک گزینه در اختیار کاربر قرار میگیرد:
پس از انتخاب گزینهی توکن فعالسازی، یک توکن تصادفی تولید و به کاربر نمایش داده میشود:
کاربر پس از دریافت توکن، باید به بخش داشبورد در حساب کاربری خود مراجعه کند و توکن دریافتشده را وارد کند تا بات تلگرام به حساب کاربری او متصل گردد.
این روش، یک راه مناسب جهت جلوگیری از آسیبپذیری IDOR است.
برخی از سایر رایتاپهای منتشرشده از رامین فرجپور:
بررسی وجود ۵ آسیب پذیری رایج برروی درگاه پرداخت هدف راورو
چگونه توانستم در هدف راورو، آسیبپذیری IDOR را کشف کنم؟
چگونه توانستم آسیبپذیری PII را در هدفهای مربوط به سه میدان مختلف کشف کنم؟
سایر رایتاپهای منتشرشده:
چگونه توانستم آسیبپذیری CRLF Injection را بر روی PayPal کشف کنم؟ (عباس هیبتی)