
PoC: Shiori JWT CheckToken खाते की स्थिति का पुनः सत्यापन कभी नहीं करता (CVE-2026-71206, उच्च 8.2)
उत्पाद: go-shiori/shiori
फ़ाइल: internal/domains/auth.go
CWE: CWE-613 — Insufficient Session Expiration
CVSS 3.1: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L — 8.2 (High)
CNA: Turan Security · CVE रिकॉर्ड
Shiori का CheckToken फ़ंक्शन (internal/domains/auth.go) केवल JWT के HMAC हस्ताक्षर को सत्यापित करता है और एम्बेडेड claims.Account ऑब्जेक्ट को अपरिवर्तित लौटाता है — यह प्रत्येक अनुरोध पर डेटाबेस से खाते को पुनः प्राप्त नहीं करता। कोडबेस में कहीं भी कोई सेशन स्टोर या टोकन-रद्दीकरण तंत्र मौजूद नहीं है।
एक बार JWT जारी हो जाने के बाद, यह अपने पूरे जीवनकाल के लिए पूर्ण रूप से मान्य रहता है, चाहे उसके बाद खाते के साथ कुछ भी हो। यदि कोई एडमिन किसी उपयोगकर्ता को हटा देता है, उन्हें पदावनत कर देता है, या संदिग्ध समझौते के बाद उपयोगकर्ता का पासवर्ड बदल दिया जाता है, तो उस खाते को पहले जारी किया गया कोई भी JWT परिवर्तन के बाद भी टोकन में अंतर्निहित मूल दावों (claims) (भूमिका, खाता ID, आदि) के साथ सफलतापूर्वक प्रमाणित होता रहता है — इसे अमान्य करने के लिए कोई सर्वर-साइड स्थिति नहीं होती।
POST /api/v1/auth/login के माध्यम से)।GET /api/bookmarks
Authorization: Bearer <original JWT>
CheckToken वर्तमान DB स्थिति की जाँच कभी नहीं करता, केवल हस्ताक्षर की।CheckToken JWT पेलोड को खाते की स्थिति के लिए सत्य का स्रोत मानता है, इसे एक बियरर क्रेडेंशियल के रूप में मानने के बजाय जिसे प्रत्येक उपयोग पर डेटाबेस के विरुद्ध पुनः सत्यापित किया जाना चाहिए (या किसी रद्दीकरण सूची के विरुद्ध जाँचा जाना चाहिए)।
एम्बेडेड दावों पर अक्षरशः भरोसा करने के बजाय, प्रत्येक प्रमाणित अनुरोध पर खाते को ID द्वारा पुनः प्राप्त करें (या न्यूनतम रूप से किसी रद्दीकरण/सेशन स्टोर के विरुद्ध जाँच करें जो टोकन ID (jti) पर आधारित हो और जिसे खाता हटाने, पदावनति या पासवर्ड परिवर्तन पर अमान्य किया जाए)।