seccomp_bpf.c 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418
  1. /*
  2. * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
  3. * Use of this source code is governed by the GPLv2 license.
  4. *
  5. * Test code for seccomp bpf.
  6. */
  7. #include <sys/types.h>
  8. #include <asm/siginfo.h>
  9. #define __have_siginfo_t 1
  10. #define __have_sigval_t 1
  11. #define __have_sigevent_t 1
  12. #include <errno.h>
  13. #include <linux/filter.h>
  14. #include <sys/prctl.h>
  15. #include <sys/ptrace.h>
  16. #include <sys/user.h>
  17. #include <linux/prctl.h>
  18. #include <linux/ptrace.h>
  19. #include <linux/seccomp.h>
  20. #include <pthread.h>
  21. #include <semaphore.h>
  22. #include <signal.h>
  23. #include <stddef.h>
  24. #include <stdbool.h>
  25. #include <string.h>
  26. #include <time.h>
  27. #include <linux/elf.h>
  28. #include <sys/uio.h>
  29. #include <sys/utsname.h>
  30. #include <sys/fcntl.h>
  31. #include <sys/mman.h>
  32. #include <sys/times.h>
  33. #define _GNU_SOURCE
  34. #include <unistd.h>
  35. #include <sys/syscall.h>
  36. #include "test_harness.h"
  37. #ifndef PR_SET_PTRACER
  38. # define PR_SET_PTRACER 0x59616d61
  39. #endif
  40. #ifndef PR_SET_NO_NEW_PRIVS
  41. #define PR_SET_NO_NEW_PRIVS 38
  42. #define PR_GET_NO_NEW_PRIVS 39
  43. #endif
  44. #ifndef PR_SECCOMP_EXT
  45. #define PR_SECCOMP_EXT 43
  46. #endif
  47. #ifndef SECCOMP_EXT_ACT
  48. #define SECCOMP_EXT_ACT 1
  49. #endif
  50. #ifndef SECCOMP_EXT_ACT_TSYNC
  51. #define SECCOMP_EXT_ACT_TSYNC 1
  52. #endif
  53. #ifndef SECCOMP_MODE_STRICT
  54. #define SECCOMP_MODE_STRICT 1
  55. #endif
  56. #ifndef SECCOMP_MODE_FILTER
  57. #define SECCOMP_MODE_FILTER 2
  58. #endif
  59. #ifndef SECCOMP_RET_KILL
  60. #define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */
  61. #define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
  62. #define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
  63. #define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
  64. #define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
  65. /* Masks for the return value sections. */
  66. #define SECCOMP_RET_ACTION 0x7fff0000U
  67. #define SECCOMP_RET_DATA 0x0000ffffU
  68. struct seccomp_data {
  69. int nr;
  70. __u32 arch;
  71. __u64 instruction_pointer;
  72. __u64 args[6];
  73. };
  74. #endif
  75. #if __BYTE_ORDER == __LITTLE_ENDIAN
  76. #define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]))
  77. #elif __BYTE_ORDER == __BIG_ENDIAN
  78. #define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]) + sizeof(__u32))
  79. #else
  80. #error "wut? Unknown __BYTE_ORDER?!"
  81. #endif
  82. #define SIBLING_EXIT_UNKILLED 0xbadbeef
  83. #define SIBLING_EXIT_FAILURE 0xbadface
  84. #define SIBLING_EXIT_NEWPRIVS 0xbadfeed
  85. TEST(mode_strict_support)
  86. {
  87. long ret;
  88. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
  89. ASSERT_EQ(0, ret) {
  90. TH_LOG("Kernel does not support CONFIG_SECCOMP");
  91. }
  92. syscall(__NR_exit, 1);
  93. }
  94. TEST_SIGNAL(mode_strict_cannot_call_prctl, SIGKILL)
  95. {
  96. long ret;
  97. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
  98. ASSERT_EQ(0, ret) {
  99. TH_LOG("Kernel does not support CONFIG_SECCOMP");
  100. }
  101. syscall(__NR_prctl, PR_SET_SECCOMP, SECCOMP_MODE_FILTER,
  102. NULL, NULL, NULL);
  103. EXPECT_FALSE(true) {
  104. TH_LOG("Unreachable!");
  105. }
  106. }
  107. /* Note! This doesn't test no new privs behavior */
  108. TEST(no_new_privs_support)
  109. {
  110. long ret;
  111. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  112. EXPECT_EQ(0, ret) {
  113. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  114. }
  115. }
  116. /* Tests kernel support by checking for a copy_from_user() fault on * NULL. */
  117. TEST(mode_filter_support)
  118. {
  119. long ret;
  120. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
  121. ASSERT_EQ(0, ret) {
  122. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  123. }
  124. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL);
  125. EXPECT_EQ(-1, ret);
  126. EXPECT_EQ(EFAULT, errno) {
  127. TH_LOG("Kernel does not support CONFIG_SECCOMP_FILTER!");
  128. }
  129. }
  130. TEST(mode_filter_without_nnp)
  131. {
  132. struct sock_filter filter[] = {
  133. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  134. };
  135. struct sock_fprog prog = {
  136. .len = (unsigned short)ARRAY_SIZE(filter),
  137. .filter = filter,
  138. };
  139. long ret;
  140. ret = prctl(PR_GET_NO_NEW_PRIVS, 0, NULL, 0, 0);
  141. ASSERT_LE(0, ret) {
  142. TH_LOG("Expected 0 or unsupported for NO_NEW_PRIVS");
  143. }
  144. errno = 0;
  145. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  146. /* Succeeds with CAP_SYS_ADMIN, fails without */
  147. /* TODO(wad) check caps not euid */
  148. if (geteuid()) {
  149. EXPECT_EQ(-1, ret);
  150. EXPECT_EQ(EACCES, errno);
  151. } else {
  152. EXPECT_EQ(0, ret);
  153. }
  154. }
  155. #define MAX_INSNS_PER_PATH 32768
  156. TEST(filter_size_limits)
  157. {
  158. int i;
  159. int count = BPF_MAXINSNS + 1;
  160. struct sock_filter allow[] = {
  161. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  162. };
  163. struct sock_filter *filter;
  164. struct sock_fprog prog = { };
  165. long ret;
  166. filter = calloc(count, sizeof(*filter));
  167. ASSERT_NE(NULL, filter);
  168. for (i = 0; i < count; i++)
  169. filter[i] = allow[0];
  170. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  171. ASSERT_EQ(0, ret);
  172. prog.filter = filter;
  173. prog.len = count;
  174. /* Too many filter instructions in a single filter. */
  175. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  176. ASSERT_NE(0, ret) {
  177. TH_LOG("Installing %d insn filter was allowed", prog.len);
  178. }
  179. /* One less is okay, though. */
  180. prog.len -= 1;
  181. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  182. ASSERT_EQ(0, ret) {
  183. TH_LOG("Installing %d insn filter wasn't allowed", prog.len);
  184. }
  185. }
  186. TEST(filter_chain_limits)
  187. {
  188. int i;
  189. int count = BPF_MAXINSNS;
  190. struct sock_filter allow[] = {
  191. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  192. };
  193. struct sock_filter *filter;
  194. struct sock_fprog prog = { };
  195. long ret;
  196. filter = calloc(count, sizeof(*filter));
  197. ASSERT_NE(NULL, filter);
  198. for (i = 0; i < count; i++)
  199. filter[i] = allow[0];
  200. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  201. ASSERT_EQ(0, ret);
  202. prog.filter = filter;
  203. prog.len = 1;
  204. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  205. ASSERT_EQ(0, ret);
  206. prog.len = count;
  207. /* Too many total filter instructions. */
  208. for (i = 0; i < MAX_INSNS_PER_PATH; i++) {
  209. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  210. if (ret != 0)
  211. break;
  212. }
  213. ASSERT_NE(0, ret) {
  214. TH_LOG("Allowed %d %d-insn filters (total with penalties:%d)",
  215. i, count, i * (count + 4));
  216. }
  217. }
  218. TEST(mode_filter_cannot_move_to_strict)
  219. {
  220. struct sock_filter filter[] = {
  221. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  222. };
  223. struct sock_fprog prog = {
  224. .len = (unsigned short)ARRAY_SIZE(filter),
  225. .filter = filter,
  226. };
  227. long ret;
  228. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  229. ASSERT_EQ(0, ret);
  230. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  231. ASSERT_EQ(0, ret);
  232. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, 0, 0);
  233. EXPECT_EQ(-1, ret);
  234. EXPECT_EQ(EINVAL, errno);
  235. }
  236. TEST(mode_filter_get_seccomp)
  237. {
  238. struct sock_filter filter[] = {
  239. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  240. };
  241. struct sock_fprog prog = {
  242. .len = (unsigned short)ARRAY_SIZE(filter),
  243. .filter = filter,
  244. };
  245. long ret;
  246. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  247. ASSERT_EQ(0, ret);
  248. ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
  249. EXPECT_EQ(0, ret);
  250. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  251. ASSERT_EQ(0, ret);
  252. ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
  253. EXPECT_EQ(2, ret);
  254. }
  255. TEST(ALLOW_all)
  256. {
  257. struct sock_filter filter[] = {
  258. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  259. };
  260. struct sock_fprog prog = {
  261. .len = (unsigned short)ARRAY_SIZE(filter),
  262. .filter = filter,
  263. };
  264. long ret;
  265. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  266. ASSERT_EQ(0, ret);
  267. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  268. ASSERT_EQ(0, ret);
  269. }
  270. TEST(empty_prog)
  271. {
  272. struct sock_filter filter[] = {
  273. };
  274. struct sock_fprog prog = {
  275. .len = (unsigned short)ARRAY_SIZE(filter),
  276. .filter = filter,
  277. };
  278. long ret;
  279. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  280. ASSERT_EQ(0, ret);
  281. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  282. EXPECT_EQ(-1, ret);
  283. EXPECT_EQ(EINVAL, errno);
  284. }
  285. TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS)
  286. {
  287. struct sock_filter filter[] = {
  288. BPF_STMT(BPF_RET|BPF_K, 0x10000000U),
  289. };
  290. struct sock_fprog prog = {
  291. .len = (unsigned short)ARRAY_SIZE(filter),
  292. .filter = filter,
  293. };
  294. long ret;
  295. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  296. ASSERT_EQ(0, ret);
  297. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  298. ASSERT_EQ(0, ret);
  299. EXPECT_EQ(0, syscall(__NR_getpid)) {
  300. TH_LOG("getpid() shouldn't ever return");
  301. }
  302. }
  303. /* return code >= 0x80000000 is unused. */
  304. TEST_SIGNAL(unknown_ret_is_kill_above_allow, SIGSYS)
  305. {
  306. struct sock_filter filter[] = {
  307. BPF_STMT(BPF_RET|BPF_K, 0x90000000U),
  308. };
  309. struct sock_fprog prog = {
  310. .len = (unsigned short)ARRAY_SIZE(filter),
  311. .filter = filter,
  312. };
  313. long ret;
  314. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  315. ASSERT_EQ(0, ret);
  316. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  317. ASSERT_EQ(0, ret);
  318. EXPECT_EQ(0, syscall(__NR_getpid)) {
  319. TH_LOG("getpid() shouldn't ever return");
  320. }
  321. }
  322. TEST_SIGNAL(KILL_all, SIGSYS)
  323. {
  324. struct sock_filter filter[] = {
  325. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  326. };
  327. struct sock_fprog prog = {
  328. .len = (unsigned short)ARRAY_SIZE(filter),
  329. .filter = filter,
  330. };
  331. long ret;
  332. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  333. ASSERT_EQ(0, ret);
  334. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  335. ASSERT_EQ(0, ret);
  336. }
  337. TEST_SIGNAL(KILL_one, SIGSYS)
  338. {
  339. struct sock_filter filter[] = {
  340. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  341. offsetof(struct seccomp_data, nr)),
  342. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  343. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  344. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  345. };
  346. struct sock_fprog prog = {
  347. .len = (unsigned short)ARRAY_SIZE(filter),
  348. .filter = filter,
  349. };
  350. long ret;
  351. pid_t parent = getppid();
  352. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  353. ASSERT_EQ(0, ret);
  354. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  355. ASSERT_EQ(0, ret);
  356. EXPECT_EQ(parent, syscall(__NR_getppid));
  357. /* getpid() should never return. */
  358. EXPECT_EQ(0, syscall(__NR_getpid));
  359. }
  360. TEST_SIGNAL(KILL_one_arg_one, SIGSYS)
  361. {
  362. void *fatal_address;
  363. struct sock_filter filter[] = {
  364. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  365. offsetof(struct seccomp_data, nr)),
  366. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_times, 1, 0),
  367. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  368. /* Only both with lower 32-bit for now. */
  369. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)),
  370. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K,
  371. (unsigned long)&fatal_address, 0, 1),
  372. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  373. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  374. };
  375. struct sock_fprog prog = {
  376. .len = (unsigned short)ARRAY_SIZE(filter),
  377. .filter = filter,
  378. };
  379. long ret;
  380. pid_t parent = getppid();
  381. struct tms timebuf;
  382. clock_t clock = times(&timebuf);
  383. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  384. ASSERT_EQ(0, ret);
  385. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  386. ASSERT_EQ(0, ret);
  387. EXPECT_EQ(parent, syscall(__NR_getppid));
  388. EXPECT_LE(clock, syscall(__NR_times, &timebuf));
  389. /* times() should never return. */
  390. EXPECT_EQ(0, syscall(__NR_times, &fatal_address));
  391. }
  392. TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
  393. {
  394. #ifndef __NR_mmap2
  395. int sysno = __NR_mmap;
  396. #else
  397. int sysno = __NR_mmap2;
  398. #endif
  399. struct sock_filter filter[] = {
  400. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  401. offsetof(struct seccomp_data, nr)),
  402. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, sysno, 1, 0),
  403. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  404. /* Only both with lower 32-bit for now. */
  405. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)),
  406. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
  407. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  408. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  409. };
  410. struct sock_fprog prog = {
  411. .len = (unsigned short)ARRAY_SIZE(filter),
  412. .filter = filter,
  413. };
  414. long ret;
  415. pid_t parent = getppid();
  416. int fd;
  417. void *map1, *map2;
  418. int page_size = sysconf(_SC_PAGESIZE);
  419. ASSERT_LT(0, page_size);
  420. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  421. ASSERT_EQ(0, ret);
  422. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  423. ASSERT_EQ(0, ret);
  424. fd = open("/dev/zero", O_RDONLY);
  425. ASSERT_NE(-1, fd);
  426. EXPECT_EQ(parent, syscall(__NR_getppid));
  427. map1 = (void *)syscall(sysno,
  428. NULL, page_size, PROT_READ, MAP_PRIVATE, fd, page_size);
  429. EXPECT_NE(MAP_FAILED, map1);
  430. /* mmap2() should never return. */
  431. map2 = (void *)syscall(sysno,
  432. NULL, page_size, PROT_READ, MAP_PRIVATE, fd, 0x0C0FFEE);
  433. EXPECT_EQ(MAP_FAILED, map2);
  434. /* The test failed, so clean up the resources. */
  435. munmap(map1, page_size);
  436. munmap(map2, page_size);
  437. close(fd);
  438. }
  439. /* TODO(wad) add 64-bit versus 32-bit arg tests. */
  440. TEST(arg_out_of_range)
  441. {
  442. struct sock_filter filter[] = {
  443. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(6)),
  444. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  445. };
  446. struct sock_fprog prog = {
  447. .len = (unsigned short)ARRAY_SIZE(filter),
  448. .filter = filter,
  449. };
  450. long ret;
  451. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  452. ASSERT_EQ(0, ret);
  453. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  454. EXPECT_EQ(-1, ret);
  455. EXPECT_EQ(EINVAL, errno);
  456. }
  457. TEST(ERRNO_valid)
  458. {
  459. struct sock_filter filter[] = {
  460. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  461. offsetof(struct seccomp_data, nr)),
  462. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  463. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | E2BIG),
  464. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  465. };
  466. struct sock_fprog prog = {
  467. .len = (unsigned short)ARRAY_SIZE(filter),
  468. .filter = filter,
  469. };
  470. long ret;
  471. pid_t parent = getppid();
  472. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  473. ASSERT_EQ(0, ret);
  474. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  475. ASSERT_EQ(0, ret);
  476. EXPECT_EQ(parent, syscall(__NR_getppid));
  477. EXPECT_EQ(-1, read(0, NULL, 0));
  478. EXPECT_EQ(E2BIG, errno);
  479. }
  480. TEST(ERRNO_zero)
  481. {
  482. struct sock_filter filter[] = {
  483. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  484. offsetof(struct seccomp_data, nr)),
  485. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  486. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 0),
  487. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  488. };
  489. struct sock_fprog prog = {
  490. .len = (unsigned short)ARRAY_SIZE(filter),
  491. .filter = filter,
  492. };
  493. long ret;
  494. pid_t parent = getppid();
  495. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  496. ASSERT_EQ(0, ret);
  497. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  498. ASSERT_EQ(0, ret);
  499. EXPECT_EQ(parent, syscall(__NR_getppid));
  500. /* "errno" of 0 is ok. */
  501. EXPECT_EQ(0, read(0, NULL, 0));
  502. }
  503. TEST(ERRNO_capped)
  504. {
  505. struct sock_filter filter[] = {
  506. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  507. offsetof(struct seccomp_data, nr)),
  508. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  509. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 4096),
  510. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  511. };
  512. struct sock_fprog prog = {
  513. .len = (unsigned short)ARRAY_SIZE(filter),
  514. .filter = filter,
  515. };
  516. long ret;
  517. pid_t parent = getppid();
  518. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  519. ASSERT_EQ(0, ret);
  520. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  521. ASSERT_EQ(0, ret);
  522. EXPECT_EQ(parent, syscall(__NR_getppid));
  523. EXPECT_EQ(-1, read(0, NULL, 0));
  524. EXPECT_EQ(4095, errno);
  525. }
  526. FIXTURE_DATA(TRAP) {
  527. struct sock_fprog prog;
  528. };
  529. FIXTURE_SETUP(TRAP)
  530. {
  531. struct sock_filter filter[] = {
  532. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  533. offsetof(struct seccomp_data, nr)),
  534. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  535. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
  536. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  537. };
  538. memset(&self->prog, 0, sizeof(self->prog));
  539. self->prog.filter = malloc(sizeof(filter));
  540. ASSERT_NE(NULL, self->prog.filter);
  541. memcpy(self->prog.filter, filter, sizeof(filter));
  542. self->prog.len = (unsigned short)ARRAY_SIZE(filter);
  543. }
  544. FIXTURE_TEARDOWN(TRAP)
  545. {
  546. if (self->prog.filter)
  547. free(self->prog.filter);
  548. }
  549. TEST_F_SIGNAL(TRAP, dfl, SIGSYS)
  550. {
  551. long ret;
  552. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  553. ASSERT_EQ(0, ret);
  554. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
  555. ASSERT_EQ(0, ret);
  556. syscall(__NR_getpid);
  557. }
  558. /* Ensure that SIGSYS overrides SIG_IGN */
  559. TEST_F_SIGNAL(TRAP, ign, SIGSYS)
  560. {
  561. long ret;
  562. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  563. ASSERT_EQ(0, ret);
  564. signal(SIGSYS, SIG_IGN);
  565. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
  566. ASSERT_EQ(0, ret);
  567. syscall(__NR_getpid);
  568. }
  569. static struct siginfo TRAP_info;
  570. static volatile int TRAP_nr;
  571. static void TRAP_action(int nr, siginfo_t *info, void *void_context)
  572. {
  573. memcpy(&TRAP_info, info, sizeof(TRAP_info));
  574. TRAP_nr = nr;
  575. }
  576. TEST_F(TRAP, handler)
  577. {
  578. int ret, test;
  579. struct sigaction act;
  580. sigset_t mask;
  581. memset(&act, 0, sizeof(act));
  582. sigemptyset(&mask);
  583. sigaddset(&mask, SIGSYS);
  584. act.sa_sigaction = &TRAP_action;
  585. act.sa_flags = SA_SIGINFO;
  586. ret = sigaction(SIGSYS, &act, NULL);
  587. ASSERT_EQ(0, ret) {
  588. TH_LOG("sigaction failed");
  589. }
  590. ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
  591. ASSERT_EQ(0, ret) {
  592. TH_LOG("sigprocmask failed");
  593. }
  594. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  595. ASSERT_EQ(0, ret);
  596. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
  597. ASSERT_EQ(0, ret);
  598. TRAP_nr = 0;
  599. memset(&TRAP_info, 0, sizeof(TRAP_info));
  600. /* Expect the registers to be rolled back. (nr = error) may vary
  601. * based on arch. */
  602. ret = syscall(__NR_getpid);
  603. /* Silence gcc warning about volatile. */
  604. test = TRAP_nr;
  605. EXPECT_EQ(SIGSYS, test);
  606. struct local_sigsys {
  607. void *_call_addr; /* calling user insn */
  608. int _syscall; /* triggering system call number */
  609. unsigned int _arch; /* AUDIT_ARCH_* of syscall */
  610. } *sigsys = (struct local_sigsys *)
  611. #ifdef si_syscall
  612. &(TRAP_info.si_call_addr);
  613. #else
  614. &TRAP_info.si_pid;
  615. #endif
  616. EXPECT_EQ(__NR_getpid, sigsys->_syscall);
  617. /* Make sure arch is non-zero. */
  618. EXPECT_NE(0, sigsys->_arch);
  619. EXPECT_NE(0, (unsigned long)sigsys->_call_addr);
  620. }
  621. FIXTURE_DATA(precedence) {
  622. struct sock_fprog allow;
  623. struct sock_fprog trace;
  624. struct sock_fprog error;
  625. struct sock_fprog trap;
  626. struct sock_fprog kill;
  627. };
  628. FIXTURE_SETUP(precedence)
  629. {
  630. struct sock_filter allow_insns[] = {
  631. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  632. };
  633. struct sock_filter trace_insns[] = {
  634. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  635. offsetof(struct seccomp_data, nr)),
  636. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  637. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  638. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE),
  639. };
  640. struct sock_filter error_insns[] = {
  641. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  642. offsetof(struct seccomp_data, nr)),
  643. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  644. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  645. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO),
  646. };
  647. struct sock_filter trap_insns[] = {
  648. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  649. offsetof(struct seccomp_data, nr)),
  650. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  651. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  652. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
  653. };
  654. struct sock_filter kill_insns[] = {
  655. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  656. offsetof(struct seccomp_data, nr)),
  657. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  658. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  659. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  660. };
  661. memset(self, 0, sizeof(*self));
  662. #define FILTER_ALLOC(_x) \
  663. self->_x.filter = malloc(sizeof(_x##_insns)); \
  664. ASSERT_NE(NULL, self->_x.filter); \
  665. memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \
  666. self->_x.len = (unsigned short)ARRAY_SIZE(_x##_insns)
  667. FILTER_ALLOC(allow);
  668. FILTER_ALLOC(trace);
  669. FILTER_ALLOC(error);
  670. FILTER_ALLOC(trap);
  671. FILTER_ALLOC(kill);
  672. }
  673. FIXTURE_TEARDOWN(precedence)
  674. {
  675. #define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter)
  676. FILTER_FREE(allow);
  677. FILTER_FREE(trace);
  678. FILTER_FREE(error);
  679. FILTER_FREE(trap);
  680. FILTER_FREE(kill);
  681. }
  682. TEST_F(precedence, allow_ok)
  683. {
  684. pid_t parent, res = 0;
  685. long ret;
  686. parent = getppid();
  687. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  688. ASSERT_EQ(0, ret);
  689. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  690. ASSERT_EQ(0, ret);
  691. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  692. ASSERT_EQ(0, ret);
  693. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  694. ASSERT_EQ(0, ret);
  695. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  696. ASSERT_EQ(0, ret);
  697. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
  698. ASSERT_EQ(0, ret);
  699. /* Should work just fine. */
  700. res = syscall(__NR_getppid);
  701. EXPECT_EQ(parent, res);
  702. }
  703. TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS)
  704. {
  705. pid_t parent, res = 0;
  706. long ret;
  707. parent = getppid();
  708. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  709. ASSERT_EQ(0, ret);
  710. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  711. ASSERT_EQ(0, ret);
  712. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  713. ASSERT_EQ(0, ret);
  714. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  715. ASSERT_EQ(0, ret);
  716. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  717. ASSERT_EQ(0, ret);
  718. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
  719. ASSERT_EQ(0, ret);
  720. /* Should work just fine. */
  721. res = syscall(__NR_getppid);
  722. EXPECT_EQ(parent, res);
  723. /* getpid() should never return. */
  724. res = syscall(__NR_getpid);
  725. EXPECT_EQ(0, res);
  726. }
  727. TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS)
  728. {
  729. pid_t parent;
  730. long ret;
  731. parent = getppid();
  732. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  733. ASSERT_EQ(0, ret);
  734. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  735. ASSERT_EQ(0, ret);
  736. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
  737. ASSERT_EQ(0, ret);
  738. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  739. ASSERT_EQ(0, ret);
  740. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  741. ASSERT_EQ(0, ret);
  742. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  743. ASSERT_EQ(0, ret);
  744. /* Should work just fine. */
  745. EXPECT_EQ(parent, syscall(__NR_getppid));
  746. /* getpid() should never return. */
  747. EXPECT_EQ(0, syscall(__NR_getpid));
  748. }
  749. TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS)
  750. {
  751. pid_t parent;
  752. long ret;
  753. parent = getppid();
  754. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  755. ASSERT_EQ(0, ret);
  756. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  757. ASSERT_EQ(0, ret);
  758. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  759. ASSERT_EQ(0, ret);
  760. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  761. ASSERT_EQ(0, ret);
  762. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  763. ASSERT_EQ(0, ret);
  764. /* Should work just fine. */
  765. EXPECT_EQ(parent, syscall(__NR_getppid));
  766. /* getpid() should never return. */
  767. EXPECT_EQ(0, syscall(__NR_getpid));
  768. }
  769. TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS)
  770. {
  771. pid_t parent;
  772. long ret;
  773. parent = getppid();
  774. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  775. ASSERT_EQ(0, ret);
  776. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  777. ASSERT_EQ(0, ret);
  778. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  779. ASSERT_EQ(0, ret);
  780. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  781. ASSERT_EQ(0, ret);
  782. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  783. ASSERT_EQ(0, ret);
  784. /* Should work just fine. */
  785. EXPECT_EQ(parent, syscall(__NR_getppid));
  786. /* getpid() should never return. */
  787. EXPECT_EQ(0, syscall(__NR_getpid));
  788. }
  789. TEST_F(precedence, errno_is_third)
  790. {
  791. pid_t parent;
  792. long ret;
  793. parent = getppid();
  794. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  795. ASSERT_EQ(0, ret);
  796. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  797. ASSERT_EQ(0, ret);
  798. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  799. ASSERT_EQ(0, ret);
  800. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  801. ASSERT_EQ(0, ret);
  802. /* Should work just fine. */
  803. EXPECT_EQ(parent, syscall(__NR_getppid));
  804. EXPECT_EQ(0, syscall(__NR_getpid));
  805. }
  806. TEST_F(precedence, errno_is_third_in_any_order)
  807. {
  808. pid_t parent;
  809. long ret;
  810. parent = getppid();
  811. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  812. ASSERT_EQ(0, ret);
  813. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  814. ASSERT_EQ(0, ret);
  815. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  816. ASSERT_EQ(0, ret);
  817. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  818. ASSERT_EQ(0, ret);
  819. /* Should work just fine. */
  820. EXPECT_EQ(parent, syscall(__NR_getppid));
  821. EXPECT_EQ(0, syscall(__NR_getpid));
  822. }
  823. TEST_F(precedence, trace_is_fourth)
  824. {
  825. pid_t parent;
  826. long ret;
  827. parent = getppid();
  828. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  829. ASSERT_EQ(0, ret);
  830. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  831. ASSERT_EQ(0, ret);
  832. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  833. ASSERT_EQ(0, ret);
  834. /* Should work just fine. */
  835. EXPECT_EQ(parent, syscall(__NR_getppid));
  836. /* No ptracer */
  837. EXPECT_EQ(-1, syscall(__NR_getpid));
  838. }
  839. TEST_F(precedence, trace_is_fourth_in_any_order)
  840. {
  841. pid_t parent;
  842. long ret;
  843. parent = getppid();
  844. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  845. ASSERT_EQ(0, ret);
  846. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  847. ASSERT_EQ(0, ret);
  848. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  849. ASSERT_EQ(0, ret);
  850. /* Should work just fine. */
  851. EXPECT_EQ(parent, syscall(__NR_getppid));
  852. /* No ptracer */
  853. EXPECT_EQ(-1, syscall(__NR_getpid));
  854. }
  855. #ifndef PTRACE_O_TRACESECCOMP
  856. #define PTRACE_O_TRACESECCOMP 0x00000080
  857. #endif
  858. /* Catch the Ubuntu 12.04 value error. */
  859. #if PTRACE_EVENT_SECCOMP != 7
  860. #undef PTRACE_EVENT_SECCOMP
  861. #endif
  862. #ifndef PTRACE_EVENT_SECCOMP
  863. #define PTRACE_EVENT_SECCOMP 7
  864. #endif
  865. #define IS_SECCOMP_EVENT(status) ((status >> 16) == PTRACE_EVENT_SECCOMP)
  866. bool tracer_running;
  867. void tracer_stop(int sig)
  868. {
  869. tracer_running = false;
  870. }
  871. typedef void tracer_func_t(struct __test_metadata *_metadata,
  872. pid_t tracee, int status, void *args);
  873. void start_tracer(struct __test_metadata *_metadata, int fd, pid_t tracee,
  874. tracer_func_t tracer_func, void *args, bool ptrace_syscall)
  875. {
  876. int ret = -1;
  877. struct sigaction action = {
  878. .sa_handler = tracer_stop,
  879. };
  880. /* Allow external shutdown. */
  881. tracer_running = true;
  882. ASSERT_EQ(0, sigaction(SIGUSR1, &action, NULL));
  883. errno = 0;
  884. while (ret == -1 && errno != EINVAL)
  885. ret = ptrace(PTRACE_ATTACH, tracee, NULL, 0);
  886. ASSERT_EQ(0, ret) {
  887. kill(tracee, SIGKILL);
  888. }
  889. /* Wait for attach stop */
  890. wait(NULL);
  891. ret = ptrace(PTRACE_SETOPTIONS, tracee, NULL, ptrace_syscall ?
  892. PTRACE_O_TRACESYSGOOD :
  893. PTRACE_O_TRACESECCOMP);
  894. ASSERT_EQ(0, ret) {
  895. TH_LOG("Failed to set PTRACE_O_TRACESECCOMP");
  896. kill(tracee, SIGKILL);
  897. }
  898. ret = ptrace(ptrace_syscall ? PTRACE_SYSCALL : PTRACE_CONT,
  899. tracee, NULL, 0);
  900. ASSERT_EQ(0, ret);
  901. /* Unblock the tracee */
  902. ASSERT_EQ(1, write(fd, "A", 1));
  903. ASSERT_EQ(0, close(fd));
  904. /* Run until we're shut down. Must assert to stop execution. */
  905. while (tracer_running) {
  906. int status;
  907. if (wait(&status) != tracee)
  908. continue;
  909. if (WIFSIGNALED(status) || WIFEXITED(status))
  910. /* Child is dead. Time to go. */
  911. return;
  912. /* Check if this is a seccomp event. */
  913. ASSERT_EQ(!ptrace_syscall, IS_SECCOMP_EVENT(status));
  914. tracer_func(_metadata, tracee, status, args);
  915. ret = ptrace(ptrace_syscall ? PTRACE_SYSCALL : PTRACE_CONT,
  916. tracee, NULL, 0);
  917. ASSERT_EQ(0, ret);
  918. }
  919. /* Directly report the status of our test harness results. */
  920. syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS : EXIT_FAILURE);
  921. }
  922. /* Common tracer setup/teardown functions. */
  923. void cont_handler(int num)
  924. { }
  925. pid_t setup_trace_fixture(struct __test_metadata *_metadata,
  926. tracer_func_t func, void *args, bool ptrace_syscall)
  927. {
  928. char sync;
  929. int pipefd[2];
  930. pid_t tracer_pid;
  931. pid_t tracee = getpid();
  932. /* Setup a pipe for clean synchronization. */
  933. ASSERT_EQ(0, pipe(pipefd));
  934. /* Fork a child which we'll promote to tracer */
  935. tracer_pid = fork();
  936. ASSERT_LE(0, tracer_pid);
  937. signal(SIGALRM, cont_handler);
  938. if (tracer_pid == 0) {
  939. close(pipefd[0]);
  940. start_tracer(_metadata, pipefd[1], tracee, func, args,
  941. ptrace_syscall);
  942. syscall(__NR_exit, 0);
  943. }
  944. close(pipefd[1]);
  945. prctl(PR_SET_PTRACER, tracer_pid, 0, 0, 0);
  946. read(pipefd[0], &sync, 1);
  947. close(pipefd[0]);
  948. return tracer_pid;
  949. }
  950. void teardown_trace_fixture(struct __test_metadata *_metadata,
  951. pid_t tracer)
  952. {
  953. if (tracer) {
  954. int status;
  955. /*
  956. * Extract the exit code from the other process and
  957. * adopt it for ourselves in case its asserts failed.
  958. */
  959. ASSERT_EQ(0, kill(tracer, SIGUSR1));
  960. ASSERT_EQ(tracer, waitpid(tracer, &status, 0));
  961. if (WEXITSTATUS(status))
  962. _metadata->passed = 0;
  963. }
  964. }
  965. /* "poke" tracer arguments and function. */
  966. struct tracer_args_poke_t {
  967. unsigned long poke_addr;
  968. };
  969. void tracer_poke(struct __test_metadata *_metadata, pid_t tracee, int status,
  970. void *args)
  971. {
  972. int ret;
  973. unsigned long msg;
  974. struct tracer_args_poke_t *info = (struct tracer_args_poke_t *)args;
  975. ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
  976. EXPECT_EQ(0, ret);
  977. /* If this fails, don't try to recover. */
  978. ASSERT_EQ(0x1001, msg) {
  979. kill(tracee, SIGKILL);
  980. }
  981. /*
  982. * Poke in the message.
  983. * Registers are not touched to try to keep this relatively arch
  984. * agnostic.
  985. */
  986. ret = ptrace(PTRACE_POKEDATA, tracee, info->poke_addr, 0x1001);
  987. EXPECT_EQ(0, ret);
  988. }
  989. FIXTURE_DATA(TRACE_poke) {
  990. struct sock_fprog prog;
  991. pid_t tracer;
  992. long poked;
  993. struct tracer_args_poke_t tracer_args;
  994. };
  995. FIXTURE_SETUP(TRACE_poke)
  996. {
  997. struct sock_filter filter[] = {
  998. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  999. offsetof(struct seccomp_data, nr)),
  1000. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  1001. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1001),
  1002. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1003. };
  1004. self->poked = 0;
  1005. memset(&self->prog, 0, sizeof(self->prog));
  1006. self->prog.filter = malloc(sizeof(filter));
  1007. ASSERT_NE(NULL, self->prog.filter);
  1008. memcpy(self->prog.filter, filter, sizeof(filter));
  1009. self->prog.len = (unsigned short)ARRAY_SIZE(filter);
  1010. /* Set up tracer args. */
  1011. self->tracer_args.poke_addr = (unsigned long)&self->poked;
  1012. /* Launch tracer. */
  1013. self->tracer = setup_trace_fixture(_metadata, tracer_poke,
  1014. &self->tracer_args, false);
  1015. }
  1016. FIXTURE_TEARDOWN(TRACE_poke)
  1017. {
  1018. teardown_trace_fixture(_metadata, self->tracer);
  1019. if (self->prog.filter)
  1020. free(self->prog.filter);
  1021. }
  1022. TEST_F(TRACE_poke, read_has_side_effects)
  1023. {
  1024. ssize_t ret;
  1025. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1026. ASSERT_EQ(0, ret);
  1027. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1028. ASSERT_EQ(0, ret);
  1029. EXPECT_EQ(0, self->poked);
  1030. ret = read(-1, NULL, 0);
  1031. EXPECT_EQ(-1, ret);
  1032. EXPECT_EQ(0x1001, self->poked);
  1033. }
  1034. TEST_F(TRACE_poke, getpid_runs_normally)
  1035. {
  1036. long ret;
  1037. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1038. ASSERT_EQ(0, ret);
  1039. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1040. ASSERT_EQ(0, ret);
  1041. EXPECT_EQ(0, self->poked);
  1042. EXPECT_NE(0, syscall(__NR_getpid));
  1043. EXPECT_EQ(0, self->poked);
  1044. }
  1045. #if defined(__x86_64__)
  1046. # define ARCH_REGS struct user_regs_struct
  1047. # define SYSCALL_NUM orig_rax
  1048. # define SYSCALL_RET rax
  1049. #elif defined(__i386__)
  1050. # define ARCH_REGS struct user_regs_struct
  1051. # define SYSCALL_NUM orig_eax
  1052. # define SYSCALL_RET eax
  1053. #elif defined(__arm__)
  1054. # define ARCH_REGS struct pt_regs
  1055. # define SYSCALL_NUM ARM_r7
  1056. # define SYSCALL_RET ARM_r0
  1057. #elif defined(__aarch64__)
  1058. # define ARCH_REGS struct user_pt_regs
  1059. # define SYSCALL_NUM regs[8]
  1060. # define SYSCALL_RET regs[0]
  1061. #elif defined(__hppa__)
  1062. # define ARCH_REGS struct user_regs_struct
  1063. # define SYSCALL_NUM gr[20]
  1064. # define SYSCALL_RET gr[28]
  1065. #elif defined(__powerpc__)
  1066. # define ARCH_REGS struct pt_regs
  1067. # define SYSCALL_NUM gpr[0]
  1068. # define SYSCALL_RET gpr[3]
  1069. #elif defined(__s390__)
  1070. # define ARCH_REGS s390_regs
  1071. # define SYSCALL_NUM gprs[2]
  1072. # define SYSCALL_RET gprs[2]
  1073. #elif defined(__mips__)
  1074. # define ARCH_REGS struct pt_regs
  1075. # define SYSCALL_NUM regs[2]
  1076. # define SYSCALL_SYSCALL_NUM regs[4]
  1077. # define SYSCALL_RET regs[2]
  1078. # define SYSCALL_NUM_RET_SHARE_REG
  1079. #else
  1080. # error "Do not know how to find your architecture's registers and syscalls"
  1081. #endif
  1082. /* Use PTRACE_GETREGS and PTRACE_SETREGS when available. This is useful for
  1083. * architectures without HAVE_ARCH_TRACEHOOK (e.g. User-mode Linux).
  1084. */
  1085. #if defined(__x86_64__) || defined(__i386__) || defined(__mips__)
  1086. #define HAVE_GETREGS
  1087. #endif
  1088. /* Architecture-specific syscall fetching routine. */
  1089. int get_syscall(struct __test_metadata *_metadata, pid_t tracee)
  1090. {
  1091. ARCH_REGS regs;
  1092. #ifdef HAVE_GETREGS
  1093. EXPECT_EQ(0, ptrace(PTRACE_GETREGS, tracee, 0, &regs)) {
  1094. TH_LOG("PTRACE_GETREGS failed");
  1095. return -1;
  1096. }
  1097. #else
  1098. struct iovec iov;
  1099. iov.iov_base = &regs;
  1100. iov.iov_len = sizeof(regs);
  1101. EXPECT_EQ(0, ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov)) {
  1102. TH_LOG("PTRACE_GETREGSET failed");
  1103. return -1;
  1104. }
  1105. #endif
  1106. #if defined(__mips__)
  1107. if (regs.SYSCALL_NUM == __NR_O32_Linux)
  1108. return regs.SYSCALL_SYSCALL_NUM;
  1109. #endif
  1110. return regs.SYSCALL_NUM;
  1111. }
  1112. /* Architecture-specific syscall changing routine. */
  1113. void change_syscall(struct __test_metadata *_metadata,
  1114. pid_t tracee, int syscall)
  1115. {
  1116. int ret;
  1117. ARCH_REGS regs;
  1118. #ifdef HAVE_GETREGS
  1119. ret = ptrace(PTRACE_GETREGS, tracee, 0, &regs);
  1120. #else
  1121. struct iovec iov;
  1122. iov.iov_base = &regs;
  1123. iov.iov_len = sizeof(regs);
  1124. ret = ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov);
  1125. #endif
  1126. EXPECT_EQ(0, ret);
  1127. #if defined(__x86_64__) || defined(__i386__) || defined(__powerpc__) || \
  1128. defined(__s390__) || defined(__hppa__)
  1129. {
  1130. regs.SYSCALL_NUM = syscall;
  1131. }
  1132. #elif defined(__mips__)
  1133. {
  1134. if (regs.SYSCALL_NUM == __NR_O32_Linux)
  1135. regs.SYSCALL_SYSCALL_NUM = syscall;
  1136. else
  1137. regs.SYSCALL_NUM = syscall;
  1138. }
  1139. #elif defined(__arm__)
  1140. # ifndef PTRACE_SET_SYSCALL
  1141. # define PTRACE_SET_SYSCALL 23
  1142. # endif
  1143. {
  1144. ret = ptrace(PTRACE_SET_SYSCALL, tracee, NULL, syscall);
  1145. EXPECT_EQ(0, ret);
  1146. }
  1147. #elif defined(__aarch64__)
  1148. # ifndef NT_ARM_SYSTEM_CALL
  1149. # define NT_ARM_SYSTEM_CALL 0x404
  1150. # endif
  1151. {
  1152. iov.iov_base = &syscall;
  1153. iov.iov_len = sizeof(syscall);
  1154. ret = ptrace(PTRACE_SETREGSET, tracee, NT_ARM_SYSTEM_CALL,
  1155. &iov);
  1156. EXPECT_EQ(0, ret);
  1157. }
  1158. #else
  1159. ASSERT_EQ(1, 0) {
  1160. TH_LOG("How is the syscall changed on this architecture?");
  1161. }
  1162. #endif
  1163. /* If syscall is skipped, change return value. */
  1164. if (syscall == -1)
  1165. #ifdef SYSCALL_NUM_RET_SHARE_REG
  1166. TH_LOG("Can't modify syscall return on this architecture");
  1167. #else
  1168. regs.SYSCALL_RET = 1;
  1169. #endif
  1170. #ifdef HAVE_GETREGS
  1171. ret = ptrace(PTRACE_SETREGS, tracee, 0, &regs);
  1172. #else
  1173. iov.iov_base = &regs;
  1174. iov.iov_len = sizeof(regs);
  1175. ret = ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &iov);
  1176. #endif
  1177. EXPECT_EQ(0, ret);
  1178. }
  1179. void tracer_syscall(struct __test_metadata *_metadata, pid_t tracee,
  1180. int status, void *args)
  1181. {
  1182. int ret;
  1183. unsigned long msg;
  1184. /* Make sure we got the right message. */
  1185. ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
  1186. EXPECT_EQ(0, ret);
  1187. /* Validate and take action on expected syscalls. */
  1188. switch (msg) {
  1189. case 0x1002:
  1190. /* change getpid to getppid. */
  1191. EXPECT_EQ(__NR_getpid, get_syscall(_metadata, tracee));
  1192. change_syscall(_metadata, tracee, __NR_getppid);
  1193. break;
  1194. case 0x1003:
  1195. /* skip gettid. */
  1196. EXPECT_EQ(__NR_gettid, get_syscall(_metadata, tracee));
  1197. change_syscall(_metadata, tracee, -1);
  1198. break;
  1199. case 0x1004:
  1200. /* do nothing (allow getppid) */
  1201. EXPECT_EQ(__NR_getppid, get_syscall(_metadata, tracee));
  1202. break;
  1203. default:
  1204. EXPECT_EQ(0, msg) {
  1205. TH_LOG("Unknown PTRACE_GETEVENTMSG: 0x%lx", msg);
  1206. kill(tracee, SIGKILL);
  1207. }
  1208. }
  1209. }
  1210. void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,
  1211. int status, void *args)
  1212. {
  1213. int ret, nr;
  1214. unsigned long msg;
  1215. static bool entry;
  1216. /* Make sure we got an empty message. */
  1217. ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
  1218. EXPECT_EQ(0, ret);
  1219. EXPECT_EQ(0, msg);
  1220. /* The only way to tell PTRACE_SYSCALL entry/exit is by counting. */
  1221. entry = !entry;
  1222. if (!entry)
  1223. return;
  1224. nr = get_syscall(_metadata, tracee);
  1225. if (nr == __NR_getpid)
  1226. change_syscall(_metadata, tracee, __NR_getppid);
  1227. }
  1228. FIXTURE_DATA(TRACE_syscall) {
  1229. struct sock_fprog prog;
  1230. pid_t tracer, mytid, mypid, parent;
  1231. };
  1232. FIXTURE_SETUP(TRACE_syscall)
  1233. {
  1234. struct sock_filter filter[] = {
  1235. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1236. offsetof(struct seccomp_data, nr)),
  1237. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  1238. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1002),
  1239. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_gettid, 0, 1),
  1240. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1003),
  1241. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1242. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1004),
  1243. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1244. };
  1245. memset(&self->prog, 0, sizeof(self->prog));
  1246. self->prog.filter = malloc(sizeof(filter));
  1247. ASSERT_NE(NULL, self->prog.filter);
  1248. memcpy(self->prog.filter, filter, sizeof(filter));
  1249. self->prog.len = (unsigned short)ARRAY_SIZE(filter);
  1250. /* Prepare some testable syscall results. */
  1251. self->mytid = syscall(__NR_gettid);
  1252. ASSERT_GT(self->mytid, 0);
  1253. ASSERT_NE(self->mytid, 1) {
  1254. TH_LOG("Running this test as init is not supported. :)");
  1255. }
  1256. self->mypid = getpid();
  1257. ASSERT_GT(self->mypid, 0);
  1258. ASSERT_EQ(self->mytid, self->mypid);
  1259. self->parent = getppid();
  1260. ASSERT_GT(self->parent, 0);
  1261. ASSERT_NE(self->parent, self->mypid);
  1262. /* Launch tracer. */
  1263. self->tracer = setup_trace_fixture(_metadata, tracer_syscall, NULL,
  1264. false);
  1265. }
  1266. FIXTURE_TEARDOWN(TRACE_syscall)
  1267. {
  1268. teardown_trace_fixture(_metadata, self->tracer);
  1269. if (self->prog.filter)
  1270. free(self->prog.filter);
  1271. }
  1272. TEST_F(TRACE_syscall, syscall_allowed)
  1273. {
  1274. long ret;
  1275. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1276. ASSERT_EQ(0, ret);
  1277. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1278. ASSERT_EQ(0, ret);
  1279. /* getppid works as expected (no changes). */
  1280. EXPECT_EQ(self->parent, syscall(__NR_getppid));
  1281. EXPECT_NE(self->mypid, syscall(__NR_getppid));
  1282. }
  1283. TEST_F(TRACE_syscall, syscall_redirected)
  1284. {
  1285. long ret;
  1286. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1287. ASSERT_EQ(0, ret);
  1288. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1289. ASSERT_EQ(0, ret);
  1290. /* getpid has been redirected to getppid as expected. */
  1291. EXPECT_EQ(self->parent, syscall(__NR_getpid));
  1292. EXPECT_NE(self->mypid, syscall(__NR_getpid));
  1293. }
  1294. TEST_F(TRACE_syscall, syscall_dropped)
  1295. {
  1296. long ret;
  1297. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1298. ASSERT_EQ(0, ret);
  1299. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1300. ASSERT_EQ(0, ret);
  1301. #ifdef SYSCALL_NUM_RET_SHARE_REG
  1302. /* gettid has been skipped */
  1303. EXPECT_EQ(-1, syscall(__NR_gettid));
  1304. #else
  1305. /* gettid has been skipped and an altered return value stored. */
  1306. EXPECT_EQ(1, syscall(__NR_gettid));
  1307. #endif
  1308. EXPECT_NE(self->mytid, syscall(__NR_gettid));
  1309. }
  1310. TEST_F(TRACE_syscall, skip_after_RET_TRACE)
  1311. {
  1312. struct sock_filter filter[] = {
  1313. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1314. offsetof(struct seccomp_data, nr)),
  1315. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1316. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EPERM),
  1317. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1318. };
  1319. struct sock_fprog prog = {
  1320. .len = (unsigned short)ARRAY_SIZE(filter),
  1321. .filter = filter,
  1322. };
  1323. long ret;
  1324. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1325. ASSERT_EQ(0, ret);
  1326. /* Install fixture filter. */
  1327. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1328. ASSERT_EQ(0, ret);
  1329. /* Install "errno on getppid" filter. */
  1330. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1331. ASSERT_EQ(0, ret);
  1332. /* Tracer will redirect getpid to getppid, and we should see EPERM. */
  1333. EXPECT_EQ(-1, syscall(__NR_getpid));
  1334. EXPECT_EQ(EPERM, errno);
  1335. }
  1336. TEST_F_SIGNAL(TRACE_syscall, kill_after_RET_TRACE, SIGSYS)
  1337. {
  1338. struct sock_filter filter[] = {
  1339. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1340. offsetof(struct seccomp_data, nr)),
  1341. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1342. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  1343. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1344. };
  1345. struct sock_fprog prog = {
  1346. .len = (unsigned short)ARRAY_SIZE(filter),
  1347. .filter = filter,
  1348. };
  1349. long ret;
  1350. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1351. ASSERT_EQ(0, ret);
  1352. /* Install fixture filter. */
  1353. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1354. ASSERT_EQ(0, ret);
  1355. /* Install "death on getppid" filter. */
  1356. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1357. ASSERT_EQ(0, ret);
  1358. /* Tracer will redirect getpid to getppid, and we should die. */
  1359. EXPECT_NE(self->mypid, syscall(__NR_getpid));
  1360. }
  1361. TEST_F(TRACE_syscall, skip_after_ptrace)
  1362. {
  1363. struct sock_filter filter[] = {
  1364. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1365. offsetof(struct seccomp_data, nr)),
  1366. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1367. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EPERM),
  1368. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1369. };
  1370. struct sock_fprog prog = {
  1371. .len = (unsigned short)ARRAY_SIZE(filter),
  1372. .filter = filter,
  1373. };
  1374. long ret;
  1375. /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
  1376. teardown_trace_fixture(_metadata, self->tracer);
  1377. self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL,
  1378. true);
  1379. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1380. ASSERT_EQ(0, ret);
  1381. /* Install "errno on getppid" filter. */
  1382. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1383. ASSERT_EQ(0, ret);
  1384. /* Tracer will redirect getpid to getppid, and we should see EPERM. */
  1385. EXPECT_EQ(-1, syscall(__NR_getpid));
  1386. EXPECT_EQ(EPERM, errno);
  1387. }
  1388. TEST_F_SIGNAL(TRACE_syscall, kill_after_ptrace, SIGSYS)
  1389. {
  1390. struct sock_filter filter[] = {
  1391. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1392. offsetof(struct seccomp_data, nr)),
  1393. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1394. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  1395. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1396. };
  1397. struct sock_fprog prog = {
  1398. .len = (unsigned short)ARRAY_SIZE(filter),
  1399. .filter = filter,
  1400. };
  1401. long ret;
  1402. /* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */
  1403. teardown_trace_fixture(_metadata, self->tracer);
  1404. self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL,
  1405. true);
  1406. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1407. ASSERT_EQ(0, ret);
  1408. /* Install "death on getppid" filter. */
  1409. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1410. ASSERT_EQ(0, ret);
  1411. /* Tracer will redirect getpid to getppid, and we should die. */
  1412. EXPECT_NE(self->mypid, syscall(__NR_getpid));
  1413. }
  1414. #ifndef __NR_seccomp
  1415. # if defined(__i386__)
  1416. # define __NR_seccomp 354
  1417. # elif defined(__x86_64__)
  1418. # define __NR_seccomp 317
  1419. # elif defined(__arm__)
  1420. # define __NR_seccomp 383
  1421. # elif defined(__aarch64__)
  1422. # define __NR_seccomp 277
  1423. # elif defined(__hppa__)
  1424. # define __NR_seccomp 338
  1425. # elif defined(__powerpc__)
  1426. # define __NR_seccomp 358
  1427. # elif defined(__s390__)
  1428. # define __NR_seccomp 348
  1429. # else
  1430. # warning "seccomp syscall number unknown for this architecture"
  1431. # define __NR_seccomp 0xffff
  1432. # endif
  1433. #endif
  1434. #ifndef SECCOMP_SET_MODE_STRICT
  1435. #define SECCOMP_SET_MODE_STRICT 0
  1436. #endif
  1437. #ifndef SECCOMP_SET_MODE_FILTER
  1438. #define SECCOMP_SET_MODE_FILTER 1
  1439. #endif
  1440. #ifndef SECCOMP_FILTER_FLAG_TSYNC
  1441. #define SECCOMP_FILTER_FLAG_TSYNC 1
  1442. #endif
  1443. #ifndef seccomp
  1444. int seccomp(unsigned int op, unsigned int flags, void *args)
  1445. {
  1446. errno = 0;
  1447. return syscall(__NR_seccomp, op, flags, args);
  1448. }
  1449. #endif
  1450. TEST(seccomp_syscall)
  1451. {
  1452. struct sock_filter filter[] = {
  1453. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1454. };
  1455. struct sock_fprog prog = {
  1456. .len = (unsigned short)ARRAY_SIZE(filter),
  1457. .filter = filter,
  1458. };
  1459. long ret;
  1460. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1461. ASSERT_EQ(0, ret) {
  1462. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1463. }
  1464. /* Reject insane operation. */
  1465. ret = seccomp(-1, 0, &prog);
  1466. ASSERT_NE(ENOSYS, errno) {
  1467. TH_LOG("Kernel does not support seccomp syscall!");
  1468. }
  1469. EXPECT_EQ(EINVAL, errno) {
  1470. TH_LOG("Did not reject crazy op value!");
  1471. }
  1472. /* Reject strict with flags or pointer. */
  1473. ret = seccomp(SECCOMP_SET_MODE_STRICT, -1, NULL);
  1474. EXPECT_EQ(EINVAL, errno) {
  1475. TH_LOG("Did not reject mode strict with flags!");
  1476. }
  1477. ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, &prog);
  1478. EXPECT_EQ(EINVAL, errno) {
  1479. TH_LOG("Did not reject mode strict with uargs!");
  1480. }
  1481. /* Reject insane args for filter. */
  1482. ret = seccomp(SECCOMP_SET_MODE_FILTER, -1, &prog);
  1483. EXPECT_EQ(EINVAL, errno) {
  1484. TH_LOG("Did not reject crazy filter flags!");
  1485. }
  1486. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, NULL);
  1487. EXPECT_EQ(EFAULT, errno) {
  1488. TH_LOG("Did not reject NULL filter!");
  1489. }
  1490. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
  1491. EXPECT_EQ(0, errno) {
  1492. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER: %s",
  1493. strerror(errno));
  1494. }
  1495. }
  1496. TEST(seccomp_syscall_mode_lock)
  1497. {
  1498. struct sock_filter filter[] = {
  1499. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1500. };
  1501. struct sock_fprog prog = {
  1502. .len = (unsigned short)ARRAY_SIZE(filter),
  1503. .filter = filter,
  1504. };
  1505. long ret;
  1506. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
  1507. ASSERT_EQ(0, ret) {
  1508. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1509. }
  1510. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
  1511. ASSERT_NE(ENOSYS, errno) {
  1512. TH_LOG("Kernel does not support seccomp syscall!");
  1513. }
  1514. EXPECT_EQ(0, ret) {
  1515. TH_LOG("Could not install filter!");
  1516. }
  1517. /* Make sure neither entry point will switch to strict. */
  1518. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, 0, 0, 0);
  1519. EXPECT_EQ(EINVAL, errno) {
  1520. TH_LOG("Switched to mode strict!");
  1521. }
  1522. ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, NULL);
  1523. EXPECT_EQ(EINVAL, errno) {
  1524. TH_LOG("Switched to mode strict!");
  1525. }
  1526. }
  1527. TEST(TSYNC_first)
  1528. {
  1529. struct sock_filter filter[] = {
  1530. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1531. };
  1532. struct sock_fprog prog = {
  1533. .len = (unsigned short)ARRAY_SIZE(filter),
  1534. .filter = filter,
  1535. };
  1536. long ret;
  1537. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
  1538. ASSERT_EQ(0, ret) {
  1539. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1540. }
  1541. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1542. &prog);
  1543. ASSERT_NE(ENOSYS, errno) {
  1544. TH_LOG("Kernel does not support seccomp syscall!");
  1545. }
  1546. EXPECT_EQ(0, ret) {
  1547. TH_LOG("Could not install initial filter with TSYNC!");
  1548. }
  1549. }
  1550. #define TSYNC_SIBLINGS 2
  1551. struct tsync_sibling {
  1552. pthread_t tid;
  1553. pid_t system_tid;
  1554. sem_t *started;
  1555. pthread_cond_t *cond;
  1556. pthread_mutex_t *mutex;
  1557. int diverge;
  1558. int num_waits;
  1559. struct sock_fprog *prog;
  1560. struct __test_metadata *metadata;
  1561. };
  1562. FIXTURE_DATA(TSYNC) {
  1563. struct sock_fprog root_prog, apply_prog;
  1564. struct tsync_sibling sibling[TSYNC_SIBLINGS];
  1565. sem_t started;
  1566. pthread_cond_t cond;
  1567. pthread_mutex_t mutex;
  1568. int sibling_count;
  1569. };
  1570. FIXTURE_SETUP(TSYNC)
  1571. {
  1572. struct sock_filter root_filter[] = {
  1573. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1574. };
  1575. struct sock_filter apply_filter[] = {
  1576. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1577. offsetof(struct seccomp_data, nr)),
  1578. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  1579. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  1580. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1581. };
  1582. memset(&self->root_prog, 0, sizeof(self->root_prog));
  1583. memset(&self->apply_prog, 0, sizeof(self->apply_prog));
  1584. memset(&self->sibling, 0, sizeof(self->sibling));
  1585. self->root_prog.filter = malloc(sizeof(root_filter));
  1586. ASSERT_NE(NULL, self->root_prog.filter);
  1587. memcpy(self->root_prog.filter, &root_filter, sizeof(root_filter));
  1588. self->root_prog.len = (unsigned short)ARRAY_SIZE(root_filter);
  1589. self->apply_prog.filter = malloc(sizeof(apply_filter));
  1590. ASSERT_NE(NULL, self->apply_prog.filter);
  1591. memcpy(self->apply_prog.filter, &apply_filter, sizeof(apply_filter));
  1592. self->apply_prog.len = (unsigned short)ARRAY_SIZE(apply_filter);
  1593. self->sibling_count = 0;
  1594. pthread_mutex_init(&self->mutex, NULL);
  1595. pthread_cond_init(&self->cond, NULL);
  1596. sem_init(&self->started, 0, 0);
  1597. self->sibling[0].tid = 0;
  1598. self->sibling[0].cond = &self->cond;
  1599. self->sibling[0].started = &self->started;
  1600. self->sibling[0].mutex = &self->mutex;
  1601. self->sibling[0].diverge = 0;
  1602. self->sibling[0].num_waits = 1;
  1603. self->sibling[0].prog = &self->root_prog;
  1604. self->sibling[0].metadata = _metadata;
  1605. self->sibling[1].tid = 0;
  1606. self->sibling[1].cond = &self->cond;
  1607. self->sibling[1].started = &self->started;
  1608. self->sibling[1].mutex = &self->mutex;
  1609. self->sibling[1].diverge = 0;
  1610. self->sibling[1].prog = &self->root_prog;
  1611. self->sibling[1].num_waits = 1;
  1612. self->sibling[1].metadata = _metadata;
  1613. }
  1614. FIXTURE_TEARDOWN(TSYNC)
  1615. {
  1616. int sib = 0;
  1617. if (self->root_prog.filter)
  1618. free(self->root_prog.filter);
  1619. if (self->apply_prog.filter)
  1620. free(self->apply_prog.filter);
  1621. for ( ; sib < self->sibling_count; ++sib) {
  1622. struct tsync_sibling *s = &self->sibling[sib];
  1623. void *status;
  1624. if (!s->tid)
  1625. continue;
  1626. if (pthread_kill(s->tid, 0)) {
  1627. pthread_cancel(s->tid);
  1628. pthread_join(s->tid, &status);
  1629. }
  1630. }
  1631. pthread_mutex_destroy(&self->mutex);
  1632. pthread_cond_destroy(&self->cond);
  1633. sem_destroy(&self->started);
  1634. }
  1635. void *tsync_sibling(void *data)
  1636. {
  1637. long ret = 0;
  1638. struct tsync_sibling *me = data;
  1639. me->system_tid = syscall(__NR_gettid);
  1640. pthread_mutex_lock(me->mutex);
  1641. if (me->diverge) {
  1642. /* Just re-apply the root prog to fork the tree */
  1643. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER,
  1644. me->prog, 0, 0);
  1645. }
  1646. sem_post(me->started);
  1647. /* Return outside of started so parent notices failures. */
  1648. if (ret) {
  1649. pthread_mutex_unlock(me->mutex);
  1650. return (void *)SIBLING_EXIT_FAILURE;
  1651. }
  1652. do {
  1653. pthread_cond_wait(me->cond, me->mutex);
  1654. me->num_waits = me->num_waits - 1;
  1655. } while (me->num_waits);
  1656. pthread_mutex_unlock(me->mutex);
  1657. ret = prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0);
  1658. if (!ret)
  1659. return (void *)SIBLING_EXIT_NEWPRIVS;
  1660. read(0, NULL, 0);
  1661. return (void *)SIBLING_EXIT_UNKILLED;
  1662. }
  1663. void tsync_start_sibling(struct tsync_sibling *sibling)
  1664. {
  1665. pthread_create(&sibling->tid, NULL, tsync_sibling, (void *)sibling);
  1666. }
  1667. TEST_F(TSYNC, siblings_fail_prctl)
  1668. {
  1669. long ret;
  1670. void *status;
  1671. struct sock_filter filter[] = {
  1672. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1673. offsetof(struct seccomp_data, nr)),
  1674. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1),
  1675. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EINVAL),
  1676. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1677. };
  1678. struct sock_fprog prog = {
  1679. .len = (unsigned short)ARRAY_SIZE(filter),
  1680. .filter = filter,
  1681. };
  1682. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  1683. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1684. }
  1685. /* Check prctl failure detection by requesting sib 0 diverge. */
  1686. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
  1687. ASSERT_NE(ENOSYS, errno) {
  1688. TH_LOG("Kernel does not support seccomp syscall!");
  1689. }
  1690. ASSERT_EQ(0, ret) {
  1691. TH_LOG("setting filter failed");
  1692. }
  1693. self->sibling[0].diverge = 1;
  1694. tsync_start_sibling(&self->sibling[0]);
  1695. tsync_start_sibling(&self->sibling[1]);
  1696. while (self->sibling_count < TSYNC_SIBLINGS) {
  1697. sem_wait(&self->started);
  1698. self->sibling_count++;
  1699. }
  1700. /* Signal the threads to clean up*/
  1701. pthread_mutex_lock(&self->mutex);
  1702. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1703. TH_LOG("cond broadcast non-zero");
  1704. }
  1705. pthread_mutex_unlock(&self->mutex);
  1706. /* Ensure diverging sibling failed to call prctl. */
  1707. pthread_join(self->sibling[0].tid, &status);
  1708. EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status);
  1709. pthread_join(self->sibling[1].tid, &status);
  1710. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  1711. }
  1712. TEST_F(TSYNC, two_siblings_with_ancestor)
  1713. {
  1714. long ret;
  1715. void *status;
  1716. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  1717. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1718. }
  1719. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  1720. ASSERT_NE(ENOSYS, errno) {
  1721. TH_LOG("Kernel does not support seccomp syscall!");
  1722. }
  1723. ASSERT_EQ(0, ret) {
  1724. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  1725. }
  1726. tsync_start_sibling(&self->sibling[0]);
  1727. tsync_start_sibling(&self->sibling[1]);
  1728. while (self->sibling_count < TSYNC_SIBLINGS) {
  1729. sem_wait(&self->started);
  1730. self->sibling_count++;
  1731. }
  1732. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1733. &self->apply_prog);
  1734. ASSERT_EQ(0, ret) {
  1735. TH_LOG("Could install filter on all threads!");
  1736. }
  1737. /* Tell the siblings to test the policy */
  1738. pthread_mutex_lock(&self->mutex);
  1739. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1740. TH_LOG("cond broadcast non-zero");
  1741. }
  1742. pthread_mutex_unlock(&self->mutex);
  1743. /* Ensure they are both killed and don't exit cleanly. */
  1744. pthread_join(self->sibling[0].tid, &status);
  1745. EXPECT_EQ(0x0, (long)status);
  1746. pthread_join(self->sibling[1].tid, &status);
  1747. EXPECT_EQ(0x0, (long)status);
  1748. }
  1749. TEST_F(TSYNC, two_sibling_want_nnp)
  1750. {
  1751. void *status;
  1752. /* start siblings before any prctl() operations */
  1753. tsync_start_sibling(&self->sibling[0]);
  1754. tsync_start_sibling(&self->sibling[1]);
  1755. while (self->sibling_count < TSYNC_SIBLINGS) {
  1756. sem_wait(&self->started);
  1757. self->sibling_count++;
  1758. }
  1759. /* Tell the siblings to test no policy */
  1760. pthread_mutex_lock(&self->mutex);
  1761. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1762. TH_LOG("cond broadcast non-zero");
  1763. }
  1764. pthread_mutex_unlock(&self->mutex);
  1765. /* Ensure they are both upset about lacking nnp. */
  1766. pthread_join(self->sibling[0].tid, &status);
  1767. EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
  1768. pthread_join(self->sibling[1].tid, &status);
  1769. EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
  1770. }
  1771. TEST_F(TSYNC, two_siblings_with_no_filter)
  1772. {
  1773. long ret;
  1774. void *status;
  1775. /* start siblings before any prctl() operations */
  1776. tsync_start_sibling(&self->sibling[0]);
  1777. tsync_start_sibling(&self->sibling[1]);
  1778. while (self->sibling_count < TSYNC_SIBLINGS) {
  1779. sem_wait(&self->started);
  1780. self->sibling_count++;
  1781. }
  1782. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  1783. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1784. }
  1785. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1786. &self->apply_prog);
  1787. ASSERT_NE(ENOSYS, errno) {
  1788. TH_LOG("Kernel does not support seccomp syscall!");
  1789. }
  1790. ASSERT_EQ(0, ret) {
  1791. TH_LOG("Could install filter on all threads!");
  1792. }
  1793. /* Tell the siblings to test the policy */
  1794. pthread_mutex_lock(&self->mutex);
  1795. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1796. TH_LOG("cond broadcast non-zero");
  1797. }
  1798. pthread_mutex_unlock(&self->mutex);
  1799. /* Ensure they are both killed and don't exit cleanly. */
  1800. pthread_join(self->sibling[0].tid, &status);
  1801. EXPECT_EQ(0x0, (long)status);
  1802. pthread_join(self->sibling[1].tid, &status);
  1803. EXPECT_EQ(0x0, (long)status);
  1804. }
  1805. TEST_F(TSYNC, two_siblings_with_one_divergence)
  1806. {
  1807. long ret;
  1808. void *status;
  1809. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  1810. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1811. }
  1812. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  1813. ASSERT_NE(ENOSYS, errno) {
  1814. TH_LOG("Kernel does not support seccomp syscall!");
  1815. }
  1816. ASSERT_EQ(0, ret) {
  1817. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  1818. }
  1819. self->sibling[0].diverge = 1;
  1820. tsync_start_sibling(&self->sibling[0]);
  1821. tsync_start_sibling(&self->sibling[1]);
  1822. while (self->sibling_count < TSYNC_SIBLINGS) {
  1823. sem_wait(&self->started);
  1824. self->sibling_count++;
  1825. }
  1826. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1827. &self->apply_prog);
  1828. ASSERT_EQ(self->sibling[0].system_tid, ret) {
  1829. TH_LOG("Did not fail on diverged sibling.");
  1830. }
  1831. /* Wake the threads */
  1832. pthread_mutex_lock(&self->mutex);
  1833. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1834. TH_LOG("cond broadcast non-zero");
  1835. }
  1836. pthread_mutex_unlock(&self->mutex);
  1837. /* Ensure they are both unkilled. */
  1838. pthread_join(self->sibling[0].tid, &status);
  1839. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  1840. pthread_join(self->sibling[1].tid, &status);
  1841. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  1842. }
  1843. TEST_F(TSYNC, two_siblings_not_under_filter)
  1844. {
  1845. long ret, sib;
  1846. void *status;
  1847. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  1848. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1849. }
  1850. /*
  1851. * Sibling 0 will have its own seccomp policy
  1852. * and Sibling 1 will not be under seccomp at
  1853. * all. Sibling 1 will enter seccomp and 0
  1854. * will cause failure.
  1855. */
  1856. self->sibling[0].diverge = 1;
  1857. tsync_start_sibling(&self->sibling[0]);
  1858. tsync_start_sibling(&self->sibling[1]);
  1859. while (self->sibling_count < TSYNC_SIBLINGS) {
  1860. sem_wait(&self->started);
  1861. self->sibling_count++;
  1862. }
  1863. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  1864. ASSERT_NE(ENOSYS, errno) {
  1865. TH_LOG("Kernel does not support seccomp syscall!");
  1866. }
  1867. ASSERT_EQ(0, ret) {
  1868. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  1869. }
  1870. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1871. &self->apply_prog);
  1872. ASSERT_EQ(ret, self->sibling[0].system_tid) {
  1873. TH_LOG("Did not fail on diverged sibling.");
  1874. }
  1875. sib = 1;
  1876. if (ret == self->sibling[0].system_tid)
  1877. sib = 0;
  1878. pthread_mutex_lock(&self->mutex);
  1879. /* Increment the other siblings num_waits so we can clean up
  1880. * the one we just saw.
  1881. */
  1882. self->sibling[!sib].num_waits += 1;
  1883. /* Signal the thread to clean up*/
  1884. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1885. TH_LOG("cond broadcast non-zero");
  1886. }
  1887. pthread_mutex_unlock(&self->mutex);
  1888. pthread_join(self->sibling[sib].tid, &status);
  1889. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  1890. /* Poll for actual task death. pthread_join doesn't guarantee it. */
  1891. while (!kill(self->sibling[sib].system_tid, 0))
  1892. sleep(0.1);
  1893. /* Switch to the remaining sibling */
  1894. sib = !sib;
  1895. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1896. &self->apply_prog);
  1897. ASSERT_EQ(0, ret) {
  1898. TH_LOG("Expected the remaining sibling to sync");
  1899. };
  1900. pthread_mutex_lock(&self->mutex);
  1901. /* If remaining sibling didn't have a chance to wake up during
  1902. * the first broadcast, manually reduce the num_waits now.
  1903. */
  1904. if (self->sibling[sib].num_waits > 1)
  1905. self->sibling[sib].num_waits = 1;
  1906. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  1907. TH_LOG("cond broadcast non-zero");
  1908. }
  1909. pthread_mutex_unlock(&self->mutex);
  1910. pthread_join(self->sibling[sib].tid, &status);
  1911. EXPECT_EQ(0, (long)status);
  1912. /* Poll for actual task death. pthread_join doesn't guarantee it. */
  1913. while (!kill(self->sibling[sib].system_tid, 0))
  1914. sleep(0.1);
  1915. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  1916. &self->apply_prog);
  1917. ASSERT_EQ(0, ret); /* just us chickens */
  1918. }
  1919. /* Make sure restarted syscalls are seen directly as "restart_syscall". */
  1920. TEST(syscall_restart)
  1921. {
  1922. long ret;
  1923. unsigned long msg;
  1924. pid_t child_pid;
  1925. int pipefd[2];
  1926. int status;
  1927. siginfo_t info = { };
  1928. struct sock_filter filter[] = {
  1929. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1930. offsetof(struct seccomp_data, nr)),
  1931. #ifdef __NR_sigreturn
  1932. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_sigreturn, 6, 0),
  1933. #endif
  1934. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 5, 0),
  1935. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 4, 0),
  1936. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 3, 0),
  1937. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_nanosleep, 4, 0),
  1938. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0),
  1939. /* Allow __NR_write for easy logging. */
  1940. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1),
  1941. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1942. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  1943. /* The nanosleep jump target. */
  1944. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100),
  1945. /* The restart_syscall jump target. */
  1946. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200),
  1947. };
  1948. struct sock_fprog prog = {
  1949. .len = (unsigned short)ARRAY_SIZE(filter),
  1950. .filter = filter,
  1951. };
  1952. #if defined(__arm__)
  1953. struct utsname utsbuf;
  1954. #endif
  1955. ASSERT_EQ(0, pipe(pipefd));
  1956. child_pid = fork();
  1957. ASSERT_LE(0, child_pid);
  1958. if (child_pid == 0) {
  1959. /* Child uses EXPECT not ASSERT to deliver status correctly. */
  1960. char buf = ' ';
  1961. struct timespec timeout = { };
  1962. /* Attach parent as tracer and stop. */
  1963. EXPECT_EQ(0, ptrace(PTRACE_TRACEME));
  1964. EXPECT_EQ(0, raise(SIGSTOP));
  1965. EXPECT_EQ(0, close(pipefd[1]));
  1966. EXPECT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  1967. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1968. }
  1969. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1970. EXPECT_EQ(0, ret) {
  1971. TH_LOG("Failed to install filter!");
  1972. }
  1973. EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
  1974. TH_LOG("Failed to read() sync from parent");
  1975. }
  1976. EXPECT_EQ('.', buf) {
  1977. TH_LOG("Failed to get sync data from read()");
  1978. }
  1979. /* Start nanosleep to be interrupted. */
  1980. timeout.tv_sec = 1;
  1981. errno = 0;
  1982. EXPECT_EQ(0, nanosleep(&timeout, NULL)) {
  1983. TH_LOG("Call to nanosleep() failed (errno %d)", errno);
  1984. }
  1985. /* Read final sync from parent. */
  1986. EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
  1987. TH_LOG("Failed final read() from parent");
  1988. }
  1989. EXPECT_EQ('!', buf) {
  1990. TH_LOG("Failed to get final data from read()");
  1991. }
  1992. /* Directly report the status of our test harness results. */
  1993. syscall(__NR_exit, _metadata->passed ? EXIT_SUCCESS
  1994. : EXIT_FAILURE);
  1995. }
  1996. EXPECT_EQ(0, close(pipefd[0]));
  1997. /* Attach to child, setup options, and release. */
  1998. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  1999. ASSERT_EQ(true, WIFSTOPPED(status));
  2000. ASSERT_EQ(0, ptrace(PTRACE_SETOPTIONS, child_pid, NULL,
  2001. PTRACE_O_TRACESECCOMP));
  2002. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2003. ASSERT_EQ(1, write(pipefd[1], ".", 1));
  2004. /* Wait for nanosleep() to start. */
  2005. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2006. ASSERT_EQ(true, WIFSTOPPED(status));
  2007. ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
  2008. ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
  2009. ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
  2010. ASSERT_EQ(0x100, msg);
  2011. EXPECT_EQ(__NR_nanosleep, get_syscall(_metadata, child_pid));
  2012. /* Might as well check siginfo for sanity while we're here. */
  2013. ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
  2014. ASSERT_EQ(SIGTRAP, info.si_signo);
  2015. ASSERT_EQ(SIGTRAP | (PTRACE_EVENT_SECCOMP << 8), info.si_code);
  2016. EXPECT_EQ(0, info.si_errno);
  2017. EXPECT_EQ(getuid(), info.si_uid);
  2018. /* Verify signal delivery came from child (seccomp-triggered). */
  2019. EXPECT_EQ(child_pid, info.si_pid);
  2020. /* Interrupt nanosleep with SIGSTOP (which we'll need to handle). */
  2021. ASSERT_EQ(0, kill(child_pid, SIGSTOP));
  2022. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2023. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2024. ASSERT_EQ(true, WIFSTOPPED(status));
  2025. ASSERT_EQ(SIGSTOP, WSTOPSIG(status));
  2026. /* Verify signal delivery came from parent now. */
  2027. ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
  2028. EXPECT_EQ(getpid(), info.si_pid);
  2029. /* Restart nanosleep with SIGCONT, which triggers restart_syscall. */
  2030. ASSERT_EQ(0, kill(child_pid, SIGCONT));
  2031. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2032. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2033. ASSERT_EQ(true, WIFSTOPPED(status));
  2034. ASSERT_EQ(SIGCONT, WSTOPSIG(status));
  2035. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2036. /* Wait for restart_syscall() to start. */
  2037. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2038. ASSERT_EQ(true, WIFSTOPPED(status));
  2039. ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
  2040. ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
  2041. ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
  2042. ASSERT_EQ(0x200, msg);
  2043. ret = get_syscall(_metadata, child_pid);
  2044. #if defined(__arm__)
  2045. /*
  2046. * FIXME:
  2047. * - native ARM registers do NOT expose true syscall.
  2048. * - compat ARM registers on ARM64 DO expose true syscall.
  2049. */
  2050. ASSERT_EQ(0, uname(&utsbuf));
  2051. if (strncmp(utsbuf.machine, "arm", 3) == 0) {
  2052. EXPECT_EQ(__NR_nanosleep, ret);
  2053. } else
  2054. #endif
  2055. {
  2056. EXPECT_EQ(__NR_restart_syscall, ret);
  2057. }
  2058. /* Write again to end test. */
  2059. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2060. ASSERT_EQ(1, write(pipefd[1], "!", 1));
  2061. EXPECT_EQ(0, close(pipefd[1]));
  2062. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2063. if (WIFSIGNALED(status) || WEXITSTATUS(status))
  2064. _metadata->passed = 0;
  2065. }
  2066. /*
  2067. * TODO:
  2068. * - add microbenchmarks
  2069. * - expand NNP testing
  2070. * - better arch-specific TRACE and TRAP handlers.
  2071. * - endianness checking when appropriate
  2072. * - 64-bit arg prodding
  2073. * - arch value testing (x86 modes especially)
  2074. * - ...
  2075. */
  2076. TEST_HARNESS_MAIN