seccomp_bpf.c 78 KB

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