نگاره‌هایی پیرامون امنیت، شبکه و رمزنگاری

11 نوامبر 2019

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

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

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

علاقه‌مند به امنیت، بازی و تفریح. ۳۳ سال زندگی کردم، دوست دارم ۲۷ سال دیگه هم زندگی کنم. دو پارادوکس بزرگ زندگیم اینه که رشته تحصیلیم لیزر و اپتیک هست،‌ ربطی به کارم نداره، اسمم هم یاشار هست اما ترک نیستم.
زندگی من به سه قسمت تقسیم میشه، قسمت اول کار روزانه من هست که مثل بقیه مردم میرم سر کار. قسمت دوم سعی در براورده کردن علایق کاری خودم، مثل همین وبلاگ. قسمت سوم هم خانواده، مسافرت و تفریح. تلاش می‌کنم توی قسمت دوم، باگ‌بانتی کار کنم،‌ هم درآمد خوبی داره هم هیجان خاص خودش رو. اون قسمت‌هایی از تکنیک‌ها و کشفیات در فرایند باگ‌بانتی رو سعی می‌کنم توی این وبلاگ قرار بدم.
  • به اشتراک بگذارید:
  1. مصطفی گفت:

    سلام ممنون بابت تحلیل. باگ جالبی بود.
    یه سوال برام پیش اومد، وقتی داشتید flow oauth رو توضیح میداید گفتید که بعد از اینکه کاربر به اپ اجازه ها رو میده یه access token از طرف provider میاد که کاربر هم اونو در اختیار اپ قرار میده و اپ از طریق اون access token میتونه به api ریکوئست بزنه در واقع اینطور متوجه شدم که authorize شدن اپ یعنی داشتن اون access token. اما توی اکسپلویت گفته شد که با زدن ریکوئست Head ما authorize میشیم، ولی به دلیل SOP نمیتونیم access token رو بخونیم. متوجه نشدم که چطور بدون access token اپ ما اجازه پیدا کرده؟

    • یاشار شاهین‌زاده گفت:

      نمیخواد که Access Token خونده بشه، خود کاربر Access Token رو به مهاجم میده دیگه (طبق جریان‌کاری oAuth)، سناریو حمله اینه که مهاجم میره یه حساب می‌سازه و از Github سرویس oAuth می‌گیره، پس همیشه Access Token رو داره، فقط می‌مونه که مجوز دسترسی رو گسترش بده، که با استفاده از HEAD این کار رو می‌کنه.

  2. سام وان گفت:

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

  3. رامین گفت:

    سلام
    آیا سایت hackerone و bugcrowd به ایرانی ها جایزه میدن و با چه متدی؟

  4. حیدر گفت:

    سلام ویدیو خوبی بود. من میخوام دانلودش کنم تو ارشیوم نگهدارم اما متاسفانه نمیتونم دانلود کنم. سیستم عاملم اوبونتوعه و IDM ندارم. میشه راهنمایی کنین چطور میتونم دانلودش کنم؟

  5. حسین گفت:

    توی پروتکل OAuth2 تفاوت بین response_type، کد و توکن چی هست؟ می دونم که اگر روی حالت code باشه بعد client باید یک مرحله اضافه تر طی کنه برای دریافت access_token اما وقتی مستقیم میشه access_token دریافت کرد گزینه access_code به چه دردی می خوره؟

    • یاشار شاهین‌زاده گفت:

      دوتا پیاده‌سازی هست، دومرحله‌ای و سه‌مرحله‌ای

      دو مرحله‌ای: برای اینکه یه اپلیکیشن بجای شما کار کنه، مثلا نرم‌افزار توئیتر با APIهای توئیتر تعامل کنه. عملیات بدون دخالت کاربر انجام میشه.
      سه مرحله‌ای: برای اینکه بدون اشتراک‌گذاری اطلاعات ورود، کاربر مجوز خاصی به یه اپلیکیشن دیگه بده. عملیات با دخالت کاربر انجام میشه.

      کاربرداش فرق داره، این لینک خوبه:

      http://cakebaker.42dh.com/2011/01/10/2-legged-vs-3-legged-oauth

  6. علیرضا نورککاظمی گفت:

    بسیار عالی بود

  7. کاربر گرامی گفت:

    سلام
    عالی بود
    ولی من یه جا رو متوجه نشدم
    مگه متد ها قبلش به POST و GET محدود نمیشن؟
    app.route(path, methods=[‘POST’, ‘GET’])
    پس از این چطوری HEAD رد میشه؟!