सुरंग करते समय सॉकेट दौड़ के सुरक्षा प्रभाव, मैं एक बंदरगाह सुनकर कनेक्शन के माध्यम से उप-आदेश को सुरंग करना चाहता हूं, उप-आदेश (उस बंदरगाह से कनेक्ट करने के लिए) चला रहा हूं, और फिर डेटा अग्रेषित करना कनेक्शन के माध्यम से:एक सब-कमांड
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
कमांड को बदलना या इस उदाहरण में क्लोन निर्देशिका की सामग्री को पढ़ना)।
क्या यह चिंता का विषय होना चाहिए? यदि हां, तो क्या ऐसा कोई तरीका है जिसे इसे रोका जा सकता है? यद्यपि प्रश्न का उपयोग उदाहरण के रूप में जाने के लिए कहा जाता है, किसी भी भाषा में उत्तर और टिप्पणियां आपका स्वागत है।
इस मामले में प्रमाणीकरण कैसे जोड़ा जा सकता है, क्योंकि मैं ग्राहक को संशोधित नहीं कर सकता? –