Tôi muốn tunnel một lệnh phụ thông qua kết nối bằng cách nghe một cổng, chạy lệnh phụ (để kết nối với cổng đó), và sau đó chuyển tiếp dữ liệu thông qua kết nối:Tác động an ninh của cuộc đua ổ cắm khi đường hầm một lệnh phụ
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)
Tuy nhiên, có một chủng tộc ở đây giữa thời điểm đó chúng tôi bắt đầu nghe và thời gian khi các tiểu lệnh thực sự kết nối với người nghe, nơi quá trình khác có thể kết nối với người nghe. Tôi tin rằng cuộc đua này có thể được khai thác bởi kẻ tấn công để giao tiếp với quá trình ở đầu kia của kết nối và đạt được kết quả mà nếu không yêu cầu leo thang đặc quyền để thực hiện (ví dụ: các cuộc tấn công yêu cầu quyền đặc biệt sẽ thay thế lệnh git
bằng chương trình độc hại hoặc chỉ cần đọc nội dung của thư mục được nhân bản, trong trường hợp này).
Đây có phải là mối quan tâm không? Nếu vậy, có cách nào nó có thể được ngăn chặn không? Mặc dù câu hỏi được yêu cầu bằng cách sử dụng Go làm ví dụ, câu trả lời và nhận xét bằng mọi ngôn ngữ đều được chào đón.
Làm cách nào để xác thực có thể được thêm vào trong trường hợp này, vì tôi không thể sửa đổi ứng dụng khách? –