آخرین اخبار
همهٔ اخبار
امنیت وب و نرم‌افزار گزارش بحرانیت ۶/۱۰

تحلیل امنیتی مدیریت متادیتا در Auth0: تفاوت حیاتی user_metadata و app_metadata

تحلیل امنیتی مدیریت متادیتا در Auth0: تفاوت حیاتی user_metadata و app_metadata

بسیاری از توسعه‌دهندگان تفاوت بین user_metadata و app_metadata در سرویس Auth0 را صرفاً یک قرارداد نام‌گذاری ساده می‌پندارند؛ اما در واقعیت، این تفاوت یک Security Boundary (مرز امنیتی) حیاتی است. اشتباه در انتخاب یکی از این دو فیلد برای ذخیره اطلاعات حساس می‌تواند منجر به آسیب‌پذیری‌های جدی در کنترل دسترسی (Access Control) شود.

تفاوت‌های ساختاری و امنیتی

تفاوت اصلی این دو فیلد در قابلیت ویرایش آن‌ها نهفته است:

  • user_metadata: برای ذخیره ویژگی‌های کاربر مانند ترجیحات (Preferences) یا زبان مورد استفاده است. این فیلد توسط خود کاربر قابل ویرایش است.
  • app_metadata: برای ذخیره داده‌هایی است که بر دسترسی‌ها تأثیر می‌گذارند، مانند پلن‌های اشتراکی (Subscription Plans)، Feature Flags و شناسه‌های خارجی. این فیلد توسط کاربر قابل ویرایش نیست.

ریشه فنی آسیب‌پذیری

این محدودیت به نحوه صدور توکن‌ها بازمی‌گردد. برای به‌روزرسانی app_metadata، توکن باید دارای Scopeهای update:users یا update:users_app_metadata باشد. این Scopeها هرگز در توکن‌های کاربر (User Tokens) صادر نمی‌شوند و تنها از طریق Client Credentials Grant در اپلیکیشن‌های Machine-to-Machine (M2M) قابل دستیابی هستند.

در مقابل، Auth0 اجازه می‌دهد کلاینت‌های عمومی (مانند SPAها یا اپلیکیشن‌های موبایل) از Scope update:current_user_metadata استفاده کنند تا کاربران بتوانند پروفایل خود را ویرایش نمایند. اگر منطق احراز هویت شما (Authorization Logic) داده‌های حساس مانند سطح دسترسی را از user_metadata بخواند، یک کاربر مهاجم می‌تواند با ارسال یک درخواست ساده به Management API، پلن خود را به enterprise تغییر داده و به ویژگی‌های پولی یا Beta دسترسی غیرمجاز پیدا کند.

مدیریت صحیح داده‌ها در Auth0

برای جلوگیری از این ریسک، توصیه‌های زیر را دنبال کنید:

  • استفاده از app_metadata: هر داده‌ای که تعیین می‌کند کاربر «چه کاری می‌تواند انجام دهد» (مانند نقش‌ها و دسترسی‌ها) باید در این فیلد قرار گیرد.
  • استفاده از user_metadata: تنها داده‌هایی که تغییر آن‌ها توسط کاربر، تأثیری بر امنیت یا سطح دسترسی ندارد (مانند تم تاریک/روشن) را اینجا ذخیره کنید.
  • استفاده از client_metadata: اگر داده‌ای مربوط به پیکربندی خودِ اپلیکیشن است (و نه کاربر)، از این فیلد استفاده کنید. برای مثال، تشخیص اینکه لاگین از طریق یک پنل ادمین داخلی انجام شده یا یک اپلیکیشن عمومی.

توصیه برای مدیران SOC و مهندسین امنیت

اگر از Auth0 استفاده می‌کنید، توصیه می‌شود یک Audit سریع روی Post-login Actions خود انجام دهید. هر کدی که برای تعیین Custom Claims از event.user.user_metadata استفاده می‌کند، پتانسیل Exploit شدن را دارد. این داده‌ها را فوراً به app_metadata منتقل کرده و نحوه نوشتن آن‌ها را به Backend (با استفاده از M2M Token) محدود کنید.