
إثبات مفهوم ومختبر لثغرة Gitea IDOR (CWE-639) في GET /api/v1/user/keys/{id}، تتيح لرمز read:user الموثّق تعداد مفاتيح SSH ومفاتيح النشر الخاصة بمستخدمين آخرين.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-user-keys-idor
Gitea 1.27.3 - Gitea
GET /api/v1/user/keys/{id} يقع في مجموعة المستخدم الحالي (reqToken، rejectPublicOnly). لا يزال المعالج يحمّل السجل بواسطة المعرّف الرقمي دون أي تحقق من المالك. الجدول نفسه يحتوي على مفاتيح المستخدمين، ومفاتيح النشر، والهويات. نظير GPG يفعلها بشكل صحيح: GetGPGKeyForUserByID(ctx, ctx.Doer.ID, id). الحقول الخاصة محمية. أما مادة المفتاح العام، والعنوان، والبصمة فليست كذلك. المعرّفات متسلسلة.
رمز read:user يتنقل عبر 1، 2، 3 ويحصي مفاتيح SSH ومفاتيح النشر الخاصة بالآخرين. التسجيل المفتوح يجعل من ذلك ثغرة حساب جديد.
| ID | لا يوجد CVE بعد |
| CWE | CWE-639 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Product | Gitea |
| Affected | حتى v1.27.3 (146cc3e) |
| Auth | مصادَق عليه (رمز read:user) |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 فقط |
التسجيل (التسجيل المفتوح افتراضيًا)، وإنشاء رمز read:user، والتنقل عبر /api/v1/user/keys/{id}. يحصلون على العناوين، والبصمات، ومادة المفتاح العام لمفاتيح لا يملكونها، بما في ذلك مفاتيح النشر. لا يحصلون على المفتاح الخاص. لا يحصلون على shell. يحصون من لديه صلاحية الوصول إلى ماذا.
كانت ثغرة GHSA الخاصة بالمفاتيح في 1.27.3 عبارة عن قائمة محددة بنطاق اسم المستخدم بالإضافة إلى individualPermsChecker. لم يكن هذا هو هذا الاستعلام.
من نفس الإصدار: git HTTP redirect SSRF.
أغلق الإصدار v1.27.3 موجة GHSA لعام 2026. جلست على ذلك الإصدار على أي حال وقرأت معالج مفاتيح المستخدم الحالي بجانب GPG. GPG يعيد 404 لمعرّف غريب. SSH لا يفعل ذلك.
seed.sh يزرع عنوان مفتاح الضحية GHSA-GITEA-KEY-IDOR-WITNESS ومفتاح مهاجم. قائمة المهاجم الخاصة لا تحتوي على الشاهد. GET /user/keys/1 بصفت المهاجم تحتوي عليه. GPG مع معرّف غريب يعيد 404. هذه هي الحجة كاملة.
المنعطفات الخاطئة مسجلة بالفعل: اعتبار قائمة المهاجم الخاصة هي التسريب (ليست كذلك - القائمة محددة النطاق، أما GET-by-id فليس كذلك)؛ reverse shell. مسرحية.
أخطاء العميل تبدو كأخطاء المنتج. مساعد يحجب http.client لا يرسل أي حزمة أبدًا. .recv() على HTTPResponse ليس .read(). أذكر ذلك مرة واحدة لأنه كلف وقتًا وبدا، لدقيقة، وكأن 1.27.3 قد أنهى المهمة.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18101.
add-key user=victim status=201 title=GHSA-GITEA-KEY-IDOR-WITNESS id=1
add-key user=attacker status=201 id=2
attacker-list status=200 ids=[2] (no witness)
get id=1 status=200 snippet contains GHSA-GITEA-KEY-IDOR-WITNESS
SUCCESS Gitea #1 user/keys IDOR
404 إلا إذا كان key.OwnerID == ctx.Doer.ID (أو مسؤول الموقع). ارفض أنواع deploy/principal. طابق GPG.
GetPublicKeyGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.