FlawOpen

flawopen.com/Teardowns/cve-2026-84973-jupyterlab-snapshot-checkout-toctou

● CVE-2026-84973 · उच्च
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-84973: JupyterLab snapshot workflow में TOCTOU दोष

एक सेकंड की समय-सटीकता वाली जाँच snapshot workflow को बिना मंज़ूरी वाला Pull Request commit checkout करके job की अनुमतियों से चलाने दे सकती थी। update-snapshots-checkout को 1.0.0 या नए संस्करण पर अपडेट करें।

💡 आसान भाषा में (ELI5)

समीक्षक एक खास पार्सल को मंज़ूरी देता है, लेकिन डिलीवरी काउंटर केवल घड़ी का सेकंड देखता है। यदि उसी सेकंड पार्सल बदल दिया जाए, तो बदला हुआ पार्सल भी स्वीकृत लगता है। इस action ने सेकंड-स्तर के समय की तुलना की और बराबर मान स्वीकार किए, इसलिए अनुरक्षक की टिप्पणी के साथ ही Pull Request का अपडेट जाँच पार कर सकता था।

इस पेज के मुख्य शब्द

TOCTOU
Time-of-check to time-of-use: सुरक्षा निर्णय के बाद, संसाधन के उपयोग से पहले वह संसाधन बदल जाता है।
Pull Request head SHA
Pull Request शाखा के शीर्ष commit का अपरिवर्तनीय पहचान-चिह्न। workflow को केवल वही सटीक commit चलाना चाहिए जिसे मंज़ूरी मिली हो।
GitHub Actions token permissions
job के GITHUB_TOKEN को दी गई अनुमतियाँ, जैसे repository content और Pull Request पढ़ना या लिखना।
CWE-367 / CWE-829
सलाह-पत्र समय-दौड़ को CWE-367 और Pull Request द्वारा नियंत्रित कार्यक्षमता चलाने को CWE-829 से जोड़ता है।

फ्रेमवर्क मैपिंग

  • इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-367 CWE-829

मूल कारण विश्लेषण (Root Cause)

1.0.0 से पहले update-snapshots-checkout ने Pull Request का pushed_at और ट्रिगर करने वाली टिप्पणी का created_at लिया, दोनों को Unix सेकंड में बदला और केवल तब run रोका जब pushed_at सख्ती से बड़ा था। API के दोनों timestamp एक सेकंड की सटीकता रखते हैं। इसलिए एक ही सेकंड में हुआ push और अधिकृत टिप्पणी बराबर हो सकते थे और जाँच पार कर सकते थे। फिर action ने वर्तमान head SHA सहेजा और checkout के बाद उसकी तुलना की; इससे केवल यह साबित हुआ कि checkout अभी प्राप्त SHA से मेल खाता है, यह नहीं कि अनुरक्षक ने उस commit को मंज़ूरी दी थी। upstream सुधार -gt को -ge से बदलता है और बराबर या बाद के push को रोकता है। जोखिम तभी है जब कमजोर संस्करण के बाद के चरण Pull Request सामग्री चलाते हों; प्रभाव workflow की अनुमतियों और credentials पर निर्भर है।

हमले का चरण-दर-चरण प्रवाह

चरण 1

विश्वसनीय अनुरक्षक workflow चलाता है

Pull Request खुलता है और OWNER, COLLABORATOR या MEMBER snapshot-update workflow शुरू करने वाली टिप्पणी पोस्ट करता है।

चरण 2

हमलावर का बदलाव टिप्पणी के उसी सेकंड में होता है

योगदानकर्ता उसी सेकंड Pull Request शाखा अपडेट करता है। API की सेकंड-स्तरीय सटीकता के कारण Unix समय बराबर हो सकता है।

चरण 3

सख्त बड़ा-से तुलना बराबरी को स्वीकारती है

कमजोर action केवल तब रोकता है जब pushed_at, created_at से बड़ा हो। बराबर मान शर्त पूरी नहीं करते, इसलिए नया head SHA सहेजा जाता है।

चरण 4

workflow उस commit को checkout करके चला सकता है

checkout सहेजे गए SHA से मेल खाता है और बाद की जाँच पार करता है। यदि अगले चरण Pull Request-नियंत्रित action या script चलाएँ, तो वे job की अनुमतियाँ और credentials पाते हैं।

चरण 5

अपडेट करें और workflow अधिकार सीमित करें

1.0.0 या नए संस्करण पर जाएँ। actions को अपरिवर्तनीय SHA पर pin करें, GITHUB_TOKEN को केवल आवश्यक अनुमति दें और अविश्वसनीय Pull Request code को secrets तथा privileged jobs से दूर रखें।

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

यह upstream का एक-पंक्ति सुधार है: -ge API की उपलब्ध समय-सटीकता पर बराबरी को भी अस्वीकार करता है। इससे उसी सेकंड वाला ज्ञात bypass बंद होता है। फिर भी मंज़ूरी को अपरिवर्तनीय SHA से बाँधें और अनुमतियाँ कम रखें; समय-क्रम अपरिवर्तनीय authorization निर्णय का विकल्प नहीं है। upstream diff मौजूदा निदान संदेश को नहीं बदलता; उसमें “बाद” लिखा है, जबकि अब बराबर समय भी अस्वीकार होता है।

कमज़ोर कार्यान्वयन
if [[ $(date -d "$pushed_at" +%s) -gt $(date -d "$COMMENT_AT" +%s) ]]; then
    echo "Updating is not allowed because the PR was pushed to (at $pushed_at) after the triggering comment was issued (at $COMMENT_AT)"
    exit 1
fi
सुरक्षित और सुदृढ़ फ़िक्स
if [[ $(date -d "$pushed_at" +%s) -ge $(date -d "$COMMENT_AT" +%s) ]]; then
    echo "Updating is not allowed because the PR was pushed to (at $pushed_at) after the triggering comment was issued (at $COMMENT_AT)"
    exit 1
fi

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत