समस्या और दायरा
यह प्लेटफ़ॉर्म लाखों रिपॉजिटरीज़ को सेवा प्रदान करता है। एक रिपॉजिटरी एक lockfile, इमेज मैनिफ़ेस्ट, या SBOM सबमिट कर सकती है जबकि वल्नरेबिलिटी फ़ीड्स रिकॉर्ड्स को जोड़ती हैं, संशोधित करती हैं, या वापस लेती हैं। इनजेशन, वर्ज़न मैचिंग, अलर्ट लाइफ़साइकिल, नोटिफ़िकेशन्स, और रेमेडिएशन वेरिफिकेशन डिज़ाइन करें। npm, PyPI, और Maven को सपोर्ट करें; कोड स्कैनिंग, ऑटोमैटिक पैच मर्जिंग, और मैनुअल वल्नरेबिलिटी रिसर्च दायरे से बाहर हैं।
इंटरव्यूअर क्या मूल्यांकन कर रहा है
"एक डिपेंडेंसी वर्ज़न का वल्नरेबिलिटी से मैच होना" और "एक अलर्ट की लाइफ़साइकिल होना" को अलग करना। इकोसिस्टम-अवेयर वर्ज़न्स, डायरेक्ट बनाम ट्रांज़िटिव डिपेंडेंसीज़, फ़ीड रिवीज़न्स, विदड्रॉअल्स, डिडुप्लिकेशन, रीप्ले करने योग्य कार्य, नोटिफ़िकेशन आइडेम्पोटेंसी, और टेनेंट ऑथराइजेशन महत्वपूर्ण सिग्नल्स हैं। एक स्कैन परिणाम एक स्नैपशॉट के लिए एविडेंस है, स्थायी सत्य नहीं।
स्पष्टीकरण के लिए प्रश्न
- क्या प्रत्येक मैनिफ़ेस्ट सटीक वर्ज़न्स पर लॉक्ड है या रेंज्स की अनुमति है? क्या मैचिंग को रिज़ॉल्व्ड वर्ज़न्स का उपयोग करना चाहिए या डिक्लेरेशन्स का?
- क्या ट्रांज़िटिव, डेवलपमेंट, कंटेनर-लेयर, और प्राइवेट पैकेज दायरे में हैं?
- क्या कोई फ़ीड किसी गंभीरता (severity) को वापस ले सकती है, उपनाम (alias) दे सकती है, या संशोधित कर सकती है, और कौन सा ऐतिहासिक स्नैपशॉट बनाए रखा जाता है?
- क्या अलर्ट्स ब्रांच-स्कोप वाले हैं, और ब्रांच डिलीट होने पर क्या होता है?
- किन चैनल्स, कूलडाउन और ऑर्गनाइज़ेशन-लेवल स्नूज़ की आवश्यकता है?
30-सेकंड का उत्तर ढांचा
"मैं एक इम्यूटिएबल मैनिफ़ेस्ट स्नैपशॉट बनाए रखूँगा, एक इकोसिस्टम-विशिष्ट डिपेंडेंसी ग्राफ़ को पार्स करूँगा, और एक इंडेक्स की गई वल्नरेबिलिटी रेंज के माध्यम से वर्ज़न्स को मैच करूँगा। परिणाम रिपॉजिटरी, कंपोनेंट, वल्नरेबिलिटी और एविडेंस स्नैपशॉट द्वारा की (key) किया गया एक आइडेम्पोटेंट अलर्ट प्रोजेक्शन बन जाता है। फ़ीड रिवीज़न्स इंक्रीमेंटल रीकंप्यूटेशन को ट्रिगर करते हैं। इनजेशन, फ़ीड अपडेट्स, और नोटिफ़िकेशन्स ड्यूरेबल रीप्ले करने योग्य कतारों (queues) का उपयोग करते हैं; नोटिफ़िकेशन्स को प्रति ऑर्गनाइज़ेशन एग्रीगेट किया जाता है और उनमें एक आइडेम्पोटेंसी की होती है। अलर्ट्स एविडेंस बनाए रखते हैं, जबकि एक नया कमिट फ़िक्स्ड के रूप में मार्क किए जाने से पहले री-स्कैन किया जाता है। रीकॉन्सिलिएशन, ऑथराइजेशन, और फ्रेशनेस मेट्रिक्स सिस्टम को व्याख्या योग्य बनाते हैं।"
चरण-दर-चरण गहन डिज़ाइन
कंट्रोल प्लेन ऑर्गनाइज़ेशन्स, रिपॉजिटरीज़, ब्रांचेस, और नोटिफ़िकेशन पॉलिसीज़ को स्टोर करता है। एक इनजेशन API कमिट हैश के साथ एक मैनिफ़ेस्ट स्वीकार करता है, मूल ऑब्जेक्ट और मेटाडेटा लिखता है, फिर manifest_received उत्सर्जित करता है। उसी रिपॉजिटरी, ब्रांच, कमिट और मैनिफ़ेस्ट डाइजेस्ट को दोहराने पर मौजूदा स्नैपशॉट वापस आ जाता है। बड़े SBOMs मल्टीपार्ट अपलोड और चेकसम का उपयोग करते हैं; प्रति-टेनेंट कोटा पार्सर्स की सुरक्षा करता है।
पार्सर्स प्रत्येक इकोसिस्टम के अनुसार नामों और वर्ज़न्स को सामान्यीकृत (normalize) करते हैं और लॉक्ड ट्रांज़िटिव ग्राफ़ का विस्तार करते हैं। एक स्नैपशॉट कंपोनेंट कोऑर्डिनेट्स, सोर्स पाथ्स, और डेवलपमेंट या प्रोडक्शन स्कोप रिकॉर्ड करता है। पार्स विफलताएं मूल फ़ाइल, त्रुटि स्थान, और पुनः प्रयास (retry) की स्थिति को सुरक्षित रखती हैं; "पार्स नहीं हो सका" का अर्थ "कोई वल्नरेबिलिटी नहीं" नहीं होना चाहिए।
फ़ीड इंजेस्टर OSV जैसे स्रोतों से डेल्टा खींचता (pull) या प्राप्त करता है, स्कीमा, सोर्स सिग्नेचर्स, और फ़ीड वर्ज़न्स को सत्यापित करता है, फिर प्रभावित इकोसिस्टम्स, पैकेज नाम, वर्ज़न रेंज्स, उपनाम, गंभीरता, फ़िक्स्ड वर्ज़न्स, टाइमस्टैम्प्स, और विदड्रॉअल मार्कर्स को स्टोर करता है। रेंज मैचिंग स्ट्रिंग सॉर्टिंग के बजाय इकोसिस्टम सेमेंटिक्स का उपयोग करती है। एक इनवर्टेड इंडेक्स हाई-वॉल्यूम कंपोनेंट्स को इंक्रीमेंटल बनाता है।
एक अलर्ट में alert_id, ऑर्गनाइज़ेशन, रिपॉजिटरी, ब्रांच, कंपोनेंट कोऑर्डिनेट, वल्नरेबिलिटी ID, एविडेंस स्नैपशॉट, स्टेटस, पहली बार देखा गया समय, नवीनतम पुष्टि, फ़िक्सिंग कमिट, और नियम वर्ज़न शामिल होते हैं। (repository, branch, component, vulnerability_id, vulnerable_version) पर एक यूनीक कंस्ट्रेंट डुप्लिकेट्स को रोकता है; यह की बनने से पहले उपनामों को सामान्यीकृत किया जाता है। स्थितियों में OPEN, FIXED, DISMISSED, और REOPENED शामिल हैं, जिसमें प्रत्येक ट्रांज़िशन के लिए एक ऑडिट इवेंट होता है। विदड्रॉअल नए नोटिफ़िकेशन्स को रोकता है लेकिन इतिहास और उसके कारण को सुरक्षित रखता है।
नोटिफ़िकेशन्स स्कैन ट्रांज़ैक्शन से बाहर होते हैं। अलर्ट इवेंट्स ऑर्गनाइज़ेशन-विभाजित कतारों में प्रवेश करते हैं; एक एग्रीगेटर समान अलर्ट्स को समूहित करता है, कूलडाउन लागू करता है, और स्थिर नोटिफ़िकेशन कीज़ उत्सर्जित करता है। ईमेल, कोड-होस्ट कमेंट्स, और चैट एडेप्टर्स प्रत्येक की सीमाएं, पुनः प्रयास, और डिलीवरी रसीदें होती हैं; उपभोक्ता की द्वारा डिडुप्लिकेट करते हैं। स्नूज़ का स्कोप, समाप्ति, ओनर, और कारण होता है, जबकि गंभीरता का बढ़ना (escalation) समाप्त या अमान्य स्नूज़ को बायपास कर सकता है।
रेमेडिएशन वेरिफिकेशन एक नए कमिट या शेड्यूल्ड स्नैपशॉट को स्वीकार करता है, वर्तमान ग्राफ़ को फिर से पार्स करता है, और वही मैचिंग नियम लागू करता है। एक अलर्ट केवल तभी बंद होता है जब वर्तमान डिफ़ॉल्ट-ब्रांच स्नैपशॉट अब मैच नहीं करता है या कोई ऑर्गनाइज़ेशन स्पष्ट रूप से जोखिम स्वीकार करता है। एक सुझाया गया फ़िक्स्ड वर्ज़न रेमेडिएशन का प्रमाण नहीं है। डिलीट की गई ब्रांचेस ऑडिट इतिहास को मिटाए बिना एक टर्मिनेशन इवेंट उत्पन्न करती हैं।
स्थायित्व रीप्ले करने योग्य इवेंट्स और रीकॉन्सिलिएशन से आता है। संग्रहीत मैनिफ़ेस्ट्स की तुलना पार्स परिणामों, मैचेस, अलर्ट प्रोजेक्शन्स, फ़ीड वर्ज़न्स, अपेक्षित नोटिफ़िकेशन्स, और एडेप्टर प्राप्तियों से करें। मैनिफ़ेस्ट-टू-अलर्ट p95 लेटेंसी, पार्स विफलताएं, फ़ीड अंतराल, मैचिंग थ्रूपुट, डुप्लिकेट दर, विदड्रॉअल प्रोपेगेशन, नोटिफ़िकेशन रीप्रयास, और स्नूज़ हिट्स की निगरानी करें। कतार डुप्लिकेट्स, फ़ीड रिवीज़न के दौरान क्रैश, पुराने इंडेक्स, एडेप्टर टाइमआउट, और डेटाबेस रिकवरी विफलताओं को इंजेक्ट करें।
उच्च गुणवत्ता वाला नमूना उत्तर
"मैं मूल मैनिफ़ेस्ट को उसके कमिट हैश के साथ स्टोर करूँगा, एक इकोसिस्टम-विशिष्ट डिपेंडेंसी ग्राफ़ को पार्स करूँगा, और वल्नरेबिलिटी रेंज्स पर एक इनवर्टेड इंडेक्स बनाए रखूँगा। मैचिंग एविडेंस स्नैपशॉट और नियम वर्ज़न के साथ एक आइडेम्पोटेंट अलर्ट बनाती है; एक यूनीक की समान रिपॉजिटरी, कंपोनेंट, और वल्नरेबिलिटी के लिए डुप्लिकेट अलर्ट्स को रोकती है। एक विदड्रॉअल नए नोटिफ़िकेशन्स को रोकता है लेकिन ऐतिहासिक एविडेंस को बनाए रखता है।
नोटिफ़िकेशन इवेंट्स को ड्यूरेबल कतारों के माध्यम से स्कैनिंग से अलग (decouple) किया जाता है, ऑर्गनाइज़ेशन के अनुसार एग्रीगेट किया जाता है, और स्थिर कीज़ के साथ पुनः प्रयास किया जाता है। स्नूज़ समाप्त हो जाते हैं और उनका ऑडिट किया जाता है; गंभीरता में वृद्धि उन्हें जगा (wake) सकती है। प्रत्येक नए कमिट को फिर से स्कैन किया जाता है, और केवल एक वास्तविक नॉन-मैच ही अलर्ट को फ़िक्स्ड के रूप में मार्क करता है। रीकॉन्सिलिएशन मैनिफ़ेस्ट, फ़ीड, अलर्ट, और नोटिफ़िकेशन सीमाओं की जांच करता है, जबकि मेट्रिक्स विज़िबिलिटी, विदड्रॉअल प्रोपेगेशन, बैकलॉग, डुप्लिकेट्स, और एडेप्टर विफलताओं को कवर करते हैं। यह दैनिक लाखों मैनिफ़ेस्ट्स तक स्केल करता है और बताता है कि कोई अलर्ट क्यों दिखाई दिया, बदला या फिर से खुला।"
सामान्य गलतियाँ
- केवल पैकेज नामों की तुलना करना → इकोसिस्टम और रेंज सेमेंटिक्स गलत मैच बनाते हैं → इकोसिस्टम कोऑर्डिनेट्स और रेंज तुलना का उपयोग करें।
- पार्स विफलता को सुरक्षित मानना → एक टूटी हुई lockfile चुपचाप जोखिम को छुपाती है → विफलता एविडेंस बनाए रखें और पुनः प्रयास करें।
- प्रत्येक स्कैन पर एक नया अलर्ट बनाना → एक ही समस्या डेवलपर्स पर बाढ़ ला देती है → एक आइडेम्पोटेंट अलर्ट की बनाएं।
- फ़ीड रिवीज़न्स को अधिलेखित (overwrite) करना → ऐतिहासिक गंभीरता और विदड्रॉअल व्याख्या योग्य नहीं रह जाते → स्रोत का वर्ज़न बनाएं और एविडेंस बनाए रखें।
- स्कैनिंग के अंदर नोटिफ़िकेशन्स भेजना → एक धीमा चैनल डिटेक्शन को ब्लॉक करता है → ड्यूरेबल इवेंट्स के साथ डीकपल करें।
- सुझाए गए फ़िक्स वर्ज़न पर बंद करना → वास्तविक कमिट अभी भी मैच कर सकता है → वर्तमान कमिट को फिर से स्कैन करें।
- स्थायी स्नूज़ की अनुमति देना → जोखिम अपना ओनर खो देता है → समाप्ति, कारण, और रिमाइंडर्स की आवश्यकता अनिवार्य करें।
- उपनामों के लिए अलग से अलर्ट करना → एक ही वल्नरेबिलिटी कई बार दिखाई देती है → पहले उपनामों को सामान्यीकृत करें।
फ़ॉलो-अप प्रश्न और उत्तर
फ़ॉलो-अप 1: आप संशोधित प्रभावित रेंज को कैसे संभालते हैं?
फ़ीड अपडेट को वर्ज़न करें, प्रभावित कंपोनेंट सेट की गणना करें, और केवल मैचिंग स्नैपशॉट्स को रीकंप्यूट करें। प्रत्येक अलर्ट पर नियम वर्ज़न और एविडेंस रखें; प्रत्येक स्टेटस परिवर्तन को रिकॉर्ड करें।
फ़ॉलो-अप 2: मूल मैनिफ़ेस्ट को क्यों बनाए रखें?
पार्सर्स और नियम विकसित होते हैं। मूल फ़ाइल नए नियमों के तहत रीप्ले का समर्थन करती है और यह साबित करती है कि किस कमिट ने अलर्ट उत्पन्न किया था।
फ़ॉलो-अप 3: आप नोटिफ़िकेशन थकान (fatigue) को कैसे कम करते हैं?
कूलडाउन और सारांशों के साथ ऑर्गनाइज़ेशन, वल्नरेबिलिटी, और कंपोनेंट द्वारा एग्रीगेट करें। स्नूज़ स्कोप्ड, एक्सपायरिंग, और ऑडिटेड होते हैं; गंभीरता में वृद्धि तुरंत सूचित कर सकती है।
फ़ॉलो-अप 4: आप ट्रांज़िटिव-डिपेंडेंसी की गलतियों से कैसे बचते हैं?
लॉक्ड ग्राफ़ का उपयोग करें, पैरेंट पाथ्स और डिपेंडेंसी स्कोप बनाए रखें, और जब कोई lockfile रिज़ॉल्व्ड वर्ज़न स्थापित न कर सके तो "unknown" दिखाएं।
फ़ॉलो-अप 5: आप ब्रांचेस को कैसे मॉडल करते हैं?
ब्रांच को एक स्नैपशॉट डायमेंशन के रूप में समझें और इसे अलर्ट की में शामिल करें। डिलीट करना भविष्य के काम को समाप्त करता है लेकिन ऑडिट इतिहास को नहीं मिटाता है।
फ़ॉलो-अप 6: यदि वल्नरेबिलिटी फ़ीड अनुपलब्ध हो तो क्या होगा?
स्पष्ट फ्रेशनेस चेतावनी के साथ अंतिम सत्यापित वर्ज़न का उपयोग करें; क्लीन परिणाम का दावा न करें। बैक ऑफ़ करें, मिरर पर फ़ेलओवर करें, और रिकवरी के बाद वर्ज़न डेल्टा को रीप्ले करें।