
अपने समकक्षों की तुलना में कमज़ोर प्राधिकरण वाले API रूट्स का पता लगाता है। स्रोत से CVE-2026-45316 को पुनर्प्राप्त किया गया। नकारात्मक परिणामों को शामिल करता है।
उन API रूट्स को खोजता है जो अपने सिबलिंग रूट्स की तुलना में कमज़ोर प्राधिकरण नियंत्रण रखते हैं।
इसने Open WebUI में CVE-2026-45316 को केवल सोर्स कोड से खोजा, बिना किसी एडवाइज़री जानकारी के:
[MISMATCH] POST /notes/{id}/pin (notes.py:pin_note_by_id)
3/3 comparable write operations on note require has_access(write);
this route requires only has_access(read)
POST /notes/{id}/update has_access(write)
POST /notes/{id}/access/update has_access(write)
DELETE /notes/{id}/delete has_access(write)
पाँच प्रोडक्शन कोडबेस में 2,568 रूट्स पर इसने 4 निष्कर्ष दिए। दो वास्तविक थे। यह README दोनों संख्याओं की व्याख्या करता है।
प्राधिकरण बगों का एक बड़ा वर्ग कोई टूटा हुआ चेक नहीं है। यह एक अनुपस्थित या कमज़ोर किया गया चेक है, ऐसे रूट पर जिसके सभी सिबलिंग्स ने सही चेक लगाया था।
Portainer ने चार सिबलिंग टेम्पलेट एंडपॉइंट्स को अधिकृत किया और पाँचवें को नहीं। Signal K ने HTTP लॉगिन को रेट-लिमिट किया लेकिन WebSocket लॉगिन को नहीं। Open WebUI का नोट-पिन रूट रीड अनुमति जाँचते हुए नोट को म्यूटेट करता था, जबकि बाकी हर नोट म्यूटेशन राइट जाँचता था।
हमेशा एक जैसा आकार:
✓ ✓ ✓ ✓ ✗
रिपॉज़िटरी में पहले से ही नियम मौजूद है। एक रूट ने उसे तोड़ा। इसलिए नियम को कोड से पुनर्निर्मित करें और अपवाद की रिपोर्ट करें। कोई पॉलिसी फ़ाइल नहीं, कोई कॉन्फ़िग नहीं, कोई एनोटेशन नहीं। प्रमाण-सेट स्वयं सिबलिंग रूट्स हैं।
python3 enforcement_coverage.py /path/to/repo
python3 enforcement_coverage.py /path/to/repo --density
python3 enforcement_coverage.py /path/to/repo --json
Python 3.10+, कोई निर्भरता नहीं। केवल FastAPI।
निर्णय हैं MISSING, MISMATCH, PRESERVED, UNKNOWN। UNKNOWN मतदान से बचता है
और कभी रिपोर्ट नहीं किया जाता।
निष्कर्षण (Extraction)। सिग्नेचर Depends(), डेकोरेटर
dependencies=[], राउटर-स्तरीय डिपेंडेंसी, फ़ंक्शन बॉडीज़, रैपर
फ़ंक्शन, और अनुमति-क्लास सूचियों से नियंत्रणों को हल करता है।
बॉडी निष्कर्षण आवश्यक है। Open WebUI में, 608 हैंडलरों में से 216 निर्णायक चेक फ़ंक्शन के अंदर रखते हैं:
if user.role != 'admin' and not await AccessGrants.has_access(
user_id=user.id, resource_type='note',
resource_id=note.id, permission='write', db=db,
):
raise HTTPException(status_code=403)
ऑपरेशन क्लास HTTP वर्ब से नहीं, बल्कि हैंडलर द्वारा रिसोर्स पर किए गए कार्य से
आती है। POST /notes/{id}/chat एक POST है जो नोट को पढ़ता है।
शब्दावली वर्गीकरण (Vocabulary classification)। एक नियंत्रण परिवार में दो मान आवश्यक रूप से एक शक्ति-पैमाना नहीं बनाते:
has_access {read, write} LEVEL
ensure_flow_permission {create,delete,execute,read,write} ACTION
has_permission {features.notes, workspace.tools} SCOPE
केवल LEVEL शब्दावली शक्ति तुलना का समर्थन करती है।
FlowAction.CREATE की तुलना एक प्रभावी WRITE से करने पर Langflow में
छह ग़लत सकारात्मक परिणाम (false positives) मिले, इससे पहले कि इसे ठीक किया गया।
दिशा फ़िल्टर। केवल कम प्रतिबंधात्मक नियंत्रण की ओर विचलन ही रिपोर्ट किए जाते हैं। पूर्वनिर्धारित से अधिक सख्त होना कोई भेद्यता नहीं है।
दो वास्तविक सकारात्मक परिणाम (true positives)।
Open WebUI में POST /notes/{id}/pin — CVE-2026-45316।
एक और निष्कर्ष Netflix Dispatch में एक अनुमति असममिति है:
POST /{incident_id}/resources IncidentViewPermission का उपयोग करता है जबकि छह
सिबलिंग राइट ऑपरेशन IncidentEditPermission का उपयोग करते हैं।
IncidentViewPermission किसी भी गैर-प्रतिबंधित घटना के लिए True लौटाता है;
IncidentEditPermission के लिए admin, commander, या reporter होना आवश्यक है। यह
हैंडलर बिना किसी और जाँच के टिकट और समूह निर्माण को कतारबद्ध करता है।
रिपोर्ट नहीं किया गया, क्योंकि रिपोर्ट करने के लिए कोई जगह नहीं है: रिपॉज़िटरी को Netflix द्वारा 3 सितंबर 2025 को संग्रहीत (archived) कर दिया गया था और यह केवल-पठनीय है, इसमें कोई SECURITY.md नहीं है, संग्रहीत रेपो के लिए निजी भेद्यता रिपोर्टिंग अक्षम है, और Dispatch को Netflix के बाउंटी प्रोग्राम में स्पष्ट रूप से दायरे से बाहर सूचीबद्ध किया गया है। इसे यहाँ प्रकाशित करना ही एकमात्र शेष प्रकटीकरण चैनल है। यह निम्न गंभीरता का है — इसके लिए एक प्रमाणित संगठन सदस्य की आवश्यकता होती है और यह केवल गैर-प्रतिबंधित घटनाओं को प्रभावित करता है — और परियोजना अब अनुरक्षित नहीं है।
दो ग़लत सकारात्मक परिणाम (false positives)। POST /tools/{id}/valves/user/update उपयोगकर्ता की अपनी
वाल्व सेटिंग्स लिखता है और उसे वैध रूप से टूल पर केवल रीड की आवश्यकता होती है —
म्यूटेशन लक्ष्य प्राधिकरण विषय से भिन्न इकाई है। और एक
Langflow नॉलेज-बेस रूट जहाँ सिबलिंग गार्ड आवश्यक नहीं है।
यह उपयोगी हिस्सा है।
Danswer में 95.9% नियंत्रण कवरेज है और 80.7% UNKNOWN के साथ शून्य निष्कर्ष मिले।
इसकी शब्दावली require_permission('basic_access'),
('manage_connectors') है — एक क्षमता नेमस्पेस, न कि शक्ति-पैमाना।
आप यह नहीं कह सकते कि manage_connectors, read_connectors से कमज़ोर है।
निष्कर्षों की भविष्यवाणी करने वाली चीज़ है एक रिसोर्स-स्कोप्ड अनुमति कॉल जिसमें क्रमबद्ध
शक्ति तर्क हो, जैसे has_access(resource, read|write)। पाँच में से एक कोडबेस में यह था।
पाँच रिपॉज़िटरीज़ में पाँच अलग-अलग idiomatic शैलियाँ। प्रत्येक को विश्लेषण चलने से पहले एक्सट्रैक्टर कार्य की आवश्यकता थी।
किसी भी रिपॉज़िटरी में, किसी भी कॉन्फ़िगरेशन के तहत। अधिकांश रूट्स तीन या अधिक के सिबलिंग परिवार से संबंधित नहीं होते जिनमें एक समान नियंत्रण हो।
इनमें से कोई भी पहले से अनुमानित नहीं थी।
Depends() मेंखामी 13 सबसे दिलचस्प है। Dispatch के टैग-अनुशंसा रूट्स में वह
CaseViewPermission नहीं है जो उनके सिबलिंग्स रखते हैं। लेकिन वह अनुमति किसी भी
गैर-प्रतिबंधित केस के लिए True लौटती है, और सेवा पहले से ही इनलाइन
visibility == restricted जाँचता है। दोनों रास्ते समतुल्य हैं। उसे पहचानने के लिए
शब्दार्थ समतुल्यता विश्लेषण चाहिए, न कि संरचना।
तंत्र काम करता है। इसने एक प्रकाशित CVE और एक अरिपोर्टेड प्राधिकरण अंतराल को सोर्स से, सत्यापन योग्य प्रमाण-सेटों के साथ, केवल उन्हीं सूचनाओं का उपयोग करके पुनर्प्राप्त किया जो संवेदनशील कमिट के विलय से पहले उपलब्ध थीं।
उपज लगभग 1,000 रूट्स पर एक निष्कर्ष है, और इसके लिए एक ऐसी वास्तुकला चाहिए जो पाँच महत्वपूर्ण कोडबेसों में से एक के पास थी।
रिसोर्स-स्कोप्ड अनुमति शब्दावली वाले कोडबेस के लिए ऑडिट टूल के रूप में उपयोगी। इस साक्ष्य पर, एक सामान्य-उद्देश्यीय स्कैनर के रूप में नहीं।
अंतर्निहित धारणाओं का अनुमान लगाकर पहुँच-नियंत्रण भेद्यताओं का स्थिर पता लगाना USENIX Security 2011 तक जाता है। ACMiner ने Android मिडलवेयर में प्राधिकरण जाँचों का खनन किया। Semgrep लुप्त प्राधिकरण को लक्षित करने वाली AI-संचालित पहचान भेजता है और एक ग्राहक मूल्यांकन में 61% परिशुद्धता की सूचना दी। OWASP एक Authorization Regression Testing चीट शीट प्रकाशित करता है जिसका अनुशंसित दृष्टिकोण Actor × Resource × Action मैट्रिक्स को हाथ से बनाए रखना है।
यह एक संकीर्ण, नियतात्मक दृष्टिकोण है: केवल वही पुनर्प्राप्त करें जो सिबलिंग रूट्स सिद्ध करते हैं, अन्यथा मतदान से बचें।
MIT लाइसेंस।
| repo | routes | controlled | findings |
|---|
| LiteLLM | 808 | 87.1% | 0 |
| Danswer / Onyx | 653 | 95.9% | 0 |
| Open WebUI | 529 | 97.2% | 2 |
| Netflix Dispatch | 291 | 36.1% | 1 |
| Langflow | 287 | 47.4% | 1 |
| repo | idiom |
|---|
| Open WebUI | AccessGrants.has_access(resource_type=, permission=) |
| Langflow | ensure_<resource>_permission(user, Action.X) |
| LiteLLM | role compare on user_api_key_dict.user_role |
| Netflix Dispatch | Depends(PermissionsDependency([CaseEditPermission])) |
| Danswer | require_permission('basic_access') |