golang/go

os/exec: LookPath() doesn't consider chroot

Open

#39,341 建立於 2020年6月1日

在 GitHub 查看
 (5 留言) (0 反應) (0 負責人)Go (19,008 fork)batch import
NeedsInvestigationhelp wanted

倉庫指標

Star
 (133,883 star)
PR 合併指標
 (30 天內沒有已合併 PR)

描述

What version of Go are you using (go version)?

Does this issue reproduce with the latest release?

yes

What operating system and processor architecture are you using (go env)?

What did you do?

package main

import (
	"log"
	"os"
	"os/exec"
	"syscall"
)

func main() {
	cmd := exec.Command("hello")
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Dir = "/"
	cmd.Env = []string{"PATH=/bin"}
	cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: "/home/scottclarke/chroot"}
	if err := cmd.Start(); err != nil {
		log.Fatalf("%#v", err.Error())
	}
	cmd.Wait()
}

Where /home/scottclarke/chroot contains a chroot which has an executable file /bin/hello, and there is no executable hello in the PATH of the system prior to the chroot.

What did you expect to see?

The hello executable being run, producing the output hello world.

What did you see instead?

The following error: 2020/06/01 11:36:32 "exec: \"hello\": executable file not found in $PATH"

This happens because the exec.Command() function calls LookPath() and sets the lookPathErr if it fails, which is checked in Start() and causes a failure. However this doesn't take into account the fact that the command will be run in a chroot.

貢獻者指南