【发布时间】:2015-08-29 17:16:02
【问题描述】:
我想通过监听一个端口,运行子命令(以连接到该端口),然后通过连接转发数据来通过连接隧道传输子命令:
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命令替换为恶意程序或简单地读取克隆目录的内容,在这种情况下)。
这应该是一个问题吗?如果是这样,有什么方法可以预防吗?尽管以 Go 为例提出问题,但欢迎使用任何语言的答案和 cmets。
【问题讨论】:
标签: sockets security network-programming race-condition tunnel