
अपनी attack surface के दृश्यों का क्रॉस-चेक करें और वे endpoints खोजें जो एक-दूसरे की पुष्टि नहीं कर सकते।
अपने अटैक सरफेस के दृश्यों का क्रॉस-चेक करें और वे एंडपॉइंट्स खोजें जो एक-दूसरे की पुष्टि नहीं कर सकते।
एक एंडपॉइंट को अपना हिसाब दे पाना चाहिए। यह कोड में है, तो एक कॉन्ट्रैक्ट को इसका वर्णन करना चाहिए। यह कॉन्ट्रैक्ट में है, तो किसी चीज़ को इसे इम्प्लीमेंट करना चाहिए। यह असली ट्रैफ़िक लेता है, तो बेहतर होगा कि यह कहीं मौजूद हो। जब एक दृश्य किसी एंडपॉइंट के बारे में जानता है और बाकी नहीं, तो वही अंतर ही निष्कर्ष है।
alibi OWASP noir चलाता है, उसका JSON पढ़ता है, और दृश्यों की एक-दूसरे से तुलना करता है।
Noir पहले से ही एक ही सरफेस के पाँच स्वतंत्र दृश्य पढ़ता है:
| दृश्य | कहाँ से पढ़ा जाता है |
|---|---|
| code | 33 भाषाओं में 200 से अधिक एनालाइज़र |
| doc | OpenAPI, RAML, WSDL, GraphQL SDL, AsyncAPI, gRPC, Smithy, TypeSpec, OData, OpenRPC |
| traffic | HAR, mitmproxy, Burp, Caido, ZAP, Postman, Insomnia, Bruno, .http |
| gateway | nginx, Apache, Envoy, Kong, Traefik, APISIX, Caddy, Istio, Kubernetes Ingress और Gateway API |
| infra | Terraform, CloudFormation, CDK, Serverless, Vercel, Netlify, Wrangler, Azure Functions, Kamal |
जो यह नहीं करता, वह है उनकी तुलना करना। यही पूरा काम यहाँ है, और इसके लिए noir में कोई बदलाव नहीं चाहिए — alibi इसे प्रति दृश्य एक बार चलाता है और परिणामों को जोड़ता है।
प्रति-दृश्य वाला हिस्सा मायने रखता है। Noir हर एनालाइज़र में (method, url) के आधार पर डीडुप्लिकेट करता है, इसलिए एक Flask रूट और एक OpenAPI पाथ जो एक जैसे लिखे गए हैं, एक ही एंडपॉइंट में समा जाते हैं जो एक ही टेक्नोलॉजी लिए होते हैं। यह एक डिस्कवरी टूल के लिए सही है — यह एक एंडपॉइंट है — लेकिन यह उस पुष्टि को मिटा देता है जिसे मापने के लिए यह टूल बना है, और इसे सबसे बुरी दिशा में मिटाता है: दो दृश्य जितना बेहतर सहमत होते हैं, उतने ही अधिक गायब हो जाते हैं। Casdoor 372 कोड एंडपॉइंट्स और 9 डॉक्यूमेंटेड के रूप में स्कैन होता है; अकेले इसकी swagger/ डायरेक्टरी स्कैन करें तो स्पेसिफिकेशन में 235 हैं।
--only-techs डिटेक्टर पूल को सीमित करता है, इसलिए प्रति दृश्य एक स्कैन हर एक को पूरा रखता है। कौन सी टेक्नोलॉजी किस दृश्य के लिए बोलती है, यह views.yml है; कौन सी टेक्नोलॉजी मौजूद हैं, यह वही है जो noir list techs रिपोर्ट करता है।
alibi अपने आप किसी API फ़ॉर्मेट को पार्स नहीं करता। इसका एकमात्र इनपुट noir का JSON है।
PATH पर noir 1.0.0 या नया चाहिए -- यही वह रिलीज़ है जिसमें noir list techs एक सबकमांड बना, और वही कैटलॉग हर टेक्नोलॉजी को एक दृश्य को सौंपता है। डेवलपमेंट मौजूदा noir रिलीज़ को ट्रैक करता है। पुराने बाइनरी को नाम लेकर अस्वीकार कर दिया जाता है, बजाय इसके कि उसे उसके पहले कैटलॉग रीड पर फेल होने के लिए छोड़ दिया जाए।
$ uv tool install noir-alibi # or: pipx install noir-alibi
$ alibi scan ./my-service
$ alibi scan # the working directory
$ alibi scan ./service ./contracts ./prod.har # or wherever the views live
हर पाथ एक स्रोत है, जिसे प्रति दृश्य एक बार स्कैन किया जाता है। इसे जो भी आपके पास है उस पर इंगित करें — एक सोर्स ट्री, एक स्पेक डायरेक्टरी, एक अकेली कैप्चर फ़ाइल — और जो दृश्य आपके पास नहीं हैं वे रिपोर्ट को भरने के बजाय अपने नियम बंद कर देते हैं।
alibi · 1 source · 377 endpoints
code 372 doc 235
230 corroborated -- vouched for by more than one view
19 endpoints nearly matched another view -- these may be matching failures, not real gaps
SHADOW Shadow API -- Implemented, but no contract describes it
134 findings · 4 critical, 57 high, 62 medium, 11 low
critical POST /api/upload-groups router.go:87
upload paths carry more consequence than reads
critical POST /api/upload-permissions router.go:208
...
... and 122 more (SHADOW in full: -f json)
TWO SURFACES?
The doc view is 97% under /api, and 37 of these findings are outside it.
If that is a separate surface the contract never covered, narrow the scan:
alibi scan <paths> --ignore '^/(?!api(/|$))'
If it is the same surface left undocumented, they are the findings that matter most.
समूह बारह पर रुक जाते हैं — क्रम सबसे बुरे से पहले वाला है, इसलिए पूँछ सबसे कम जानकारीपूर्ण हिस्सा है, और -f json में यह पूरा होता है।
noir के लिए फ़्लैग एक खाली -- के बाद या --noir-arg के ज़रिए दिए जाते हैं। --exclude-path जैसे फ़िल्टर ठीक हैं; जो फ़्लैग JSON कॉन्ट्रैक्ट को बदल देंगे या alibi के प्रति-दृश्य स्कैन को समेट देंगे (--format, --diff-*, --only-techs, …) उन्हें exit status 2 के साथ अस्वीकार कर दिया जाता है।
- run: alibi scan . ./contracts -f sarif > alibi.sarif
- uses: github/codeql-action/upload-sarif@v3
with: { sarif_file: alibi.sarif }
रिपोर्ट कहती है कि दृश्य असहमत हैं; --endpoints कहता है कि उनमें से हर एक में क्या था।
$ alibi scan ./repo -f json --endpoints
हर दृश्य को एक सूची मिलती है: कुंजी, किन दृश्यों ने इसकी पुष्टि की, इसके पीछे की टेक्नोलॉजी, फ़ाइलें, और नॉर्मलाइज़ेशन से पहले की स्पेलिंग — जहाँ भी दो पंक्तियों को मेल खाना चाहिए था और नहीं खाया, अंतर हमेशा वहीं होता है। यह बाकी पेलोड का तीन से चार गुना है, इसलिए यह डिफ़ॉल्ट के बजाय एक फ़्लैग है।
या सीधे गेट करें: alibi scan . ./contracts --fail-on high उस गंभीरता तक पहुँचने वाले निष्कर्ष पर non-zero के साथ बाहर निकलता है। जिस स्कैन को noir पूरी तरह नहीं पढ़ सका वह executionSuccessful: false रिपोर्ट करता है, इसलिए एक अपक्षयित रन साफ़ रन के रूप में पास नहीं होता।
Noir एक सामान्य सिंटैक्स गढ़ने के बजाय हर फ़्रेमवर्क का अपना रूट सिंटैक्स रखता है, इसलिए एक ही एंडपॉइंट कई तरह से लिखा हुआ आता है:
python_flask /api/users/<int:user_id>
aiohttp /users/{id}
java_spring /api/catalog/{id}
oas3 /v1/pets/{petId}
rails /posts/:id
nginx /admin/.*
जो नियम इन्हें तुलनीय बनाता है: किसी पाथ पैरामीटर का नाम उसकी पहचान का हिस्सा नहीं है। {petId} और <int:user_id> एक ही स्लॉट का वर्णन करते हैं; केवल उसकी स्थिति और यह कि वह किसी / तक फैलता है या नहीं, मायने रखता है। नाम साक्ष्य के रूप में रखे और रिपोर्ट किए जाते हैं, लेकिन कुंजी तक कभी नहीं पहुँचते।
निष्कर्ष बताते हैं कि मैच कैसे बना:
| ग्रेड | अर्थ |
|---|---|
G1 | स्पेलिंग पहले से ही सहमत थीं |
G2 | पैरामीटर सिंटैक्स नॉर्मलाइज़ होने पर वे सहमत होते हैं |
G0 | केवल एक दृश्य में है — कुछ भी मैच नहीं हुआ |
ऐसा टूल अपने पहले रन में सैकड़ों निष्कर्ष रिपोर्ट करके मर जाता है, या ऐसी प्रगति रिपोर्ट करके जो किसी ने की ही नहीं। छह चीज़ें इसका विरोध करती हैं:
दोनों दृश्यों के बिना नियम नहीं चलते। कहीं भी कॉन्ट्रैक्ट के बिना एक कोडबेस स्कैन करें तो हर एंडपॉइंट तकनीकी रूप से एक अनडॉक्यूमेंटेड शैडो API के योग्य हो जाता है। वे निष्कर्ष इसके अलावा कुछ नहीं कहते कि आपने कोई डॉक्यूमेंटेशन दिया ही नहीं, इसलिए कोई नियम तभी चलता है जब वह हर दृश्य जिसके बारे में वह तर्क करता है, वास्तव में स्कैन में था। रिपोर्ट उन नियमों के नाम बताती है जो बाहर बैठे।
नियर मिस को निष्कर्ष के रूप में नहीं, संदेह के रूप में रिपोर्ट किया जाता है। "कोड में है, डॉक्स में नहीं" और "दोनों में है, लेकिन alibi उन्हें मिला नहीं पाया" में कोई अंतर नहीं किया जा सकता। इसलिए जो एंडपॉइंट एक दृश्य में पड़ता है, उसे नियर मिस के लिए बाकी दृश्यों के विरुद्ध जाँचा जाता है — एक ही पाथ एक अलग वर्ब के साथ, या एक सेगमेंट का अंतर जहाँ एक तरफ़ पैरामीटर है और दूसरी तरफ़ लिटरल। नियर मिस वाले निष्कर्ष डिमोट किए जाते हैं और समीक्षा के लिए फ़्लैग किए जाते हैं। वह गिनती कुल के बगल में बैठती है, क्योंकि हर निष्कर्ष उतना ही भरोसेमंद है जितना वह छोटा है।