
GoBalance onion load balancer के लिए सुरक्षा पैच और proof-of-concept, जिसमें blindedSign के माध्यम से master key recovery और forged descriptor acceptance को कवर किया गया है, साथ में regression tests भी शामिल हैं।
gitlab.com/n0tr1v/gobalance के लिए एडवाइज़री पैकेज - मास्टर ब्रांच, कमिट bb1b0f3 ("fix crash")।
स्थिति: गंभीर - दो स्वतंत्र पूर्ण-अधिग्रहण पथ। अपस्ट्रीम patch1 ब्रांच इनमें से किसी को भी ठीक नहीं करती।
इस पैकेज में एक पूर्ण सुरक्षा पैच, दोनों हमला पथों के लिए एक एंड-टू-एंड प्रूफ-ऑफ-कॉन्सेप्ट, और फिक्स के स्थायी होने को सिद्ध करने वाले रिग्रेशन टेस्ट शामिल हैं। यह दो फ़ोरमों को प्रभावित करने वाली हाल की onion-डोमेन अधिग्रहण घटनाओं के संबंध में तैयार की गई पूर्ण भेद्यता विश्लेषण रिपोर्ट ("Laporan Analisis Keamanan GoBalance") के साथ आता है। चरण-दर-चरण बिल्ड और टेस्ट गाइड USAGE.md में है।
| # | भेद्यता | गंभीरता | प्रभाव | स्थिति |
|---|---|---|---|---|
| 1 | मास्टर पहचान कुंजी blindedSign के माध्यम से लीक होती है (स्थिर nonce प्रीफ़िक्स) | गंभीर | एकल सार्वजनिक डिस्क्रिप्टर से पूर्ण onion पहचान पुनर्प्राप्ति | ठीक किया गया |
| 2 | RegisterDescriptor जाली इंस्टेंस डिस्क्रिप्टर स्वीकार करता है (कोई हस्ताक्षर / बाइंडिंग सत्यापन नहीं) | गंभीर | किसी भी GoBalance फ्रंटएंड का ट्रैफ़िक हाईजैक | ठीक किया गया |
| 3 | pkg/brand में नियतात्मक, समय-सीडेड RNG पथ | उच्च (फुटगन) | इसका उपयोग करने वाली किसी भी चीज़ के लिए पूर्वानुमेय कुंजी सामग्री | हटाया गया |
| 4 | इंट्रोडक्शन-पॉइंट शफल math/rand का उपयोग करता है | निम्न | प्रोटोकॉल-निकट कोड में कमज़ोर रैंडमनेस | crypto/rand से बदला गया |
pkg/stem/descriptor/hidden_service.go में डिस्पैचर blindedSign() ने
identityKey.Seed() - कच्चे 32-बाइट स्केलर a - को
BlindedSignWithTorKey() में पास किया। Tor-प्रारूप कुंजियाँ विस्तारित कुंजियाँ हैं: 64 बाइट
(a || h), जहाँ h वह PRF कुंजी है जो प्रति-हस्ताक्षर nonce
प्रीफ़िक्स व्युत्पन्न करती है। h अनुपस्थित होने पर, nonce व्युत्पत्ति इनपुट खाली था और
kPrime = SHA512("Derive temporary signing key hash input" || <empty>)
एक सार्वजनिक स्थिरांक बन गया। परिणाम: जो कोई भी एक प्रकाशित
डिस्क्रिप्टर पढ़ सकता है, वह nonce r की पुनर्गणना कर सकता है, ब्लाइंडेड स्केलर
s' = (S − r) · H(R‖PK‖M)⁻¹ mod L के लिए हल कर सकता है, और इसे एक सार्वजनिक गुणक से अनब्लाइंड कर सकता है -
onion सेवा की मास्टर पहचान कुंजी पुनर्प्राप्त कर सकता है। कोई सर्वर एक्सेस नहीं, कोई MitM नहीं, कोई ब्रूट फ़ोर्स नहीं। यह एक मूक डोमेन-अधिग्रहण प्रिमिटिव है और हाल के फ़ोरम हाईजैक में देखे गए तंत्र के अनुरूप है।
फिक्स: डिस्पैचर अब पूर्ण विस्तारित कुंजी
(gobpk.PrivateKey.PrivKey()) अग्रेषित करता है; BlindedSignWithTorKey किसी भी ऐसी कुंजी पर पैनिक करता है जो
ठीक 64 बाइट नहीं है; blindedSignP2 रक्षा-गहराई के रूप में स्वतंत्र रूप से ESK लंबाई
लागू करता है; gobpk.New लोड समय पर काटी गई Tor कुंजियों को अस्वीकार करता है।
NewReceivedDescriptor() ने जो कुछ भी नेटवर्क ने दिया उसे पार्स किया और विश्वास किया।
चूँकि सबक्रेडेंशियल डिस्क्रिप्टर के भीतर ही ले जाई गई ब्लाइंडेड कुंजी से व्युत्पन्न होते हैं, एक हमलावर अपनी कुंजियों का उपयोग करके किसी और के onion पते के लिए क्रिप्टोग्राफ़िक रूप से स्व-संगत
डिस्क्रिप्टर बना सकता था। फिर फ्रंटएंड पीड़ित की पहचान के अंतर्गत हमलावर के इंट्रोडक्शन पॉइंट्स को पुनः प्रकाशित कर देता - एक पूर्ण ट्रैफ़िक हाईजैक जिसके लिए किसी कुंजी पुनर्प्राप्ति की आवश्यकता ही नहीं होती।
फिक्स: नए
VerifyHiddenServiceDescriptorV3() में तीन-स्तरीय सत्यापन: (1) ब्लाइंडेड कुंजी के अंतर्गत प्रमाणपत्र हस्ताक्षर, (2) प्रमाणित साइनिंग कुंजी के अंतर्गत डिस्क्रिप्टर हस्ताक्षर, और
(3) बाइंडिंग - ब्लाइंडेड कुंजी उस मान के बराबर होनी चाहिए जिसकी फ्रंटएंड स्वतंत्र रूप से सहमति (GetBlindingParam + समय अवधि) और
इंस्टेंस पते से गणना करता है। RegisterDescriptor फेल-क्लोज़्ड है: लाइव सहमति के बिना यह अंधाधुंध विश्वास करने के बजाय पंजीकरण से इनकार कर देता है।
gobalance-patch/
├── README.md ← this file (English)
├── USAGE.md ← step-by-step build & test guide (English)
├── README_ID.md ← ringkasan patch (Bahasa Indonesia)
├── gobalance-security.patch ← unified diff against master@bb1b0f3 (7 files, +360/−94)
├── gobalance-patched/ ← full pre-patched source tree (drop-in)
│ ├── go.mod / go.sum / main.go
│ ├── pkg/… ← patched libraries, incl. regression tests
│ ├── poc/ ← end-to-end attack demo + vulnerable code snapshot
│ ├── cmd/gbdemo/ ← standalone recovery demo CLI (+ E2E tests) - USAGE #13
│ └── tools/ ← pem2tor.py (PEM→Tor key converter), get_desc.py (descriptor fetch)
└── gobalance-v1/ ← community fork "GoBalance Enhanced v1.0" (Dread), bundled
as distributed for testing - still VULNERABLE - USAGE #14
# Option A - patch a fresh upstream checkout
git clone https://gitlab.com/n0tr1v/gobalance && cd gobalance
git apply /path/to/gobalance-security.patch
go build ./... && go test ./...
# Option B - use the bundled pre-patched tree (fastest)
cd gobalance-patched
go build ./...
go test ./poc/ -v # attack demo: succeeds vs vulnerable snapshot, fails vs patch
go test ./... # full suite: 8 packages ok
अपेक्षित आउटपुट के साथ पूर्ण वॉकथ्रू के लिए USAGE.md देखें।
Test01_Vulnerable_MasterKeyRecoveredFromSingleDescriptor।Test02_Patched_TruncatedTorKeyRejected।Test03_Patched_TorPathSignaturesVerifyAsStdEd25519।Test04_Patched_AttackMathYieldsGarbage।TestForgedSelfConsistentDescriptorIsDetected।TestNewReceivedDescriptor_AcceptsHonestDescriptor,
_RejectsTamperedSignature, _RejectsWrongIdentityBinding।PoC में सभी कुंजियाँ टेस्ट समय पर स्थानीय रूप से उत्पन्न होती हैं। किसी वास्तविक सेवा को लक्षित नहीं किया गया।
TestBlindedSign अभी भी
पास होता है)।patch1 ब्रांच भेद्यता #1 या #2 को ठीक नहीं करती। यह पैच
मास्टर के ऊपर लागू किया जाना चाहिए (या बंडल किया गया ट्री उपयोग करें)।