Skip to content

Commit 1d2af06

Browse files
authored
Test no escalate in exec (#41)
* test no escalate Signed-off-by: Caleb Lloyd <[email protected]> * use logger in test-no-escalate Signed-off-by: Caleb Lloyd <[email protected]> --------- Signed-off-by: Caleb Lloyd <[email protected]>
1 parent c639d9b commit 1d2af06

File tree

5 files changed

+58
-0
lines changed

5 files changed

+58
-0
lines changed

docker/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/fs-stage/usr/local/bin/fixuid
2+
/fs-stage/usr/local/bin/test-no-escalate
23
stage

test-no-escalate/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/test-no-escalate

test-no-escalate/build.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/bin/sh -e
2+
cd "$(dirname "$0")"
3+
4+
rm -f ./test-no-escalate
5+
CGO_ENABLED=0 go build
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"os"
6+
"syscall"
7+
)
8+
9+
var logger = log.New(os.Stderr, "", 0)
10+
11+
func main() {
12+
logger.SetPrefix("test-no-escalate: ")
13+
14+
logger.Printf("Current UID: %d, GID: %d", os.Getuid(), os.Getgid())
15+
logger.Printf("Current EUID: %d, EGID: %d", os.Geteuid(), os.Getegid())
16+
17+
// Test that both seteuid(0) and setegid(0) fail as expected
18+
euidError := syscall.Seteuid(0)
19+
egidError := syscall.Setegid(0)
20+
21+
if euidError != nil && egidError != nil {
22+
logger.Printf("Got expected error when setting EUID to 0: %v", euidError)
23+
logger.Printf("Got expected error when setting EGID to 0: %v", egidError)
24+
// This is the expected behavior - exit with success
25+
os.Exit(0)
26+
} else {
27+
// At least one of them succeeded, which is a security vulnerability
28+
if euidError == nil {
29+
logger.Printf("ERROR: Successfully set EUID to 0. New EUID: %d", os.Geteuid())
30+
}
31+
if egidError == nil {
32+
logger.Printf("ERROR: Successfully set EGID to 0. New EGID: %d", os.Getegid())
33+
}
34+
// Exit with failure
35+
os.Exit(1)
36+
}
37+
}

test.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,21 @@
22
cd $(dirname $0)
33
set -e
44

5+
# build fixuid
56
./build.sh
67
mv fixuid docker/fs-stage/usr/local/bin
8+
9+
# build test-no-escalate
10+
./test-no-escalate/build.sh
11+
mv test-no-escalate/test-no-escalate docker/fs-stage/usr/local/bin
12+
713
rm -rf docker/alpine/stage
814
cp -r docker/fs-stage docker/alpine/stage
915
rm -rf docker/centos/stage
1016
cp -r docker/fs-stage docker/centos/stage
1117
rm -rf docker/debian/stage
1218
cp -r docker/fs-stage docker/debian/stage
19+
1320
docker compose build
1421

1522
echo "\nalpine default user/group cmd"
@@ -110,6 +117,13 @@ docker run --rm --entrypoint fixuid fixuid-centos -q fixuid-test.sh docker docke
110117
echo "\ndebian quiet entrypoint"
111118
docker run --rm --entrypoint fixuid fixuid-debian -q fixuid-test.sh docker docker 'docker users'
112119

120+
echo "\nalpine test no escalate"
121+
docker run --rm --entrypoint fixuid fixuid-alpine test-no-escalate
122+
echo "\ncentos test no escalate"
123+
docker run --rm --entrypoint fixuid fixuid-centos test-no-escalate
124+
echo "\ndebian test no escalate"
125+
docker run --rm --entrypoint fixuid fixuid-debian test-no-escalate
126+
113127
printf "\npaths:\n - /\n - /home/docker\n - /tmp/space dir\n - /does/not/exist" >> docker/alpine/stage/etc/fixuid/config.yml
114128
printf "\npaths:\n - /\n - /home/docker\n - /tmp/space dir\n - /does/not/exist" >> docker/centos/stage/etc/fixuid/config.yml
115129
printf "\npaths:\n - /\n - /home/docker\n - /tmp/space dir\n - /does/not/exist" >> docker/debian/stage/etc/fixuid/config.yml

0 commit comments

Comments
 (0)