iam:PassRole: كيف يعمل، وكيف يستغله المهاجمون، وكيف تحدد نطاقه
ملخص
iam:PassRoleهو الإذن الذي يفحصه AWS عندما تسلّم جهة فاعلة دور IAM إلى خدمة، على سبيل المثال بوصفه دور التنفيذ لدالة Lambda أو ملف تعريف المثيل لمثيل EC2. وليس له استدعاء API خاص به.- لا يسمح AWS بالتمرير إلا عند اجتماع ثلاثة أمور: أن تسمح سياسات الجهة المستدعية بـ
iam:PassRoleعلى ذلك الدور، وأن تسمح سياسة الثقة للدور بالخدمة المستهدفة، وأن يكون الدور في الحساب نفسه الذي توجد فيه الجهة المستدعية. - عند اقترانه بإذن ينشئ موارد حوسبة أو يحدّثها، يتيح
iam:PassRoleلجهة فاعلة تشغيل شيفرة بهوية دور لم يُمنح لها قط. وفي خريطة الهجوم من Pathbreak، يعتمد عليه 55 بالمئة من مسارات تصعيد الامتيازات. - لا يسجّل CloudTrail أي حدث للتمرير نفسه، لذا يعتمد الاكتشاف على استدعاء الإنشاء أو التحديث وعلى معامل الطلب الذي يحمل ARN الدور.
- الإصلاح هو ARN لدور محدد أو مسار IAM في عنصر
Resource. أما شرطiam:PassedToServiceعلى مورد بحرف بدل فيضيّق الخدمة، لكنه يظل يسمح بكل دور يثق بها.
iam:PassRole هو إذن AWS IAM الذي يتحكم في الأدوار التي تستطيع جهة فاعلة تسليمها إلى خدمة AWS، مثل دور التنفيذ لدالة Lambda، أو ملف تعريف المثيل لمثيل EC2، أو دور الخدمة لمشروع CodeBuild. وهو أيضاً الإذن الأكثر ظهوراً في خريطة الهجوم من Pathbreak: إذ يعتمد عليه 55 بالمئة من مسارات تصعيد الامتيازات في الخريطة، وتصل هذه المسارات إلى 23 خدمة من خدمات AWS، لأن كل خدمة تشغّل أحمال العمل نيابةً عنك تقبل دوراً تسلّمه إليها. ومن السهل منحه على نطاق أوسع من اللازم، إذ يبدو المورد ذو حرف البدل غير مؤذٍ عند مراجعة السياسة، ولا يظهر التمرير نفسه في CloudTrail أبداً. تشرح هذه المقالة ما يفعله هذا الإذن، والفحوص التي يجريها AWS، وكيف يستخدمه المهاجم، وما تُظهره السجلات، وكيف تحدد نطاقه بحيث يُغلق المسار.
ما هو iam:PassRole
تعمل كثير من خدمات AWS بدور IAM تمنحه لها عند تهيئة مورد. فدالة Lambda تعمل بهوية دور التنفيذ الخاص بها، ومثيل EC2 يحصل على بيانات الاعتماد من ملف تعريف المثيل، ومشروع CodeBuild يستدعي AWS بدور الخدمة الخاص به. ويُسمّى تسليم ذلك الدور إلى الخدمة تمرير الدور، ويتحقق AWS مما إذا كان يُسمح للجهة المستدعية بفعل ذلك.
هذا الفحص هو iam:PassRole. وتنص وثائق AWS صراحةً على أن PassRole إذن وليس له استدعاء API، لذا لا توجد عملية PassRole في SDK. وينتقل ARN الدور معاملاً في استدعاء آخر، مثل المعامل Role في CreateFunction الخاص بـ Lambda، وتتحقق الخدمة من إذن iam:PassRole لدى الجهة المستدعية أثناء معالجتها لذلك الاستدعاء.
يوجد هذا الإذن لمنع جهة فاعلة من منح خدمة صلاحيات وصول تتجاوز ما تملكه هي. فلو استطاع مطوّر لا يملك أي أذونات على Amazon S3 أن يمرر دوراً يسمح بـ S3، لنفّذت الخدمة إجراءات S3 تلك نيابةً عنه، وهذا بالضبط هو التصعيد الذي يحذّر منه AWS في الصفحة نفسها.
الفحوص الثلاثة التي يجريها AWS عند تمرير دور
يحدد مقال مدونة AWS Security عن PassRole ثلاثة شروط يجب أن تتحقق جميعها قبل أن تتمكن خدمة من استخدام دور ممرَّر.
- يُسمح للجهة المستدعية بتمرير ذلك الدور. يجب أن تسمح سياسة قائمة على الهوية مرفقة بالجهة المستدعية بـ
iam:PassRoleمع وجود الدور في عنصرResource، وأن يتحقق كل شرط في تلك العبارة، وألا يرفضه أي شيء آخر، بما في ذلك سياسات التحكم في الخدمات وحدود الأذونات وسياسات الجلسة وسياسات نقاط نهاية VPC. - يثق الدور بالخدمة المستهدفة. يجب أن تسمح سياسة الثقة للدور بالجهة الأساسية للخدمة (service principal)، على سبيل المثال
lambda.amazonaws.comلدور تنفيذ Lambda. ويشير AWS إلى أن المورد يُنشأ في بعض الحالات رغم غياب الثقة، لكن الخدمة لا تستطيع حينها استخدام الدور. - الدور والجهة المستدعية في الحساب نفسه. ينص دليل مستخدم IAM على أن
iam:PassRoleلا يمرر دوراً إلا إلى خدمة في حساب AWS نفسه، لذا يحتاج التصميم العابر للحسابات إلى دور في الحساب الثاني يستطيع تقمّص الأول.
بالنسبة إلى المهاجم، يحدد الشرط الثاني قائمة الأهداف. فكل دور في الحساب تذكر سياسة الثقة الخاصة به خدمةً يستطيع المهاجم إنشاء موارد فيها هو دور مرشّح، ويحدد الشرط الأول ما إذا كان يجوز للمهاجم استخدامه.
أين يجري فحص PassRole
يجري الفحص كلما أُنشئ مورد بدور خدمة، وكلما حُدّث مورد قائم بدور جديد. وتغيير دور التنفيذ لدالة Lambda تحديث من هذا النوع، لذا يحتاج إلى الإذن نفسه الذي يحتاجه إنشاء الدالة.
الخدمات التي تستخدم الأدوار المرتبطة بالخدمة تنشئ هذه الأدوار وتديرها بنفسها عادةً، لذا لا يحدث أي تمرير. وحيث تتيح لك خدمة اختيار دور مرتبط بالخدمة، مثل مجموعة Amazon EC2 Auto Scaling تُنشأ بدور مسمّى من هذا النوع، يتحقق AWS من iam:PassRole بالطريقة نفسها.
يسرد الجدول بعض الاستدعاءات الشائعة التي تمرر دوراً، ومعامل الطلب الذي يحمله. وهذا المعامل نفسه هو ما تحتاج قاعدة الاكتشاف إلى قراءته.
| الخدمة | الاستدعاء الذي يمرر الدور | المعامل الذي يحمل الدور | المدخل في خريطة الهجوم |
|---|---|---|---|
| Lambda | CreateFunction | Role | تمرير الدور إلى Lambda |
| EC2 | RunInstances | IamInstanceProfile (ملف تعريف المثيل الذي يحتوي على الدور) | تمرير الدور إلى EC2 |
| CloudFormation | CreateStack | RoleARN | تمرير الدور إلى CloudFormation |
| CodeBuild | CreateProject | serviceRole | تمرير الدور إلى CodeBuild |
تسرد الخريطة كل عملية تمرير يتتبعها Pathbreak، بما في ذلك مهام Glue ومهام التدريب في SageMaker ومهام ECS وStep Functions وBedrock AgentCore، ويمكن تصفية خريطة الهجوم على iam:PassRole لرؤيتها معاً.
كيف يستغل المهاجمون iam:PassRole
iam:PassRole وlambda:CreateFunction معاً، تنشئ الجهة الفاعلة دالة، وتسلّمها دوراً ذا امتيازات، فتعمل الدالة بهوية ذلك الدور. ولا يظهر التمرير في CloudTrail أبداً حدثاً مستقلاً.يتبع الاستغلال الخطوات الثلاث نفسها أياً كانت الخدمة المعنية.
العثور على دور ذي امتيازات يثق بخدمة. يعيد iam:ListRoles سياسة الثقة لكل دور في الحقل AssumeRolePolicyDocument، لذا يكشف استدعاء واحد الأدوار التي تثق بـ Lambda أو EC2 أو CodeBuild أو أي خدمة أخرى. ويبحث المهاجم عن دور بأذونات واسعة تذكر سياسة الثقة الخاصة به خدمةً يستطيع إنشاء موارد فيها.
إنشاء مورد مرفق به ذلك الدور. بامتلاك iam:PassRole على الدور مع lambda:CreateFunction، ينشئ المهاجم دالة يكون دور التنفيذ لها هو الدور ذو الامتيازات. ويقبل AWS التمرير لأن سياسة الجهة المستدعية تسمح به، ولأن الدور يثق بـ lambda.amazonaws.com.
تشغيل شيفرة بهوية الدور. يستدعي المهاجم الدالة، فتعمل أي شيفرة كتبها بأذونات الدور ذي الامتيازات. وإذا كان الدور مسؤولاً، يكفي إنشاء واحد واستدعاء واحد للاستيلاء على الحساب. والخطوة نفسها تنجح عبر بيانات المستخدم في EC2، أو ملف buildspec في CodeBuild، أو قالب CloudFormation، أو نص مهمة Glue، ولهذا يمكن لمنح واحد واسع أكثر من اللازم لـ iam:PassRole أن يفتح مسارات كثيرة دفعة واحدة.
نسخة Lambda من هذه السلسلة، مع أحداث CloudTrail لكل خطوة، مشروحة في مقال ثلاث هجمات لتصعيد الامتيازات في AWS، مع أدلة CloudTrail والإصلاح.
لماذا لا يكفي iam:PassedToService بمفرده
iam:PassedToService مفتاح شرط يقيّد الخدمة التي يجوز تمرير الدور إليها. وهو مفيد، كما أن التحقق من السياسات في AWS نفسه يُصدر تحذيراً أمنياً بشأن iam:PassRole مع مورد بحرف بدل، ويوصي إما بـ ARN لأدوار محددة أو بهذا الشرط. غير أن الخيارين بعيدان كل البعد عن التكافؤ، لأن الشرط يضيّق الخدمة بينما يظل حرف البدل يشمل كل دور في الحساب.
توضح السياسة المُدارة من AWS AWSLambda_FullAccess هذه الفجوة بوضوح. فهي تمنح lambda:* وiam:ListRoles وiam:GetRole، وتسمح بـ iam:PassRole على "Resource": "*" مع ضبط iam:PassedToService على lambda.amazonaws.com. والجهة الفاعلة التي تملك هذه السياسة تستطيع سرد الأدوار في الحساب، والعثور على أي دور تسمح سياسة الثقة الخاصة به بـ Lambda، وإنشاء دالة به واستدعاءها. وإذا كان دور ذو امتيازات في الحساب يثق بـ Lambda، فلن يفعل الشرط شيئاً لإيقاف التصعيد، لأن التمرير يتم فعلاً إلى Lambda.
يثبت الشرط قيمته عند اقترانه بمورد محدد. فـ ARN لدور محدد يقرر أي دور يمكن تمريره، وiam:PassedToService يقرر الخدمة التي يمكن تمريره إليها، وهذا مهم عندما يثق الدور بأكثر من خدمة واحدة.
كيفية اكتشاف استغلال iam:PassRole في CloudTrail
يذكر AWS أنه لا تُنشأ أي سجلات CloudTrail لـ PassRole، لذا يكون الدليل دائماً هو استدعاء الإنشاء أو التحديث الذي تلقّى الدور.
- راقب المعامل. في Lambda، هذا هو حدث الإدارة
CreateFunctionالذي يحمل ARN الدور في معاملات الطلب. ويُظهر مرجع CloudTrail الخاص بـ Lambda اسم الحدث على أنهCreateFunction20150331، لذا يجب أن تطابق القاعدة بادئة اسم الحدث. ويشير المرجع نفسه إلى أن المعاملينEnvironmentوZipFileلا يُدرجان في السجل، لذا لا تكون الشيفرة التي رفعها المهاجم موجودة في الحدث. - قارن الدور بالجهة المستدعية. الإشارة القوية هي استدعاء إنشاء يرفق دوراً يملك أذونات أكثر من الجهة الفاعلة التي تجري الاستدعاء، خاصةً إذا صدر من جهة فاعلة ليس لها سجل في إنشاء ذلك النوع من الموارد.
- فعّل الأحداث اللاحقة.
Invokeفي Lambda حدث بيانات، ولا يسجّله CloudTrail افتراضياً، كما يؤكد AWS. وتفعيل أحداث بيانات Lambda يتيح للقاعدة ربط الإنشاء باستدعاء يأتي بعده ببضع دقائق. - اقرأ حالات الإخفاق. يسجّل CloudTrail الاستدعاءات الفاشلة مع رمز الخطأ ورسالة الخطأ. وعند رفض تمرير، يذكر الخطأ الذي يعيده AWS
iam:PassRoleوARN الدور، كما هو موضح في إرشادات استكشاف الأخطاء وإصلاحها من AWS. وسلسلة من استدعاءات الإنشاء المرفوضة يذكر كل منها دوراً مختلفاً هي ما يبدو عليه مهاجم يختبر الأدوار التي يستطيع تمريرها.
بعد نجاح التمرير، يكون نشاط الدور نفسه آخر مكان للبحث. فاستدعاءات API التي تُجرى بهوية الدور الممرَّر من دالة أو مثيل لم يكن موجوداً قبل ساعة تستحق نظرة أدق.
كيف تحدد نطاق iam:PassRole
الهدف أن تستطيع كل جهة فاعلة تمرير الأدوار التي يحتاجها عملها فقط، وإلى الخدمات التي تستخدمها فقط.
- سمِّ الأدوار. ضع ARN لأدوار محددة في عنصر
Resource. وحيث تُنشأ الأدوار كثيراً، استخدم مسار IAM مثلarn:aws:iam::111122223333:role/application_role/*أو بادئة اسم، بحيث تُغطّى الأدوار الجديدة في ذلك المسار دون تغيير السياسة، كما توصي مدونة AWS Security. - أضف
iam:PassedToService. استخدمه إلى جانب مورد محدد، بحيث لا يمكن تمرير دور يثق بعدة خدمات إلا إلى الخدمة التي يستخدمها حمل العمل. - استخدم
iam:AssociatedResourceArnحيث يناسب. يقيّد مفتاح الشرط هذا المورد الذي يمكن إرفاق الدور به. ولأن ARN بعض الموارد يتغير عند إعادة إنشاء المورد، يشير AWS إلى أن كثيراً من المؤسسات تقيّد بدلاً من ذلك من يستطيع تعديل المورد. - تجنّب التحكم القائم على الوسوم. يحذّر AWS من أن شروط
ResourceTagعلىiam:PassRoleلا تعطي نتائج موثوقة، لذا فالوسوم على الدور ليست أداة التحكم المناسبة لهذا الإذن. - احمِ المسارات ذات الامتيازات بسياسة SCP. يمكن لسياسة التحكم في الخدمة أن ترفض
iam:PassRoleعلى مسار محمي، مثل الأدوار التي يستخدمها فريق الأمن، ما لم تحمل الجهة المستدعية وسماً محدداً أو تكن ضمن مسار معتمد. - ضع حدوداً للأدوار التي ينشئها المطورون. إذا كان المطورون يستطيعون إنشاء أدوارهم الخاصة، فاشترط حدود أذونات على تلك الأدوار، واسمح لهم بتمرير الأدوار الموجودة في مسار مخصص فقط، بحيث لا يتجاوز الدور الذي ينشئونه ثم يمررونه تلك الحدود.
يحافظ كل تغيير على القدرة التي يعتمد عليها الفريق، ويغلق المسارات التي تمر عبر أدوار لم يحتج الفريق قط إلى تمريرها.
ما لا يصلحه تحديد نطاق PassRole
يغلق تحديد نطاق iam:PassRole المسارات التي تبدأ بمورد جديد. لكنه لا يفعل شيئاً للموارد المرفق بها دور ذو امتيازات بالفعل، لأن تغيير ما تشغّله هذه الموارد لا يمرر دوراً أبداً. وتحتاج هذه المسارات إلى ضوابط خاصة بها على أذونات التعديل.
- شيفرة دالة Lambda. يستبدل
lambda:UpdateFunctionCodeشيفرة دالة قائمة ويُبقي دور التنفيذ الخاص بها في مكانه، لذا تعمل شيفرة المهاجم بهوية ذلك الدور في المرة التالية التي تُستدعى فيها الدالة. - بيانات المستخدم في EC2. باستخدام
ec2:StopInstancesوec2:ModifyInstanceAttributeوec2:StartInstances، يوقف المهاجم مثيلاً، ويعيد كتابة بيانات المستخدم الخاصة به، ثم يشغّله من جديد. ولا تعمل بيانات المستخدم افتراضياً إلا عند الإقلاع الأول، لذا يقدّم المهاجم تهيئة cloud-init تعمل عند كل إقلاع، فيعمل النص البرمجي بملف التعريف الحالي للمثيل. - أوامر SSM. يشغّل
ssm:SendCommandنصاً برمجياً على مثيل مُدار، ويستطيع هذا النص قراءة بيانات اعتماد الدور المرفق بالمثيل بالفعل. - أدوار حزم CloudFormation. يشير AWS إلى أنه بمجرد إرفاق دور خدمة بحزمة، يستطيع المستخدمون القادرون على العمل على الحزمة استخدام الدور سواء امتلكوا
iam:PassRoleأم لا، لذا فإن الجهة الفاعلة القادرة على تحديث الحزمة أو تنفيذ مجموعة تغييرات ترث الدور. ويعمل البديل UpdateStack بالطريقة نفسها. - مشاريع CodeBuild. بدء عملية بناء لمشروع قائم مع ملف buildspec مستبدَل يشغّل أوامر المهاجم بدور الخدمة الخاص بالمشروع.
مراجعة الحساب التي تتوقف عند iam:PassRole ستفوّت كل ذلك، ولهذا تسردها الخريطة مدخلات منفصلة.
كيف تتحقق ممن يستطيع تمرير دور ذي امتيازات
بالنسبة إلى جهة فاعلة واحدة ودور واحد، يقدّم محاكي سياسات IAM إجابة سريعة. فهو يقيّم السياسات القائمة على الهوية وسياسات التحكم في الخدمات، بما في ذلك الشروط، للجهة الفاعلة التي تحددها.
aws iam simulate-principal-policy \--policy-source-arn arn:aws:iam::111122223333:user/dev-user \--action-names iam:PassRole \--resource-arns arn:aws:iam::111122223333:role/AdminRole
حيث تستخدم سياسة الجهة الفاعلة iam:PassedToService، أضف الوسيطة --context-entries التي تضبط المفتاح iam:PassedToService على الخدمة المستهدفة، مثل lambda.amazonaws.com، لأن المحاكي من دونها لا يملك قيمة يقارن بها. ولا تجيب النتيجة إلا عن الفحص الأول من الفحوص الثلاثة. أما ما إذا كانت سياسة الثقة للدور تسمح بالخدمة فمسألة منفصلة، تُعرف إجابتها بقراءة AssumeRolePolicyDocument الخاص بالدور، كما تظل الجهة المستدعية بحاجة إلى إذن الإنشاء لتلك الخدمة. ويشير AWS أيضاً إلى أن نتائج المحاكي قد تختلف عن البيئة الفعلية.
هذا ممكن لزوج واحد، لكنه غير عملي عبر حساب فيه مئات الجهات الفاعلة والأدوار. وتقرأ أداة pathbreak-audit المجانية مفتوحة المصدر إعدادات IAM في حساب واحد، وتسرد الأدوار والمستخدمين الذين يملكون أذونات وتركيبات قابلة لإساءة الاستخدام، مثل iam:PassRole مع إجراء إنشاء، مع الإصلاح لكل منها، كنقطة انطلاق. ويذهب Pathbreak أبعد من ذلك، إذ يحلّ كل عملية تمرير مقابل سياسات الجهة المستدعية وحدودها وSCP وسياسة الثقة للدور، بحيث لا يُبلَّغ إلا عن المسارات التي ستنجح فعلاً، مرتبةً حسب ما يستطيع الدور الممرَّر الوصول إليه.
الأسئلة الشائعة
ماذا يفعل iam:PassRole؟
iam:PassRole هو الإذن الذي يفحصه AWS عندما تمنح جهة فاعلة دور IAM لخدمة، على سبيل المثال بوصفه دور التنفيذ لدالة Lambda أو ملف تعريف المثيل لـ EC2. وهو يتحكم في الأدوار التي يجوز لجهة فاعلة تسليمها إلى الخدمات، بحيث لا تعمل الخدمة أبداً بصلاحيات وصول تتجاوز ما أُريد للجهة الفاعلة أن تملكه. ويُظهر Pathbreak الجهات الفاعلة في حساباتك القادرة على تمرير كل دور ذي امتيازات.
هل iam:PassRole خطير بمفرده؟
ليس بمفرده. يصبح مسار تصعيد امتيازات عند اقترانه بإذن ينشئ أو يحدّث مورداً يقبل دوراً، مثل lambda:CreateFunction أو ec2:RunInstances، وعندما يثق دور ذو امتيازات بتلك الخدمة. وتحديد نطاق عنصر Resource بأدوار محددة يزيل المسار. يفحص Pathbreak سياسة الثقة والشروط لكل تمرير عندما يتحقق من مسار.
هل يسجّل CloudTrail iam:PassRole؟
لا. يوثّق AWS أن PassRole إذن ولا يُنتج أي حدث في CloudTrail. ويظهر التمرير معاملاً في الاستدعاء الذي أنشأ المورد أو عدّله، مثل ARN الدور في حدث CreateFunction الخاص بـ Lambda، وتظهر عمليات التمرير المرفوضة على شكل استدعاءات إنشاء فاشلة تذكر رسالة الخطأ فيها iam:PassRole.
هل يكفي iam:PassedToService لجعل iam:PassRole آمناً؟
ليس عندما يكون المورد حرف بدل. فالشرط يقيّد الخدمة، لكن يظل من الممكن تمرير كل دور في الحساب يثق بتلك الخدمة، وهذا هو الحال مع السياسة المُدارة AWSLambda_FullAccess. اجمع بين iam:PassedToService وARN لأدوار محددة أو مسار IAM.
كيف أعرف من يستطيع تمرير دور ذي امتيازات في حسابي؟
بالنسبة إلى جهة فاعلة واحدة، يجيب aws iam simulate-principal-policy مع iam:PassRole وARN الدور عمّا إذا كانت سياسات الجهة الفاعلة تسمح بالتمرير، وتُظهر سياسة الثقة للدور الخدمات التي يمكنها تلقّيه. وعلى مستوى حساب كامل، تسرد pathbreak-audit الجهات الفاعلة التي تملك هذه الأذونات، ويتحقق Pathbreak من عمليات التمرير التي ستنجح ويرتّبها حسب ما تصل إليه.
اكتشف أي الجهات الفاعلة في حساباتك تستطيع تمرير دور ذي امتيازات اليوم، والتغيير الواحد الذي يغلق كل مسار.
اطلب عرضاً توضيحياً شاهد العرض التوضيحي