
VEX दस्तावेज़ एकत्र करें और VEX Hub अपडेट करें
vexhub-crawler VEX Hub का एक घटक है जो स्रोत रिपॉज़िटरी से VEX दस्तावेज़ स्वचालित रूप से प्राप्त करता है।
क्रॉलर पंजीकृत PURLs (पैकेज URLs) से स्रोत रिपॉज़िटरी की पहचान करता है और VEX दस्तावेज़ों को VEX Hub में कॉपी करता है। यह प्रक्रिया सुनिश्चित करती है कि VEX Hub विभिन्न सॉफ़्टवेयर पैकेजों के लिए VEX दस्तावेज़ों का अद्यतन संग्रह बनाए रखे।
निम्नलिखित आरेख VEX Hub Crawler की उच्च-स्तरीय प्रक्रिया प्रवाह को दर्शाता है, जिसमें npm को एक उदाहरण के रूप में उपयोग किया गया है:
flowchart TD
Dev[Developer] -->|Register package| PL[Package List]
PL -->|Provide packages for crawling| Crawler
Crawler -->|Identify repository URL| Registry[Package Registry]
Crawler -->|Retrieve VEX documents| Src
Crawler -->|Validate and update VEX documents| Hub
subgraph crawler [VEX Hub Crawler]
Crawler
PL
end
subgraph bottom [ ]
direction LR
Registry
Src
Hub[VEX Hub]
subgraph Src[Source Repository]
direction TB
VEX[VEX documents<br>under .vex/ directory]
end
end
classDef dev fill:#b3d9ff,stroke:#2a4d69,stroke-width:1px,color:#2a4d69;
classDef vexHub fill:#ffd9e6,stroke:#4b3832,stroke-width:1px,color:#4b3832;
classDef crawler fill:#c2f0c2,stroke:#1e4d2b,stroke-width:1px,color:#1e4d2b;
classDef npmReg fill:#ffe6cc,stroke:#5e3023,stroke-width:1px,color:#5e3023;
classDef sourceRepo fill:#e6ccff,stroke:#3b2e58,stroke-width:1px,color:#3b2e58;
classDef pkgList fill:#ccf2ff,stroke:#1c4e5a,stroke-width:1px,color:#1c4e5a;
classDef invisible fill:none,stroke:none;
class Dev dev;
class Hub vexHub;
class crawler crawler;
class Registry npmReg;
class Src,VEX sourceRepo;
class PL pkgList;
class bottom invisible;VEX Hub Crawler VEX दस्तावेज़ खोजने के लिए PURLs की एक सूची रखता है। PURL परिभाषा फ़ाइल का प्रारूप इस प्रकार है:
pkg:
npm:
- namespace: "@angular"
name: animations
golang:
- name: github.com/aquasecurity/trivy
pypi:
- name: django
maven:
- namespace: org.junit.jupiter
name: junit-jupiter-api
oci:
- name: trivy
qualifiers:
- key: repository_url
value: index.docker.io/aquasec/trivy
- name: trivy
qualifiers:
- key: repository_url
value: ghcr.io/aquasecurity/trivy
PURLs निर्दिष्ट करते समय, निम्नलिखित घटक आवश्यक हैं:
version को छोड़ दिया जाना चाहिए।
namespace, qualifiers और subpath कुछ इकोसिस्टम, जैसे oci, के लिए आवश्यक हो सकते हैं।
PURL संरचना के बारे में विस्तृत जानकारी के लिए, कृपया PURL विनिर्देश देखें।
PURLs की सूची को कोई भी व्यक्ति Pull Requests के माध्यम से अद्यतन कर सकता है। यदि VEX दस्तावेज़ पहले से ही किसी ओपन-सोर्स प्रोजेक्ट की स्रोत रिपॉज़िटरी में संग्रहीत हैं, तो प्रोजेक्ट के अनुरक्षकों के अलावा अन्य व्यक्ति VEX Hub में PURL पंजीकृत कर सकते हैं।
वर्तमान में, क्रॉलर निम्नलिखित इकोसिस्टम का समर्थन करता है:
स्रोत रिपॉज़िटरी की पहचान करने की विधि इकोसिस्टम के अनुसार भिन्न होती है:
स्रोत रिपॉज़िटरी का पता लगाने के लिए npm रजिस्ट्री API का उपयोग किया जाएगा। प्रत्येक पैकेज में रिपॉज़िटरी को परिभाषित करने के लिए एक अनुभाग होता है।
React के उदाहरण के लिए, यह इस प्रकार होगा:
$ curl -s https://registry.npmjs.org/react | jq .repository.url
"git+https://github.com/facebook/react.git"
vexhub-crawler https://github.com/facebook/react में संग्रहीत VEX फ़ाइलों को स्वचालित रूप से प्राप्त करेगा।
go-import से रिपॉज़िटरी की पहचान करने के लिए एक HTTP एक्सेस किया जाएगा।
curl -s "https://k8s.io/client-go?go-get=1"
<html><head>
<meta name="go-import"
content="k8s.io/client-go
git https://github.com/kubernetes/client-go">
<meta name="go-source"
content="k8s.io/client-go
https://github.com/kubernetes/client-go
https://github.com/kubernetes/client-go/tree/master{/dir}
https://github.com/kubernetes/client-go/blob/master{/dir}/{file}#L{line}">
</head></html>
रिपॉज़िटरी का पता लगाने के लिए PyPI API का उपयोग किया जाएगा।
curl -s https://pypi.org/pypi/<package-name>/json | jq .info.project_urls.Source
रिपॉज़िटरी का पता लगाने के लिए crates.io API का उपयोग किया जाएगा।
curl -s https://crates.io/api/v1/crates/<crate-name> | jq .crate.repository
Maven पैकेजों के लिए, स्रोत रिपॉज़िटरी की पहचान करने हेतु ये चरण अपनाए जाते हैं:
repository_url प्राप्त करें। डिफ़ॉल्ट URL https://repo.maven.apache.org/maven2 है।maven-metadata.xml फ़ाइल का URL बनाएं। उदाहरण के लिए, com.fasterxml.jackson.core:jackson-databind के लिए URL होगा: https://repo.maven.apache.org/maven2/com/fasterxml/jackson/core/jackson-core/maven-metadata.xml।maven-metadata.xml से नवीनतम संस्करण निकालें,scm.url या url फ़ील्ड की जाँच करके स्रोत रिपॉज़िटरी की पहचान करें।OCI इमेजेस के लिए, latest टैग के org.opencontainers.image.source लेबल या एनोटेशन की जाँच करके स्रोत रिपॉज़िटरी की पहचान की जाती है।
यह मेटाडेटा सामान्यतः इमेज बिल्ड प्रक्रिया के दौरान सेट किया जाता है और स्रोत कोड रिपॉज़िटरी को संदर्भित करने का एक मानकीकृत तरीका प्रदान करता है।
प्रक्रिया इस प्रकार है:
repository_url और :latest टैग जोड़कर पूर्ण इमेज संदर्भ बनाएं।latest टैग के लिए इमेज मैनिफेस्ट और कॉन्फ़िगरेशन प्राप्त करें।org.opencontainers.image.source कुंजी देखें:
Labels फ़ील्डannotations फ़ील्डcrane का उपयोग करके स्रोत URL प्राप्त करने का उदाहरण:
$ crane config ghcr.io/aquasecurity/trivy:latest | jq -r '.config.Labels["org.opencontainers.image.source"]'
https://github.com/aquasecurity/trivy
स्रोत रिपॉज़िटरी की पहचान हो जाने के बाद (वर्तमान में केवल git रिपॉज़िटरी समर्थित हैं), vexhub-crawler रिपॉज़िटरी के रूट में .vex/ निर्देशिका में VEX दस्तावेज़ खोजता है।
क्रॉलर निम्नलिखित पैटर्न से मेल खाने वाली फ़ाइलों को VEX दस्तावेज़ मानता है:
क्रॉलर निम्नलिखित सत्यापन करता है:
क्रॉलर खोजी गई फ़ाइलों को उनके मूल फ़ाइल नामों के साथ VEX Hub में कॉपी करता है। VEX Hub में निर्देशिका संरचना पैकेज URL (PURL) के आधार पर बनाई जाती है, संस्करण, qualifiers और subpath को छोड़कर।
क्रॉलर स्रोत रिपॉज़िटरी में संग्रहीत VEX दस्तावेज़ों पर आधारित एक विश्वास मॉडल अपनाता है। जैसा कि सत्यापन अनुभाग में उल्लेख किया गया है, यह उन VEX दस्तावेज़ों को फ़िल्टर कर देता है जो मूल PURL से भिन्न उत्पाद घोषित करते हैं।
उदाहरण के लिए, यदि कोई PURL pkg:npm/malicious VEX Hub में पंजीकृत है और स्रोत रिपॉज़िटरी github.com/org/malicious पर हल होता है, तो वहाँ संग्रहीत सभी VEX दस्तावेज़ों का उत्पाद ID pkg:npm/malicious होना चाहिए।
pkg:npm/[email protected] जैसे भिन्न उत्पाद ID वाले VEX दस्तावेज़ों को अनदेखा कर दिया जाएगा।
यह दृष्टिकोण सुनिश्चित करता है कि VEX Hub में केवल प्रासंगिक और विश्वसनीय VEX दस्तावेज़ शामिल किए जाएँ।
वर्तमान में, VEX Hub Crawler पैकेज स्रोत रिपॉज़िटरी की पहचान करने के लिए रजिस्ट्री APIs का उपयोग करता है। हालाँकि, इस दृष्टिकोण में संभावित सुरक्षा जोखिम हैं क्योंकि रिपॉज़िटरी जानकारी पैकेज अनुरक्षकों द्वारा स्वतंत्र रूप से सेट की जा सकती है, जिससे यह छेड़छाड़ के प्रति संवेदनशील हो जाती है।
इस चुनौती का समाधान करने के लिए, हम भविष्य में अधिक विश्वसनीय स्रोत रिपॉज़िटरी समाधान हेतु provenance attestation का उपयोग करने पर विचार कर रहे हैं। Provenance attestation विश्वसनीय तरीके से उस वास्तविक रिपॉज़िटरी URL को प्राप्त करने की अनुमति देता है जहाँ पैकेज बनाया गया था, जिससे पैकेज के स्रोत कोड और उसके प्रकाशित आर्टिफैक्ट्स के बीच संबंध का क्रिप्टोग्राफ़िक सत्यापन संभव हो पाता है।
विशेष रूप से, npm ने अपनी रजिस्ट्री में provenance पहले ही लागू कर दिया है। यह कार्यान्वयन provenance डेटा का उपयोग करके सीधे PURL से स्रोत रिपॉज़िटरी जानकारी प्राप्त करना संभव बनाता है। हमारा मानना है कि यह दृष्टिकोण पैकेजों के लिए स्रोत रिपॉज़िटरी समाधान प्रक्रिया की विश्वसनीयता बढ़ा सकता है।