6

सुरंग करते समय सॉकेट दौड़ के सुरक्षा प्रभाव, मैं एक बंदरगाह सुनकर कनेक्शन के माध्यम से उप-आदेश को सुरंग करना चाहता हूं, उप-आदेश (उस बंदरगाह से कनेक्ट करने के लिए) चला रहा हूं, और फिर डेटा अग्रेषित करना कनेक्शन के माध्यम से:एक सब-कमांड

package main 

import (
    "fmt" 
    "net" 
    "os" 
    "os/exec" 
) 

func main() { 
    ln, err := net.ListenTCP("tcp4", &net.TCPAddr{IP: localhost}) 
    if err != nil { 
     fmt.Fprintln(os.Stderr, err) 
     os.Exit(1) 
    } 
    defer ln.Close() 

    port := ln.Addr().(*net.TCPAddr).Port 

    cmd := exec.Command(
     "git", 
     "clone", 
     fmt.Sprintf("git://127.0.0.1:%d/project.git", port), 
    ) 

    cmd.Stdout = os.Stdout 
    cmd.Stderr = os.Stderr 

    if err := cmd.Start(); err != nil { 
     fmt.Fprintln(os.Stderr, err) 
     os.Exit(1) 
    } 
    defer cmd.Process.Kill() 

    errs := make(chan error, 1) 
    go func() { 
     errs <- cmd.Wait() 
    }() 

    conns := make(chan net.Conn, 1) 
    go func() { 
     conn, err := ln.Accept() 
     if err == nil { 
      conns <- conn 
     } else { 
      fmt.Println(err) 
      errs <- err 
     } 
    }() 

    select { 
    case err := <-errs: 
     fmt.Fprintln(os.Stderr, err) 
     os.Exit(1) 
    case conn := <-conns: 
     defer conn.Close() 
     // TODO Tunnel data from `conn` through another connection. 
    } 

    fmt.Println("done.") 
} 

var localhost = net.IPv4(127, 0, 0, 1) 

हालांकि, वहाँ समय है कि हम सुनना प्रारंभ और समय था जब उप आदेश वास्तव में श्रोता, जहां किसी अन्य प्रक्रिया श्रोता से जुड़ सकते हैं को जोड़ता है के बीच एक दौड़ यहाँ है। मेरा मानना ​​है कि इस दौड़ को किसी हमलावर द्वारा कनेक्शन के दूसरे छोर पर प्रक्रिया के साथ संवाद करने के लिए शोषण किया जा सकता है और परिणाम प्राप्त करने के लिए अन्यथा विशेषाधिकार वृद्धि की आवश्यकता होती है (उदाहरण के लिए विशेष अनुमतियों की आवश्यकता वाले हमलों को दुर्भावनापूर्ण प्रोग्राम के साथ git कमांड को बदलना या इस उदाहरण में क्लोन निर्देशिका की सामग्री को पढ़ना)।

क्या यह चिंता का विषय होना चाहिए? यदि हां, तो क्या ऐसा कोई तरीका है जिसे इसे रोका जा सकता है? यद्यपि प्रश्न का उपयोग उदाहरण के रूप में जाने के लिए कहा जाता है, किसी भी भाषा में उत्तर और टिप्पणियां आपका स्वागत है।

उत्तर

0

हां यह एक चिंता है। इसे प्रमाणीकरण के कुछ रूपों का उपयोग करके रोका जा सकता है ताकि आपका सर्वर केवल वैध ग्राहकों से कनेक्शन की अनुमति दे।

+1

इस मामले में प्रमाणीकरण कैसे जोड़ा जा सकता है, क्योंकि मैं ग्राहक को संशोधित नहीं कर सकता? –

0

वॉरेन ड्यू के उत्तर पर विस्तार करते हुए, मानते हैं कि सुरंग का दूसरा छोर एक एसएसएच सर्वर से जुड़ता है तो यह गिट सर्वर/क्लाइंट का प्रमाणीकरण करेगा।

इस उद्देश्य के लिए उप-आदेश में प्रमाणीकरण "जोड़ने" के लिए एक और सामान्य दृष्टिकोण है डॉकर जैसे कंटेनर में सब-कमांड को लपेटना और उप-कमांड सुरंग को कनेक्शन के माध्यम से स्वयं प्रमाणित करना है। हालांकि सुरंग की दौड़ की स्थिति अभी भी मौजूद है, यह उच्च स्तर "(यानी कंटेनर के अंदर) है, जिसका अर्थ है कि कोई विशेषाधिकार वाला हमलावर आधार प्रणाली में दौड़ की स्थिति का फायदा नहीं उठा पाएगा। इस दृष्टिकोण का नकारात्मक हिस्सा एक अंतर्निहित जटिलता है और एक कंटेनर में उप-आदेश चलाने का ओवरहेड (हालांकि न्यूनतम) है।