Skip to content

Commit 5c51d08

Browse files
authored
[supervisor] add ptrace cap for all child process (#20359)
* [supervisor] add ptrace cap for all child process * addressed feedback
1 parent 4a70961 commit 5c51d08

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

components/supervisor/pkg/supervisor/ssh.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ func (s *sshServer) handleConn(ctx context.Context, conn net.Conn) {
170170
cmd.Env = s.envvars
171171
cmd.ExtraFiles = []*os.File{socketFD}
172172
cmd.Stderr = os.Stderr
173+
174+
cmd.SysProcAttr.AmbientCaps = grantCapSysPtrace(cmd.SysProcAttr.AmbientCaps)
175+
173176
if s.cfg.WorkspaceLogRateLimit > 0 {
174177
limit := int64(s.cfg.WorkspaceLogRateLimit)
175178
cmd.Stderr = dropwriter.Writer(cmd.Stderr, dropwriter.NewBucket(limit*1024*3, limit*1024))

components/supervisor/pkg/supervisor/supervisor.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242
"github.com/prometheus/common/route"
4343
"github.com/soheilhy/cmux"
4444
"golang.org/x/crypto/ssh"
45+
"golang.org/x/sys/unix"
4546
"golang.org/x/xerrors"
4647
"google.golang.org/grpc"
4748
"google.golang.org/grpc/codes"
@@ -356,6 +357,9 @@ func Run(options ...RunOption) {
356357
Uid: gitpodUID,
357358
Gid: gitpodGID,
358359
}
360+
if !cfg.isHeadless() {
361+
termMuxSrv.DefaultAmbientCaps = grantCapSysPtrace(termMuxSrv.DefaultAmbientCaps)
362+
}
359363

360364
taskManager := newTasksManager(cfg, termMuxSrv, cstate, nil, ideReady, desktopIdeReady)
361365

@@ -1036,6 +1040,8 @@ func prepareIDELaunch(cfg *Config, ideConfig *IDEConfig) *exec.Cmd {
10361040
cmd.SysProcAttr.Setpgid = true
10371041
cmd.SysProcAttr.Pdeathsig = syscall.SIGKILL
10381042

1043+
cmd.SysProcAttr.AmbientCaps = grantCapSysPtrace(cmd.SysProcAttr.AmbientCaps)
1044+
10391045
// Here we must resist the temptation to "neaten up" the IDE output for headless builds.
10401046
// This would break the JSON parsing of the headless builds.
10411047
cmd.Stdout = os.Stdout
@@ -1978,3 +1984,9 @@ func waitForIde(parent context.Context, ideReady *ideReadyState, desktopIdeReady
19781984
}
19791985
return true, ""
19801986
}
1987+
1988+
// We grant ptrace for IDE, terminal, ssh and their child process
1989+
// It's make IDE attach more easier
1990+
func grantCapSysPtrace(caps []uintptr) []uintptr {
1991+
return append(caps, unix.CAP_SYS_PTRACE)
1992+
}

components/supervisor/pkg/terminal/service.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,10 @@ type MuxTerminalService struct {
4848
// if returns empty string then DefaultWorkdir is used
4949
DefaultWorkdirProvider func() string
5050

51-
DefaultShell string
52-
Env []string
53-
DefaultCreds *syscall.Credential
51+
DefaultShell string
52+
Env []string
53+
DefaultCreds *syscall.Credential
54+
DefaultAmbientCaps []uintptr
5455

5556
api.UnimplementedTerminalServiceServer
5657
}
@@ -109,6 +110,14 @@ func (srv *MuxTerminalService) OpenWithOptions(ctx context.Context, req *api.Ope
109110
Y: uint16(req.Size.HeightPx),
110111
}
111112
}
113+
114+
if srv.DefaultAmbientCaps != nil {
115+
if cmd.SysProcAttr == nil {
116+
cmd.SysProcAttr = &syscall.SysProcAttr{}
117+
}
118+
cmd.SysProcAttr.AmbientCaps = srv.DefaultAmbientCaps
119+
}
120+
112121
alias, err := srv.Mux.Start(cmd, options)
113122
if err != nil {
114123
return nil, status.Error(codes.Internal, err.Error())

0 commit comments

Comments
 (0)