الـ vulnerability الأعمق والأصعب في اكتشافها — لما المطور ينسى يتحقق من الـ role مش بس من الـ identity.
شاهد شرح الفيديو الكامل لمنهجية الـ Access Control وكيفية اكتشاف الثغرات عملياً.
الاتنين بيودوا لنفس النتيجة — بس السبب مختلف تماماً. وفهم الفرق ده هو اللي بيخليك تغطي الـ attack surface كاملة.
| الجانب | IDOR — Indirect Object Reference | Access Control Violation |
|---|---|---|
| الـ Failure | التطبيق مش بيتحقق من ملكية الـ object — هل الـ ID ده بتاعك؟ | التطبيق مش بيتحقق من صلاحية الـ mechanism — هل الـ role بتاعك يسمحلك؟ |
| السؤال الأساسي | هل الـ object ID ده بتاعي؟ | هل الـ role بتاعي مسموحله يستخدم الـ mechanism ده؟ |
| نوع الـ Bypass | تغيير الـ identifier (ID, UUID, email...) | استخدام mechanism مش مفروض يكون متاح لـ role بتاعك |
| مثال | GET /order?id=1001 → id=1002 | GET /admin/export-users (as regular user) |
| الـ Accounts | حسابين بنفس الـ role (A1 و A2) | حسابين بـ roles مختلفة (Admin و User) |
| الـ Automation | صعب — محتاج context + IDs محددة | صعب جداً — محتاج معرفة الـ roles وكل mechanism |
| الـ CWE | CWE-639 | CWE-284 / CWE-285 |
| الإصلاح | WHERE id=? AND owner_id=current_user | IF current_role NOT IN allowed_roles → 403 |
كتير من الـ researchers بيخلطوا بين الاتنين وبيفتكروا إنهم بيغطوا كل الـ attack surface. الحقيقة هي إنهم بيضيعوا نص الـ bugs.
لو قدرت تغير ID في الـ request وشفت data حد تاني — ده IDOR. بس لو كـ regular user وصلت لـ admin endpoint أو عملت operation مفروضة بس للـ admin — ده Access Control Violation.
الـ Access Control Violations هي أصعب من الـ IDOR من ناحية: إنت محتاج تعرف كل mechanism في التطبيق، وكل role، وإيه اللي المفروض كل role يعمله. من غير المعرفة دي، مش هتلاقي حاجة.
مش نوع واحد — في 5 أنواع مختلفة كل واحد ليه methodology مختلفة.
Unauthenticated user يوصل لـ endpoint مفروض يكون مقفول. الـ barrier بين الـ logged-out وlogged-in state.
User A يعمل operations بتاعة User B — نفس الـ role بس account مختلف. ده بيتداخل مع الـ IDOR في بعض الأحيان.
Regular user يوصل لـ Admin functionality. ده هو الـ jackpot في الـ Access Control testing.
في الـ application روله معين مسموحله يعمل READ بس مش UPDATE. لو قدر يبعت UPDATE request وينجح — ده function-level violation.
كل الـ requests بتروح لـ endpoint واحد: /graphql. الـ authorization بيتعمل على مستوى الـ operation مش على مستوى الـ URL. ده بيغير كل الـ methodology.
كل ما زادت عدد الـ roles وزادت الـ granularity، زادت فرصتك. لو التطبيق فيه بس Admin وUser — ده بسيط نسبياً. بس لو فيه Admin → Team Lead → Developer → Viewer → Auditor → External — ده 6 levels من الـ permissions، وكل level فيها عشرات الـ mechanisms.
المطور اللي بيبني الـ system ده مش مسؤول بس عن الـ features — هو لازم يتأكد إن كل mechanism بيتاكد من كل role بالظبط. ده بالإضافة للـ deadlines والـ pressure.
الـ Auditor role هو أحسن مثال: مسموحله يقرأ كل حاجة بس مش يعدل أو يحذف. الـ read-only بالنسبة للمطور = permissions كتير + restrictions كتير = كذا فرصة للـ mistake.
مش كل برنامج مناسب لـ Access Control testing. في معايير خاصة مختلفة عن الـ IDOR.
Arson اختار Pantheon لسببين رئيسيين. الأول هو الـ granular roles: Admin، Team Member، Developer، وUnprivileged. الثاني هو إن الـ bounties منخفضة — $0 لـ P3/P4 — وده بالتحديد هو الـ advantage.
الحاجة التانية المهمة: Pantheon منصة collaboration — ده بيعني في concept الـ workspace وفيه multiple users في نفس الـ workspace بـ roles مختلفة. ده بالظبط اللي محتاجه لـ RBAC testing.
لما بتلاقي في الـ program documentation جدول بيشرح إيه اللي كل role يقدر يعمله — ده الـ gift المجاني. إنت بتعرف بالظبط إيه اللي المفروض يتبعت للـ server وإيه اللي المفروض يترفض.
| معيار التقييم | ليه مهم؟ | كيف تتحقق منه؟ | Score |
|---|---|---|---|
| عدد الـ roles (3+) | كل role إضافية = exponential complexity = أكتر bugs | الـ documentation / signup flow / team settings | HIGH |
| Permission table موجود | بيديك الـ blueprint بتاع الـ testing | دور على صفحة pricing أو features comparison | HIGH |
| Workspace/Org concept | بيعني في multi-tenant isolation = بيزيد الـ attack surface | دور على "Create team" أو "Invite members" | CRITICAL |
| Self-registration لكل role | بدونها مش هتقدر تعمل accounts بـ roles مختلفة | حاول تعمل account مع كل role | MUST |
| Low bounty ($0-500) | less competition = أكتر bugs متاحة | شوف الـ rewards table في الـ program | ADVANTAGE |
| Auditor/External role | الـ role ده دايماً complex ومليان edge cases | دور في الـ role settings على "read-only" أو "auditor" | BONUS |
لازم تفهم كل role: إيه اللي تقدر تعمله، وأهم من كده — إيه اللي مش المفروض تعمله.
أول ما تدخل التطبيق وتلاقي جدول الـ roles، إنت بتشوفه زي الـ treasure map. كل "NO" في الجدول ده هو target محتمل لـ Access Control violation.
مش بس تعرف إيه اللي كل role يقدر يعمله — لازم تفهم ليه الـ role ده اتعمل. الـ Developer role مثلاً: الـ developer شغله يكتب الكود مش يعمل deployment. لو تقدر تعمل deployment كـ developer — ده impact كبير لأنك ممكن تعمل deploy لـ backdoor.
| Mechanism | ADMIN | TEAM MEMBER | DEVELOPER | UNPRIVILEGED | TEST PRIORITY |
|---|---|---|---|---|---|
| View Dashboard | ✓ | ✓ | ✓ | ? | MEDIUM |
| Invite Users | ✓ | ✓ | ✗ | ✗ | HIGH |
| Remove Users | ✓ | ✗ | ✗ | ✗ | CRITICAL |
| Change User Role | ✓ | ✗ | ✗ | ✗ | CRITICAL |
| Export Members CSV | ✓ | ✗ | ✗ | ✗ | HIGH |
| Deploy Live | ✓ | ✓ | ✗ | ✗ | CRITICAL |
| Test Live | ✓ | ✓ | ✗ | ✗ | CRITICAL |
| Create Custom Upstream | ✓ | ✗ | ✗ | ✗ | HIGH |
| Delete Site | ✓ | ✗ | ✗ | ✗ | CRITICAL |
| Create Site | ✓ | ✓ | ✓ | ✓ | SKIP |
✦ الصفوف اللي فيها ✗ لـ roles متعددة هي الـ targets. كل ✗ = potential Access Control Violation.
قبل ما تبدأ الـ testing، إنت لازم تفهم التطبيق من الخارج للداخل — زي ما بتقسم العالم لقارات.
الطريقة بتاعت Arson: ابدأ بالـ Environments (= القارات). كل environment هو تطبيق منفصل ليه الـ mechanisms والـ roles بتاعته. في Pantheon، عندنا Personal Workspace وTeam Workspace.
بعدين جوا كل environment، عندنا الـ Mechanisms (= المدن). كل mechanism هو operation ممكن تعمله في الـ application: deploy، delete، export، إلخ.
أهم اكتشاف في الـ Pantheon testing: في الأول ظن إن في بيئتين مختلفتين تماماً. بعد كده اكتشف إنهم نفس الـ application بـ features مختلفة حسب النوع. ده غيّر كل الـ testing approach.
Scope = target domain فقط. افتح كل صفحة واعمل كل action وهمي عشان تملي الـ sitemap.
أي حاجة بتقول "Invite members"، "Create team"، "Manage roles" — ده هو الـ RBAC entry point.
كل section في الـ settings ممكن يحتوي على mechanisms للـ testing. حتى الـ billing وSSH keys.
في الـ docs، الـ pricing page، أو الـ signup flow. ده هو الـ gold — بيديك الـ test plan مجاناً.
في الـ IDOR عندك حسابين. في الـ RBAC عندك حساب لكل role موجودة في التطبيق.
الأول تعمل الـ workspace — إنت أصبحت admin تلقائياً. ده الـ admin account. من هنا بتدعو الـ roles التانية.
استخدم you+admin@hackerone.com، you+teammember@، you+developer@. بدل الأرقام (demo1, demo2) — استخدم اسم الـ role مباشرة. ده بيخليك دايماً عارف إنت شغال بأنهو account.
Admin في normal Firefox. Team Member في Incognito. Developer في Burp's Browser. لو في role رابعة، استخدم Chrome. الـ goal: كل session منفصلة تماماً.
كل account بعد login: افتح Burp → proxy → اعمل أي action → جيب الـ session token من الـ cookies. وثقه في الـ notes مع اسم الـ role بتاعه.
Firefox Incognito windows بتشارك نفس الـ session! الحل: استخدم Burp browser كـ third window — بيعمل session منفصلة تماماً لأنه مستقل عن الـ OS browser.
أصعب حاجة في الـ RBAC testing هو إنك تتأكد دايماً إنك شغال بالـ session الصح. Arson ذكر إنه اتفتح على account غلط أكتر من مرة أثناء الـ recording.
لو بتعمل solo testing: خلي قاعدة ثابتة — دايماً اعمل screenshot للـ URL والـ session في كل browser قبل ما تبدأ أي test. ده بيمنع الـ confusion.
قبل ما تبدأ تهاجم، إنت لازم تعمل inventory كامل لكل mechanism في التطبيق.
الـ Mechanism Inventory هو الفرق بين researcher بيلاقي bugs وراسرcher بيلف. إنت بتعمل map كاملة للتطبيق، وبعدين بتهاجم كل نقطة فيها بالترتيب.
في Pantheon، الـ inventory بدأ من الـ permission table الموجودة في الـ documentation. بعدين Arson اكتشف mechanisms إضافية من خلال الـ testing نفسه — زي الـ change user role والـ export members CSV اللي مش كانوا في الـ original table.
كل mechanism بيتقسم لـ CRUD operations — وكل operation ليها authorization requirement مختلف.
المطور ممكن يتذكر يمنع الـ DELETE لكن ينسى الـ UPDATE. أو يمنع الـ POST لكن ينسى إن الـ PATCH بيعمل نفس الشيء.
بعض الـ servers بيطبق الـ authorization على HTTP method معينة بس. جرب نفس الـ endpoint بـ methods مختلفة.
| Object / Resource | CREATE | READ | UPDATE | DELETE | WHO CAN DO ALL? | RBAC TEST? |
|---|---|---|---|---|---|---|
| Site | ALL roles | ALL roles | Admin+TM | Admin only | ADMIN | YES — DEL |
| Deployment | Admin+TM | ALL roles | Admin+TM | Admin+TM | TEAM MEMBER | YES — ALL |
| Workspace Member | Admin+TM | ALL roles | Admin only | Admin only | ADMIN | CRITICAL |
| Member Role | N/A | ALL roles | Admin only | N/A | ADMIN | CRITICAL |
| Custom Upstream | Admin only | Admin+TM | Admin only | Admin only | ADMIN | YES |
| Member Export | N/A | Admin only | N/A | N/A | ADMIN | YES — EASY |
| Workspace Settings | N/A | ALL roles | Admin only | N/A | ADMIN | MEDIUM |
GraphQL بيغير كل الـ methodology. مفيش endpoints — في operations. والـ authorization بيتعمل على مستوى الـ operation مش الـ URL.
في الـ traditional REST: كل endpoint = URL مختلف. في الـ GraphQL: كل حاجة بتروح لـ /graphql. التطبيق بياخد الـ operation name من الـ body ويحدد إيه اللي هيتعمل.
ده بيعني إن الـ Access Control مش بيتطبق على الـ URL — بيتطبق على الـ operation name. وأحياناً الـ developers بينسوا يضيفوا الـ auth check على بعض الـ operations.
الـ approach في GraphQL: بدل ما تدور على endpoints، بتجمع كل الـ operation names من الـ Burp sitemap (ابحث عن "operationName")، وبتعملهم test بـ sessions مختلفة.
في الـ proxy tab، افتح search، ابعت operationName مع auto-scroll. هيطلعلك كل operation جت من التطبيق.
كل operation مهمة: send to Repeater وسميها باسم الـ operation (مش "Request 1"). ده بيساعدك لما تيجي تعمل test بالـ roles المختلفة.
ابعت {"query": "{ __schema { mutationType { fields { name } } } }"} — ده بيجيبلك كل الـ mutations حتى اللي ما شفتهاش في الـ UI.
Burp Intruder على الـ operationName field بـ wordlist من known GraphQL operations. ممكن تلاقي hidden operations مش موجودة في الـ docs.
قبل ما تبدأ الـ testing، لازم تفهم كيفية الـ role validation. الـ answer في الـ session token.
لازم تجاوب على 3 أسئلة قبل ما تبدأ:
السؤال الأول: إيه اللي بيتاستخدم للـ authentication؟ Session cookie؟ JWT؟ Custom cookie؟
السؤال التاني: كيف الـ server بيعرف الـ role؟ بيجيبها من الـ session في الـ DB؟ موجودة في الـ JWT payload؟ موجودة في custom cookie؟
السؤال التالت: هل ممكن نتلاعب بالـ role؟ لو موجودة في JWT مش validated — ده jackpot. لو في الـ DB — لازم نستخدم الـ session token بتاع كل role.
TYPE IDENTIFICATION
IF JWT — CHECK PAYLOAD
RBAC TESTING APPROACH
بعد ما عملت الـ inventory وفهمت الـ session structure — ابدأ الـ testing بشكل منهجي.
قبل أي حاجة، اتأكد إن الـ operation شغالة مع الـ admin. لو الـ admin بيرجع error — في مشكلة في الـ request نفسه مش في الـ access control. وثّق الـ expected response كـ baseline.
ابدأ بـ Team Member على mechanism المفروض يكون Admin-only. لو رجع 403 — confirmed correct. لو رجع 200 — FOUND IT!
لا تفترض إن لأن Team Member اتبلوك، Developer برضو اتبلوك. اعمل test كل role على كل mechanism منفصل. الـ edge cases هي في اللي بيكون فيه role معين اتنسي.
خد الـ admin request في Repeater. بدّل بس الـ Authorization header / session cookie بـ session بتاع كل role. نفس الـ operation name، نفس الـ variables، بس session مختلف.
في الـ notes: triggerWorkspaceExport: Admin=200, TeamMember=403, Developer=403. لو أي واحد رجع 200 لما المفروض يرجع 403 — ده هو الـ finding.
لو اتبلوكت — جرب: HTTP Method switching، URL path variations، header injection، parameter pollution. الـ server ممكن يبلوك DELETE بس ينسى POST /delete.
لما الـ Access Control العادي (زي تغيير ID) يترفض، لازم تلجأ لتقنيات معقدة بتستغل أخطاء الـ Architecture والـ Frameworks. الـ 4 تقنيات دول هما الـ Core بتاع الـ Advanced Bugs.
في الـ Frameworks الحديثة (زي Spring, Laravel, Rails)، الـ Developer بياخد الـ JSON Object كله من الـ Request وبيرميه مباشرة في الداتابيز أو في الـ Model Object (حاجة اسمها Auto-Binding أو Mass Assignment). دي كارثة لو مفيش Allowlist!
عشان تنجح في الـ Mass Assignment، لازم تعرف اسم الـ Parameter الحساس (role, is_admin, permission_level). بتجيبه إزاي؟
الـ Authorization Middlewares أحياناً بتتبرمج بطريقة غبية. المبرمج بيقول: "امنع أي يوزر عادي إنه يعمل POST على المسار ده". طب ماذا لو اليوزر العادي بعت PUT أو PATCH؟
في بعض الـ Custom Routers أو سيرفرات الـ Java القديمة، لو غيرت הـ HTTP Verb، الـ Middleware Security Rule مش بتعمل Match، بس الـ Backend Controller بينفذ الطلب عادي!
في عصر الـ React والـ Next.js، الـ Frontend بياخد بيانات الجلسة ويخزنها في الـ Browser عشان يحدد إيه اللي يترسم على الشاشة. المشكلة بتحصل لما الـ Backend يثق في اللي الـ Frontend بيبعتهوله!
افتح الـ DevTools (F12) → Application → LocalStorage. هتلاقي حاجات زي {"userRole": "guest"}. غيرها بإيدك لـ admin واعمل Refresh.
لو الـ UI رسم زراير الأدمن (زي Delete User)، والـ Backend نفذ الطلب لما ضغطت عليها بدون ما يتحقق من الداتابيز... دي ثغرة قاتلة!
أحياناً الـ Role بيكون محطوط في Cookie مش متفرمة (بدون Signature)، أو JWT السيرفر مش بيتحقق من الـ Signature بتاعته.
فك الـ JWT بـ Base64، غير الـ Role، ارفعه تاني، وابعت الريكويست. لو السيرفر اعتمد على הـ Role اللي في الـ Token ومسألش الداتابيز، إنت بقيت Admin.
الـ GraphQL ليه أسلحة دمار شامل لتخطي الـ WAF والـ Static Middlewares اللي بتدور على كلمات معينة في الريكويست.
في الـ RBAC، الـ impact مش دايماً واضح. إنت لازم تحكي قصة — إيه اللي يقدر يحصل لو استغل attacker الـ bug ده.
لما لاقيت إن Developer قدر يعمل deploy — مش بس "Developer accessed restricted function". القصة هي: Developer كتب backdoor code، عمله deploy بنفسه، والـ company ما عرفتش.
لما لاقيت إن Team Member يقدر يعمل export users CSV — القصة هي: Team Member اللي اتفصل من الشركة أخد كل بيانات الـ customers قبل ما يمشي.
| الـ Violation | الـ Impact Level | السيناريو الحقيقي | الـ Compliance Factor |
|---|---|---|---|
| Developer → Deploy Live | CRITICAL | Rogue developer deploys backdoor, ransomware, defacement. No peer review bypass. | SOC2, ISO27001 — change management violation |
| Team Member → Change User Role | CRITICAL | Escalate own role to Admin → full workspace takeover. Demote Admin → lockout. | Privileged access management controls |
| Team Member → Export Users CSV | HIGH | Disgruntled employee leaving the company takes full member list with roles + emails. | GDPR — personal data export, data minimization |
| Developer → Create Upstream | HIGH | Custom upstream = data routing. Developer routes production traffic to malicious endpoint. | Data integrity, supply chain security |
| Any Role → Admin Dashboard | MEDIUM | Information disclosure — billing, user list, workspace config exposed. | Data classification policy violation |
Developer role can access triggerDeployLive GraphQL mutation which should be restricted to Team Member role and above.
الـ exact request مع session token بتاع Developer role والـ response اللي جاب 200 OK.
A developer with malicious intent can deploy arbitrary code to production without peer review, enabling backdoor installation or service disruption.
Add role check in deployment mutation resolver: IF current_user.role NOT IN [admin, team_member] → return 403.
الـ concept الأهم في الـ RBAC testing. إنت مش بتهاجم — إنت بتفهم، وبعدين بتهاجم.
Arson وضح إن الـ recording بتاعت الـ part 2 اخدت 3 أيام. مش عشان التطبيق كان صعب — عشان الـ testing من النوع ده بيحتاج وقت تفكير حقيقي.
لاحظت في الـ recording إنه وقف كتير، راح يجيب قهوة، بعيد عن الشاشة، رجع بفكرة جديدة. الـ process الحقيقي للـ RBAC testing مش بس في الـ keyboard — هو في الـ head.
الـ RBAC testing مش fun زي الـ exploitation. بس هو الـ most rewarding لأن الـ bugs دي نادراً بتتلاقى بالـ automation وكتير من الـ researchers بيتجنبوها.
كلّك فضول. افتح كل صفحة، اقرأ الـ docs، افهم الـ business logic. مفيش testing هنا.
وثق كل حاجة. Role map، mechanism inventory، session structure. Notes أولاً دايماً.
بس بعد الـ A وB — الـ testing نفسه بيكون سريع ومنظم لأن عارف بالظبط إيه اللي بتدور عليه.
من لحظة ما تفتح البرنامج لحد ما تكتب الـ report.
PHASE 1 — PROGRAM QUALIFICATION
PHASE 2 — ENVIRONMENT MAPPING
PHASE 3 — ROLE MAPPING
PHASE 4 — TECHNOLOGY DETECTION
PHASE 5 — SESSION ANALYSIS
PHASE 6 — TESTING
| Bug Type | How to Find | Expected Severity | Best Target |
|---|---|---|---|
| Vertical Privilege Escalation | Lower role → Admin-only function → 200 OK | CRITICAL | Any admin-only destructive/config operation |
| Function-level RBAC bypass | Read-only role → write/delete operation → 200 | HIGH-CRITICAL | Export, deploy, delete endpoints |
| Horizontal Access Violation | User A → User B's data/operations → 200 | HIGH | Multi-tenant SaaS workspace isolation |
| Unauthenticated Access | Remove auth header → authenticated endpoint → 200 | HIGH | Any endpoint found after login |
| JWT Role Manipulation | Role in JWT → not validated → change to admin | CRITICAL | Any JWT with role/permissions claim |
| GraphQL Op-level bypass | Mutation for admin-only op → non-admin session → 200 | CRITICAL | Export, delete, configure mutations |
| Client-side only enforcement | Button hidden in UI but API accepts request | HIGH | Features that "disappear" for lower roles |
5 أسئلة عن decision-making حقيقي — مش عن تعريفات.