Skip to content

Commit 06e34e5

Browse files
committed
syscall: disable ptrace on iOS
It is forbidden by App Store. Fixes #31628 Change-Id: Ie6d14a524ee55b57af8db685f3a79f474733add5 Reviewed-on: https://go-review.googlesource.com/c/go/+/182297 TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 8eec3fe commit 06e34e5

16 files changed

+95
-71
lines changed

src/syscall/exec_darwin.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
8080

8181
// Enable tracing if requested.
8282
if sys.Ptrace {
83-
_, _, err1 = rawSyscall(funcPC(libc_ptrace_trampoline), uintptr(PTRACE_TRACEME), 0, 0)
84-
if err1 != 0 {
83+
if err := ptrace(PTRACE_TRACEME, 0, 0, 0); err != nil {
84+
err1 = err.(Errno)
8585
goto childerror
8686
}
8787
}

src/syscall/mksyscall.pl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ ($)
130130
# without reading the header.
131131
$text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n";
132132

133+
if ($darwin && $func eq "ptrace") {
134+
# The ptrace function is called from forkAndExecInChild where stack
135+
# growth is forbidden.
136+
$text .= "//go:nosplit\n"
137+
}
138+
133139
# Go function header.
134140
my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : "";
135141
$text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl;

src/syscall/syscall_darwin.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ func direntNamlen(buf []byte) (uint64, bool) {
8787
return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
8888
}
8989

90-
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
9190
func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
9291
func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
9392

src/syscall/syscall_darwin_386.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func setTimeval(sec, usec int64) Timeval {
2121
//sys Stat(path string, stat *Stat_t) (err error) = SYS_stat64
2222
//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_statfs64
2323
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_fstatat64
24+
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
2425

2526
func SetKevent(k *Kevent_t, fd, mode, flags int) {
2627
k.Ident = uint32(fd)

src/syscall/syscall_darwin_amd64.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func setTimeval(sec, usec int64) Timeval {
2121
//sys Stat(path string, stat *Stat_t) (err error) = SYS_stat64
2222
//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_statfs64
2323
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_fstatat64
24+
//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
2425

2526
func SetKevent(k *Kevent_t, fd, mode, flags int) {
2627
k.Ident = uint64(fd)

src/syscall/syscall_darwin_arm.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ func setTimeval(sec, usec int64) Timeval {
2222
//sys Statfs(path string, stat *Statfs_t) (err error)
2323
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
2424

25+
// Marked nosplit because it is called from forkAndExecInChild where
26+
// stack growth is forbidden.
27+
//go:nosplit
28+
func ptrace(request int, pid int, addr uintptr, data uintptr) error {
29+
return ENOTSUP
30+
}
31+
2532
func SetKevent(k *Kevent_t, fd, mode, flags int) {
2633
k.Ident = uint32(fd)
2734
k.Filter = int16(mode)

src/syscall/syscall_darwin_arm64.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ func setTimeval(sec, usec int64) Timeval {
2222
//sys Statfs(path string, stat *Statfs_t) (err error)
2323
//sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
2424

25+
// Marked nosplit because it is called from forkAndExecInChild where
26+
// stack growth is forbidden.
27+
//go:nosplit
28+
func ptrace(request int, pid int, addr uintptr, data uintptr) error {
29+
return ENOTSUP
30+
}
31+
2532
func SetKevent(k *Kevent_t, fd, mode, flags int) {
2633
k.Ident = uint64(fd)
2734
k.Filter = int16(mode)

src/syscall/syscall_ptrace_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2019 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
// +build darwin dragonfly freebsd linux netbsd openbsd
6+
7+
package syscall_test
8+
9+
import (
10+
"internal/testenv"
11+
"os"
12+
"os/exec"
13+
"syscall"
14+
"testing"
15+
)
16+
17+
func TestExecPtrace(t *testing.T) {
18+
testenv.MustHaveExec(t)
19+
20+
bin, err := exec.LookPath("sh")
21+
if err != nil {
22+
t.Skipf("skipped because sh is not available")
23+
}
24+
25+
attr := &os.ProcAttr{
26+
Sys: &syscall.SysProcAttr{
27+
Ptrace: true,
28+
},
29+
}
30+
proc, err := os.StartProcess(bin, []string{bin}, attr)
31+
if err != nil {
32+
t.Fatalf("StartProcess with ptrace enabled failed: %v", err)
33+
}
34+
proc.Kill()
35+
}

src/syscall/zsyscall_darwin_386.go

Lines changed: 16 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_darwin_386.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
5353
JMP libc_futimes(SB)
5454
TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
5555
JMP libc_fcntl(SB)
56-
TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
57-
JMP libc_ptrace(SB)
5856
TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
5957
JMP libc_pipe(SB)
6058
TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0
@@ -251,3 +249,5 @@ TEXT ·libc_statfs64_trampoline(SB),NOSPLIT,$0-0
251249
JMP libc_statfs64(SB)
252250
TEXT ·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0
253251
JMP libc_fstatat64(SB)
252+
TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
253+
JMP libc_ptrace(SB)

src/syscall/zsyscall_darwin_amd64.go

Lines changed: 16 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_darwin_amd64.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
5353
JMP libc_futimes(SB)
5454
TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
5555
JMP libc_fcntl(SB)
56-
TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
57-
JMP libc_ptrace(SB)
5856
TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
5957
JMP libc_pipe(SB)
6058
TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0
@@ -251,3 +249,5 @@ TEXT ·libc_statfs64_trampoline(SB),NOSPLIT,$0-0
251249
JMP libc_statfs64(SB)
252250
TEXT ·libc_fstatat64_trampoline(SB),NOSPLIT,$0-0
253251
JMP libc_fstatat64(SB)
252+
TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
253+
JMP libc_ptrace(SB)

src/syscall/zsyscall_darwin_arm.go

Lines changed: 0 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_darwin_arm.s

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
5353
JMP libc_futimes(SB)
5454
TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
5555
JMP libc_fcntl(SB)
56-
TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
57-
JMP libc_ptrace(SB)
5856
TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
5957
JMP libc_pipe(SB)
6058
TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0

src/syscall/zsyscall_darwin_arm64.go

Lines changed: 0 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/syscall/zsyscall_darwin_arm64.s

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0
5353
JMP libc_futimes(SB)
5454
TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0
5555
JMP libc_fcntl(SB)
56-
TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0
57-
JMP libc_ptrace(SB)
5856
TEXT ·libc_pipe_trampoline(SB),NOSPLIT,$0-0
5957
JMP libc_pipe(SB)
6058
TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0

0 commit comments

Comments
 (0)