@@ -1510,6 +1510,7 @@ pid_t setup_trace_fixture(struct __test_metadata *_metadata,
1510
1510
1511
1511
return tracer_pid ;
1512
1512
}
1513
+
1513
1514
void teardown_trace_fixture (struct __test_metadata * _metadata ,
1514
1515
pid_t tracer )
1515
1516
{
@@ -1789,7 +1790,7 @@ void change_syscall(struct __test_metadata *_metadata,
1789
1790
EXPECT_EQ (0 , ret );
1790
1791
}
1791
1792
1792
- void tracer_syscall (struct __test_metadata * _metadata , pid_t tracee ,
1793
+ void tracer_seccomp (struct __test_metadata * _metadata , pid_t tracee ,
1793
1794
int status , void * args )
1794
1795
{
1795
1796
int ret ;
@@ -1866,6 +1867,24 @@ FIXTURE(TRACE_syscall) {
1866
1867
pid_t tracer , mytid , mypid , parent ;
1867
1868
};
1868
1869
1870
+ FIXTURE_VARIANT (TRACE_syscall ) {
1871
+ /*
1872
+ * All of the SECCOMP_RET_TRACE behaviors can be tested with either
1873
+ * SECCOMP_RET_TRACE+PTRACE_CONT or plain ptrace()+PTRACE_SYSCALL.
1874
+ * This indicates if we should use SECCOMP_RET_TRACE (false), or
1875
+ * ptrace (true).
1876
+ */
1877
+ bool use_ptrace ;
1878
+ };
1879
+
1880
+ FIXTURE_VARIANT_ADD (TRACE_syscall , ptrace ) {
1881
+ .use_ptrace = true,
1882
+ };
1883
+
1884
+ FIXTURE_VARIANT_ADD (TRACE_syscall , seccomp ) {
1885
+ .use_ptrace = false,
1886
+ };
1887
+
1869
1888
FIXTURE_SETUP (TRACE_syscall )
1870
1889
{
1871
1890
struct sock_filter filter [] = {
@@ -1881,12 +1900,11 @@ FIXTURE_SETUP(TRACE_syscall)
1881
1900
BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_TRACE | 0x1005 ),
1882
1901
BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_ALLOW ),
1883
1902
};
1884
-
1885
- memset (& self -> prog , 0 , sizeof (self -> prog ));
1886
- self -> prog .filter = malloc (sizeof (filter ));
1887
- ASSERT_NE (NULL , self -> prog .filter );
1888
- memcpy (self -> prog .filter , filter , sizeof (filter ));
1889
- self -> prog .len = (unsigned short )ARRAY_SIZE (filter );
1903
+ struct sock_fprog prog = {
1904
+ .len = (unsigned short )ARRAY_SIZE (filter ),
1905
+ .filter = filter ,
1906
+ };
1907
+ long ret ;
1890
1908
1891
1909
/* Prepare some testable syscall results. */
1892
1910
self -> mytid = syscall (__NR_gettid );
@@ -1904,109 +1922,53 @@ FIXTURE_SETUP(TRACE_syscall)
1904
1922
ASSERT_NE (self -> parent , self -> mypid );
1905
1923
1906
1924
/* Launch tracer. */
1907
- self -> tracer = setup_trace_fixture (_metadata , tracer_syscall , NULL ,
1908
- false);
1909
- }
1910
-
1911
- FIXTURE_TEARDOWN (TRACE_syscall )
1912
- {
1913
- teardown_trace_fixture (_metadata , self -> tracer );
1914
- if (self -> prog .filter )
1915
- free (self -> prog .filter );
1916
- }
1925
+ self -> tracer = setup_trace_fixture (_metadata ,
1926
+ variant -> use_ptrace ? tracer_ptrace
1927
+ : tracer_seccomp ,
1928
+ NULL , variant -> use_ptrace );
1917
1929
1918
- TEST_F (TRACE_syscall , ptrace_syscall_redirected )
1919
- {
1920
- /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
1921
- teardown_trace_fixture (_metadata , self -> tracer );
1922
- self -> tracer = setup_trace_fixture (_metadata , tracer_ptrace , NULL ,
1923
- true);
1924
-
1925
- /* Tracer will redirect getpid to getppid. */
1926
- EXPECT_NE (self -> mypid , syscall (__NR_getpid ));
1927
- }
1930
+ ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
1931
+ ASSERT_EQ (0 , ret );
1928
1932
1929
- TEST_F (TRACE_syscall , ptrace_syscall_errno )
1930
- {
1931
- /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
1932
- teardown_trace_fixture (_metadata , self -> tracer );
1933
- self -> tracer = setup_trace_fixture (_metadata , tracer_ptrace , NULL ,
1934
- true);
1933
+ if (variant -> use_ptrace )
1934
+ return ;
1935
1935
1936
- /* Tracer should skip the open syscall, resulting in ESRCH. */
1937
- EXPECT_SYSCALL_RETURN ( - ESRCH , syscall ( __NR_openat ) );
1936
+ ret = prctl ( PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & prog , 0 , 0 );
1937
+ ASSERT_EQ ( 0 , ret );
1938
1938
}
1939
1939
1940
- TEST_F (TRACE_syscall , ptrace_syscall_faked )
1940
+ FIXTURE_TEARDOWN (TRACE_syscall )
1941
1941
{
1942
- /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
1943
1942
teardown_trace_fixture (_metadata , self -> tracer );
1944
- self -> tracer = setup_trace_fixture (_metadata , tracer_ptrace , NULL ,
1945
- true);
1946
-
1947
- /* Tracer should skip the gettid syscall, resulting fake pid. */
1948
- EXPECT_SYSCALL_RETURN (45000 , syscall (__NR_gettid ));
1949
1943
}
1950
1944
1951
1945
TEST_F (TRACE_syscall , syscall_allowed )
1952
1946
{
1953
- long ret ;
1954
-
1955
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
1956
- ASSERT_EQ (0 , ret );
1957
-
1958
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & self -> prog , 0 , 0 );
1959
- ASSERT_EQ (0 , ret );
1960
-
1961
1947
/* getppid works as expected (no changes). */
1962
1948
EXPECT_EQ (self -> parent , syscall (__NR_getppid ));
1963
1949
EXPECT_NE (self -> mypid , syscall (__NR_getppid ));
1964
1950
}
1965
1951
1966
1952
TEST_F (TRACE_syscall , syscall_redirected )
1967
1953
{
1968
- long ret ;
1969
-
1970
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
1971
- ASSERT_EQ (0 , ret );
1972
-
1973
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & self -> prog , 0 , 0 );
1974
- ASSERT_EQ (0 , ret );
1975
-
1976
1954
/* getpid has been redirected to getppid as expected. */
1977
1955
EXPECT_EQ (self -> parent , syscall (__NR_getpid ));
1978
1956
EXPECT_NE (self -> mypid , syscall (__NR_getpid ));
1979
1957
}
1980
1958
1981
1959
TEST_F (TRACE_syscall , syscall_errno )
1982
1960
{
1983
- long ret ;
1984
-
1985
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
1986
- ASSERT_EQ (0 , ret );
1987
-
1988
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & self -> prog , 0 , 0 );
1989
- ASSERT_EQ (0 , ret );
1990
-
1991
- /* openat has been skipped and an errno return. */
1961
+ /* Tracer should skip the open syscall, resulting in ESRCH. */
1992
1962
EXPECT_SYSCALL_RETURN (- ESRCH , syscall (__NR_openat ));
1993
1963
}
1994
1964
1995
1965
TEST_F (TRACE_syscall , syscall_faked )
1996
1966
{
1997
- long ret ;
1998
-
1999
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
2000
- ASSERT_EQ (0 , ret );
2001
-
2002
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & self -> prog , 0 , 0 );
2003
- ASSERT_EQ (0 , ret );
2004
-
2005
- /* gettid has been skipped and an altered return value stored. */
1967
+ /* Tracer skips the gettid syscall and store altered return value. */
2006
1968
EXPECT_SYSCALL_RETURN (45000 , syscall (__NR_gettid ));
2007
1969
}
2008
1970
2009
- TEST_F (TRACE_syscall , skip_after_RET_TRACE )
1971
+ TEST_F (TRACE_syscall , skip_after )
2010
1972
{
2011
1973
struct sock_filter filter [] = {
2012
1974
BPF_STMT (BPF_LD |BPF_W |BPF_ABS ,
@@ -2021,14 +1983,7 @@ TEST_F(TRACE_syscall, skip_after_RET_TRACE)
2021
1983
};
2022
1984
long ret ;
2023
1985
2024
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
2025
- ASSERT_EQ (0 , ret );
2026
-
2027
- /* Install fixture filter. */
2028
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & self -> prog , 0 , 0 );
2029
- ASSERT_EQ (0 , ret );
2030
-
2031
- /* Install "errno on getppid" filter. */
1986
+ /* Install additional "errno on getppid" filter. */
2032
1987
ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & prog , 0 , 0 );
2033
1988
ASSERT_EQ (0 , ret );
2034
1989
@@ -2038,7 +1993,7 @@ TEST_F(TRACE_syscall, skip_after_RET_TRACE)
2038
1993
EXPECT_EQ (EPERM , errno );
2039
1994
}
2040
1995
2041
- TEST_F_SIGNAL (TRACE_syscall , kill_after_RET_TRACE , SIGSYS )
1996
+ TEST_F_SIGNAL (TRACE_syscall , kill_after , SIGSYS )
2042
1997
{
2043
1998
struct sock_filter filter [] = {
2044
1999
BPF_STMT (BPF_LD |BPF_W |BPF_ABS ,
@@ -2053,77 +2008,7 @@ TEST_F_SIGNAL(TRACE_syscall, kill_after_RET_TRACE, SIGSYS)
2053
2008
};
2054
2009
long ret ;
2055
2010
2056
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
2057
- ASSERT_EQ (0 , ret );
2058
-
2059
- /* Install fixture filter. */
2060
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & self -> prog , 0 , 0 );
2061
- ASSERT_EQ (0 , ret );
2062
-
2063
- /* Install "death on getppid" filter. */
2064
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & prog , 0 , 0 );
2065
- ASSERT_EQ (0 , ret );
2066
-
2067
- /* Tracer will redirect getpid to getppid, and we should die. */
2068
- EXPECT_NE (self -> mypid , syscall (__NR_getpid ));
2069
- }
2070
-
2071
- TEST_F (TRACE_syscall , skip_after_ptrace )
2072
- {
2073
- struct sock_filter filter [] = {
2074
- BPF_STMT (BPF_LD |BPF_W |BPF_ABS ,
2075
- offsetof(struct seccomp_data , nr )),
2076
- BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_getppid , 0 , 1 ),
2077
- BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_ERRNO | EPERM ),
2078
- BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_ALLOW ),
2079
- };
2080
- struct sock_fprog prog = {
2081
- .len = (unsigned short )ARRAY_SIZE (filter ),
2082
- .filter = filter ,
2083
- };
2084
- long ret ;
2085
-
2086
- /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
2087
- teardown_trace_fixture (_metadata , self -> tracer );
2088
- self -> tracer = setup_trace_fixture (_metadata , tracer_ptrace , NULL ,
2089
- true);
2090
-
2091
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
2092
- ASSERT_EQ (0 , ret );
2093
-
2094
- /* Install "errno on getppid" filter. */
2095
- ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & prog , 0 , 0 );
2096
- ASSERT_EQ (0 , ret );
2097
-
2098
- /* Tracer will redirect getpid to getppid, and we should see EPERM. */
2099
- EXPECT_EQ (-1 , syscall (__NR_getpid ));
2100
- EXPECT_EQ (EPERM , errno );
2101
- }
2102
-
2103
- TEST_F_SIGNAL (TRACE_syscall , kill_after_ptrace , SIGSYS )
2104
- {
2105
- struct sock_filter filter [] = {
2106
- BPF_STMT (BPF_LD |BPF_W |BPF_ABS ,
2107
- offsetof(struct seccomp_data , nr )),
2108
- BPF_JUMP (BPF_JMP |BPF_JEQ |BPF_K , __NR_getppid , 0 , 1 ),
2109
- BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_KILL ),
2110
- BPF_STMT (BPF_RET |BPF_K , SECCOMP_RET_ALLOW ),
2111
- };
2112
- struct sock_fprog prog = {
2113
- .len = (unsigned short )ARRAY_SIZE (filter ),
2114
- .filter = filter ,
2115
- };
2116
- long ret ;
2117
-
2118
- /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
2119
- teardown_trace_fixture (_metadata , self -> tracer );
2120
- self -> tracer = setup_trace_fixture (_metadata , tracer_ptrace , NULL ,
2121
- true);
2122
-
2123
- ret = prctl (PR_SET_NO_NEW_PRIVS , 1 , 0 , 0 , 0 );
2124
- ASSERT_EQ (0 , ret );
2125
-
2126
- /* Install "death on getppid" filter. */
2011
+ /* Install additional "death on getppid" filter. */
2127
2012
ret = prctl (PR_SET_SECCOMP , SECCOMP_MODE_FILTER , & prog , 0 , 0 );
2128
2013
ASSERT_EQ (0 , ret );
2129
2014
0 commit comments