#!/usr/bin/env bats load helpers function setup() { setup_busybox # Create fake rootfs. mkdir rootfs/testdir echo "Forbidden information!" >rootfs/testfile # add extra masked paths update_config '(.. | select(.maskedPaths? != null)) .maskedPaths += ["/testdir", "/testfile"]' } function teardown() { teardown_bundle } @test "mask paths [file]" { # run busybox detached runc run -d --console-socket "$CONSOLE_SOCKET" test_busybox [ "$status" -eq 0 ] runc exec test_busybox cat /testfile [ "$status" -eq 0 ] [[ "${output}" == "" ]] runc exec test_busybox rm -f /testfile [ "$status" -eq 1 ] [[ "${output}" == *"Read-only file system"* ]] runc exec test_busybox umount /testfile [ "$status" -eq 1 ] [[ "${output}" == *"Operation not permitted"* ]] } @test "mask paths [directory]" { # run busybox detached runc run -d --console-socket "$CONSOLE_SOCKET" test_busybox [ "$status" -eq 0 ] runc exec test_busybox ls /testdir [ "$status" -eq 0 ] [[ "${output}" == "" ]] runc exec test_busybox touch /testdir/foo [ "$status" -eq 1 ] [[ "${output}" == *"Read-only file system"* ]] runc exec test_busybox rm -rf /testdir [ "$status" -eq 1 ] [[ "${output}" == *"Read-only file system"* ]] runc exec test_busybox umount /testdir [ "$status" -eq 1 ] [[ "${output}" == *"Operation not permitted"* ]] } @test "mask paths [prohibit symlink /proc]" { ln -s /symlink rootfs/proc runc run -d --console-socket "$CONSOLE_SOCKET" test_busybox [ "$status" -eq 1 ] [[ "${output}" == *"must be mounted on ordinary directory"* ]] } @test "mask paths [prohibit symlink /sys]" { # In rootless containers, /sys is a bind mount not a real sysfs. requires root ln -s /symlink rootfs/sys runc run -d --console-socket "$CONSOLE_SOCKET" test_busybox [ "$status" -eq 1 ] # On cgroup v1, this may fail before checking if /sys is a symlink, # so we merely check that it fails, and do not check the exact error # message like for /proc above. }