seccomp_bpf.c 124 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
  4. *
  5. * Test code for seccomp bpf.
  6. */
  7. #define _GNU_SOURCE
  8. #include <sys/types.h>
  9. /*
  10. * glibc 2.26 and later have SIGSYS in siginfo_t. Before that,
  11. * we need to use the kernel's siginfo.h file and trick glibc
  12. * into accepting it.
  13. */
  14. #if !__GLIBC_PREREQ(2, 26)
  15. # include <asm/siginfo.h>
  16. # define __have_siginfo_t 1
  17. # define __have_sigval_t 1
  18. # define __have_sigevent_t 1
  19. #endif
  20. #include <errno.h>
  21. #include <linux/filter.h>
  22. #include <sys/prctl.h>
  23. #include <sys/ptrace.h>
  24. #include <sys/user.h>
  25. #include <linux/prctl.h>
  26. #include <linux/ptrace.h>
  27. #include <linux/seccomp.h>
  28. #include <pthread.h>
  29. #include <semaphore.h>
  30. #include <signal.h>
  31. #include <stddef.h>
  32. #include <stdbool.h>
  33. #include <string.h>
  34. #include <time.h>
  35. #include <limits.h>
  36. #include <linux/elf.h>
  37. #include <sys/uio.h>
  38. #include <sys/utsname.h>
  39. #include <sys/fcntl.h>
  40. #include <sys/mman.h>
  41. #include <sys/times.h>
  42. #include <sys/socket.h>
  43. #include <sys/ioctl.h>
  44. #include <linux/kcmp.h>
  45. #include <sys/resource.h>
  46. #include <sys/capability.h>
  47. #include <unistd.h>
  48. #include <sys/syscall.h>
  49. #include <poll.h>
  50. #include "../kselftest_harness.h"
  51. #include "../clone3/clone3_selftests.h"
  52. /* Attempt to de-conflict with the selftests tree. */
  53. #ifndef SKIP
  54. #define SKIP(s, ...) XFAIL(s, ##__VA_ARGS__)
  55. #endif
  56. #ifndef MIN
  57. #define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
  58. #endif
  59. #ifndef PR_SET_PTRACER
  60. # define PR_SET_PTRACER 0x59616d61
  61. #endif
  62. #ifndef PR_SET_NO_NEW_PRIVS
  63. #define PR_SET_NO_NEW_PRIVS 38
  64. #define PR_GET_NO_NEW_PRIVS 39
  65. #endif
  66. #ifndef PR_SECCOMP_EXT
  67. #define PR_SECCOMP_EXT 43
  68. #endif
  69. #ifndef SECCOMP_EXT_ACT
  70. #define SECCOMP_EXT_ACT 1
  71. #endif
  72. #ifndef SECCOMP_EXT_ACT_TSYNC
  73. #define SECCOMP_EXT_ACT_TSYNC 1
  74. #endif
  75. #ifndef SECCOMP_MODE_STRICT
  76. #define SECCOMP_MODE_STRICT 1
  77. #endif
  78. #ifndef SECCOMP_MODE_FILTER
  79. #define SECCOMP_MODE_FILTER 2
  80. #endif
  81. #ifndef SECCOMP_RET_ALLOW
  82. struct seccomp_data {
  83. int nr;
  84. __u32 arch;
  85. __u64 instruction_pointer;
  86. __u64 args[6];
  87. };
  88. #endif
  89. #ifndef SECCOMP_RET_KILL_PROCESS
  90. #define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process */
  91. #define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread */
  92. #endif
  93. #ifndef SECCOMP_RET_KILL
  94. #define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD
  95. #define SECCOMP_RET_TRAP 0x00030000U /* disallow and force a SIGSYS */
  96. #define SECCOMP_RET_ERRNO 0x00050000U /* returns an errno */
  97. #define SECCOMP_RET_TRACE 0x7ff00000U /* pass to a tracer or disallow */
  98. #define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */
  99. #endif
  100. #ifndef SECCOMP_RET_LOG
  101. #define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */
  102. #endif
  103. #ifndef __NR_seccomp
  104. # if defined(__i386__)
  105. # define __NR_seccomp 354
  106. # elif defined(__x86_64__)
  107. # define __NR_seccomp 317
  108. # elif defined(__arm__)
  109. # define __NR_seccomp 383
  110. # elif defined(__aarch64__)
  111. # define __NR_seccomp 277
  112. # elif defined(__riscv)
  113. # define __NR_seccomp 277
  114. # elif defined(__csky__)
  115. # define __NR_seccomp 277
  116. # elif defined(__loongarch__)
  117. # define __NR_seccomp 277
  118. # elif defined(__hppa__)
  119. # define __NR_seccomp 338
  120. # elif defined(__powerpc__)
  121. # define __NR_seccomp 358
  122. # elif defined(__s390__)
  123. # define __NR_seccomp 348
  124. # elif defined(__xtensa__)
  125. # define __NR_seccomp 337
  126. # elif defined(__sh__)
  127. # define __NR_seccomp 372
  128. # elif defined(__mc68000__)
  129. # define __NR_seccomp 380
  130. # else
  131. # warning "seccomp syscall number unknown for this architecture"
  132. # define __NR_seccomp 0xffff
  133. # endif
  134. #endif
  135. #ifndef SECCOMP_SET_MODE_STRICT
  136. #define SECCOMP_SET_MODE_STRICT 0
  137. #endif
  138. #ifndef SECCOMP_SET_MODE_FILTER
  139. #define SECCOMP_SET_MODE_FILTER 1
  140. #endif
  141. #ifndef SECCOMP_GET_ACTION_AVAIL
  142. #define SECCOMP_GET_ACTION_AVAIL 2
  143. #endif
  144. #ifndef SECCOMP_GET_NOTIF_SIZES
  145. #define SECCOMP_GET_NOTIF_SIZES 3
  146. #endif
  147. #ifndef SECCOMP_FILTER_FLAG_TSYNC
  148. #define SECCOMP_FILTER_FLAG_TSYNC (1UL << 0)
  149. #endif
  150. #ifndef SECCOMP_FILTER_FLAG_LOG
  151. #define SECCOMP_FILTER_FLAG_LOG (1UL << 1)
  152. #endif
  153. #ifndef SECCOMP_FILTER_FLAG_SPEC_ALLOW
  154. #define SECCOMP_FILTER_FLAG_SPEC_ALLOW (1UL << 2)
  155. #endif
  156. #ifndef PTRACE_SECCOMP_GET_METADATA
  157. #define PTRACE_SECCOMP_GET_METADATA 0x420d
  158. struct seccomp_metadata {
  159. __u64 filter_off; /* Input: which filter */
  160. __u64 flags; /* Output: filter's flags */
  161. };
  162. #endif
  163. #ifndef SECCOMP_FILTER_FLAG_NEW_LISTENER
  164. #define SECCOMP_FILTER_FLAG_NEW_LISTENER (1UL << 3)
  165. #endif
  166. #ifndef SECCOMP_RET_USER_NOTIF
  167. #define SECCOMP_RET_USER_NOTIF 0x7fc00000U
  168. #define SECCOMP_IOC_MAGIC '!'
  169. #define SECCOMP_IO(nr) _IO(SECCOMP_IOC_MAGIC, nr)
  170. #define SECCOMP_IOR(nr, type) _IOR(SECCOMP_IOC_MAGIC, nr, type)
  171. #define SECCOMP_IOW(nr, type) _IOW(SECCOMP_IOC_MAGIC, nr, type)
  172. #define SECCOMP_IOWR(nr, type) _IOWR(SECCOMP_IOC_MAGIC, nr, type)
  173. /* Flags for seccomp notification fd ioctl. */
  174. #define SECCOMP_IOCTL_NOTIF_RECV SECCOMP_IOWR(0, struct seccomp_notif)
  175. #define SECCOMP_IOCTL_NOTIF_SEND SECCOMP_IOWR(1, \
  176. struct seccomp_notif_resp)
  177. #define SECCOMP_IOCTL_NOTIF_ID_VALID SECCOMP_IOW(2, __u64)
  178. struct seccomp_notif {
  179. __u64 id;
  180. __u32 pid;
  181. __u32 flags;
  182. struct seccomp_data data;
  183. };
  184. struct seccomp_notif_resp {
  185. __u64 id;
  186. __s64 val;
  187. __s32 error;
  188. __u32 flags;
  189. };
  190. struct seccomp_notif_sizes {
  191. __u16 seccomp_notif;
  192. __u16 seccomp_notif_resp;
  193. __u16 seccomp_data;
  194. };
  195. #endif
  196. #ifndef SECCOMP_IOCTL_NOTIF_ADDFD
  197. /* On success, the return value is the remote process's added fd number */
  198. #define SECCOMP_IOCTL_NOTIF_ADDFD SECCOMP_IOW(3, \
  199. struct seccomp_notif_addfd)
  200. /* valid flags for seccomp_notif_addfd */
  201. #define SECCOMP_ADDFD_FLAG_SETFD (1UL << 0) /* Specify remote fd */
  202. struct seccomp_notif_addfd {
  203. __u64 id;
  204. __u32 flags;
  205. __u32 srcfd;
  206. __u32 newfd;
  207. __u32 newfd_flags;
  208. };
  209. #endif
  210. #ifndef SECCOMP_ADDFD_FLAG_SEND
  211. #define SECCOMP_ADDFD_FLAG_SEND (1UL << 1) /* Addfd and return it, atomically */
  212. #endif
  213. struct seccomp_notif_addfd_small {
  214. __u64 id;
  215. char weird[4];
  216. };
  217. #define SECCOMP_IOCTL_NOTIF_ADDFD_SMALL \
  218. SECCOMP_IOW(3, struct seccomp_notif_addfd_small)
  219. struct seccomp_notif_addfd_big {
  220. union {
  221. struct seccomp_notif_addfd addfd;
  222. char buf[sizeof(struct seccomp_notif_addfd) + 8];
  223. };
  224. };
  225. #define SECCOMP_IOCTL_NOTIF_ADDFD_BIG \
  226. SECCOMP_IOWR(3, struct seccomp_notif_addfd_big)
  227. #ifndef PTRACE_EVENTMSG_SYSCALL_ENTRY
  228. #define PTRACE_EVENTMSG_SYSCALL_ENTRY 1
  229. #define PTRACE_EVENTMSG_SYSCALL_EXIT 2
  230. #endif
  231. #ifndef SECCOMP_USER_NOTIF_FLAG_CONTINUE
  232. #define SECCOMP_USER_NOTIF_FLAG_CONTINUE 0x00000001
  233. #endif
  234. #ifndef SECCOMP_FILTER_FLAG_TSYNC_ESRCH
  235. #define SECCOMP_FILTER_FLAG_TSYNC_ESRCH (1UL << 4)
  236. #endif
  237. #ifndef SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV
  238. #define SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV (1UL << 5)
  239. #endif
  240. #ifndef seccomp
  241. int seccomp(unsigned int op, unsigned int flags, void *args)
  242. {
  243. errno = 0;
  244. return syscall(__NR_seccomp, op, flags, args);
  245. }
  246. #endif
  247. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  248. #define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]))
  249. #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
  250. #define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]) + sizeof(__u32))
  251. #else
  252. #error "wut? Unknown __BYTE_ORDER__?!"
  253. #endif
  254. #define SIBLING_EXIT_UNKILLED 0xbadbeef
  255. #define SIBLING_EXIT_FAILURE 0xbadface
  256. #define SIBLING_EXIT_NEWPRIVS 0xbadfeed
  257. static int __filecmp(pid_t pid1, pid_t pid2, int fd1, int fd2)
  258. {
  259. #ifdef __NR_kcmp
  260. errno = 0;
  261. return syscall(__NR_kcmp, pid1, pid2, KCMP_FILE, fd1, fd2);
  262. #else
  263. errno = ENOSYS;
  264. return -1;
  265. #endif
  266. }
  267. /* Have TH_LOG report actual location filecmp() is used. */
  268. #define filecmp(pid1, pid2, fd1, fd2) ({ \
  269. int _ret; \
  270. \
  271. _ret = __filecmp(pid1, pid2, fd1, fd2); \
  272. if (_ret != 0) { \
  273. if (_ret < 0 && errno == ENOSYS) { \
  274. TH_LOG("kcmp() syscall missing (test is less accurate)");\
  275. _ret = 0; \
  276. } \
  277. } \
  278. _ret; })
  279. TEST(kcmp)
  280. {
  281. int ret;
  282. ret = __filecmp(getpid(), getpid(), 1, 1);
  283. EXPECT_EQ(ret, 0);
  284. if (ret != 0 && errno == ENOSYS)
  285. SKIP(return, "Kernel does not support kcmp() (missing CONFIG_KCMP?)");
  286. }
  287. TEST(mode_strict_support)
  288. {
  289. long ret;
  290. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
  291. ASSERT_EQ(0, ret) {
  292. TH_LOG("Kernel does not support CONFIG_SECCOMP");
  293. }
  294. syscall(__NR_exit, 0);
  295. }
  296. TEST_SIGNAL(mode_strict_cannot_call_prctl, SIGKILL)
  297. {
  298. long ret;
  299. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, NULL, NULL);
  300. ASSERT_EQ(0, ret) {
  301. TH_LOG("Kernel does not support CONFIG_SECCOMP");
  302. }
  303. syscall(__NR_prctl, PR_SET_SECCOMP, SECCOMP_MODE_FILTER,
  304. NULL, NULL, NULL);
  305. EXPECT_FALSE(true) {
  306. TH_LOG("Unreachable!");
  307. }
  308. }
  309. /* Note! This doesn't test no new privs behavior */
  310. TEST(no_new_privs_support)
  311. {
  312. long ret;
  313. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  314. EXPECT_EQ(0, ret) {
  315. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  316. }
  317. }
  318. /* Tests kernel support by checking for a copy_from_user() fault on NULL. */
  319. TEST(mode_filter_support)
  320. {
  321. long ret;
  322. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
  323. ASSERT_EQ(0, ret) {
  324. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  325. }
  326. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, NULL, NULL);
  327. EXPECT_EQ(-1, ret);
  328. EXPECT_EQ(EFAULT, errno) {
  329. TH_LOG("Kernel does not support CONFIG_SECCOMP_FILTER!");
  330. }
  331. }
  332. TEST(mode_filter_without_nnp)
  333. {
  334. struct sock_filter filter[] = {
  335. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  336. };
  337. struct sock_fprog prog = {
  338. .len = (unsigned short)ARRAY_SIZE(filter),
  339. .filter = filter,
  340. };
  341. long ret;
  342. cap_t cap = cap_get_proc();
  343. cap_flag_value_t is_cap_sys_admin = 0;
  344. ret = prctl(PR_GET_NO_NEW_PRIVS, 0, NULL, 0, 0);
  345. ASSERT_LE(0, ret) {
  346. TH_LOG("Expected 0 or unsupported for NO_NEW_PRIVS");
  347. }
  348. errno = 0;
  349. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  350. /* Succeeds with CAP_SYS_ADMIN, fails without */
  351. cap_get_flag(cap, CAP_SYS_ADMIN, CAP_EFFECTIVE, &is_cap_sys_admin);
  352. if (!is_cap_sys_admin) {
  353. EXPECT_EQ(-1, ret);
  354. EXPECT_EQ(EACCES, errno);
  355. } else {
  356. EXPECT_EQ(0, ret);
  357. }
  358. }
  359. #define MAX_INSNS_PER_PATH 32768
  360. TEST(filter_size_limits)
  361. {
  362. int i;
  363. int count = BPF_MAXINSNS + 1;
  364. struct sock_filter allow[] = {
  365. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  366. };
  367. struct sock_filter *filter;
  368. struct sock_fprog prog = { };
  369. long ret;
  370. filter = calloc(count, sizeof(*filter));
  371. ASSERT_NE(NULL, filter);
  372. for (i = 0; i < count; i++)
  373. filter[i] = allow[0];
  374. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  375. ASSERT_EQ(0, ret);
  376. prog.filter = filter;
  377. prog.len = count;
  378. /* Too many filter instructions in a single filter. */
  379. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  380. ASSERT_NE(0, ret) {
  381. TH_LOG("Installing %d insn filter was allowed", prog.len);
  382. }
  383. /* One less is okay, though. */
  384. prog.len -= 1;
  385. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  386. ASSERT_EQ(0, ret) {
  387. TH_LOG("Installing %d insn filter wasn't allowed", prog.len);
  388. }
  389. }
  390. TEST(filter_chain_limits)
  391. {
  392. int i;
  393. int count = BPF_MAXINSNS;
  394. struct sock_filter allow[] = {
  395. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  396. };
  397. struct sock_filter *filter;
  398. struct sock_fprog prog = { };
  399. long ret;
  400. filter = calloc(count, sizeof(*filter));
  401. ASSERT_NE(NULL, filter);
  402. for (i = 0; i < count; i++)
  403. filter[i] = allow[0];
  404. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  405. ASSERT_EQ(0, ret);
  406. prog.filter = filter;
  407. prog.len = 1;
  408. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  409. ASSERT_EQ(0, ret);
  410. prog.len = count;
  411. /* Too many total filter instructions. */
  412. for (i = 0; i < MAX_INSNS_PER_PATH; i++) {
  413. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  414. if (ret != 0)
  415. break;
  416. }
  417. ASSERT_NE(0, ret) {
  418. TH_LOG("Allowed %d %d-insn filters (total with penalties:%d)",
  419. i, count, i * (count + 4));
  420. }
  421. }
  422. TEST(mode_filter_cannot_move_to_strict)
  423. {
  424. struct sock_filter filter[] = {
  425. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  426. };
  427. struct sock_fprog prog = {
  428. .len = (unsigned short)ARRAY_SIZE(filter),
  429. .filter = filter,
  430. };
  431. long ret;
  432. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  433. ASSERT_EQ(0, ret);
  434. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  435. ASSERT_EQ(0, ret);
  436. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, NULL, 0, 0);
  437. EXPECT_EQ(-1, ret);
  438. EXPECT_EQ(EINVAL, errno);
  439. }
  440. TEST(mode_filter_get_seccomp)
  441. {
  442. struct sock_filter filter[] = {
  443. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  444. };
  445. struct sock_fprog prog = {
  446. .len = (unsigned short)ARRAY_SIZE(filter),
  447. .filter = filter,
  448. };
  449. long ret;
  450. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  451. ASSERT_EQ(0, ret);
  452. ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
  453. EXPECT_EQ(0, ret);
  454. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  455. ASSERT_EQ(0, ret);
  456. ret = prctl(PR_GET_SECCOMP, 0, 0, 0, 0);
  457. EXPECT_EQ(2, ret);
  458. }
  459. TEST(ALLOW_all)
  460. {
  461. struct sock_filter filter[] = {
  462. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  463. };
  464. struct sock_fprog prog = {
  465. .len = (unsigned short)ARRAY_SIZE(filter),
  466. .filter = filter,
  467. };
  468. long ret;
  469. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  470. ASSERT_EQ(0, ret);
  471. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  472. ASSERT_EQ(0, ret);
  473. }
  474. TEST(empty_prog)
  475. {
  476. struct sock_filter filter[] = {
  477. };
  478. struct sock_fprog prog = {
  479. .len = (unsigned short)ARRAY_SIZE(filter),
  480. .filter = filter,
  481. };
  482. long ret;
  483. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  484. ASSERT_EQ(0, ret);
  485. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  486. EXPECT_EQ(-1, ret);
  487. EXPECT_EQ(EINVAL, errno);
  488. }
  489. TEST(log_all)
  490. {
  491. struct sock_filter filter[] = {
  492. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_LOG),
  493. };
  494. struct sock_fprog prog = {
  495. .len = (unsigned short)ARRAY_SIZE(filter),
  496. .filter = filter,
  497. };
  498. long ret;
  499. pid_t parent = getppid();
  500. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  501. ASSERT_EQ(0, ret);
  502. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  503. ASSERT_EQ(0, ret);
  504. /* getppid() should succeed and be logged (no check for logging) */
  505. EXPECT_EQ(parent, syscall(__NR_getppid));
  506. }
  507. TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS)
  508. {
  509. struct sock_filter filter[] = {
  510. BPF_STMT(BPF_RET|BPF_K, 0x10000000U),
  511. };
  512. struct sock_fprog prog = {
  513. .len = (unsigned short)ARRAY_SIZE(filter),
  514. .filter = filter,
  515. };
  516. long ret;
  517. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  518. ASSERT_EQ(0, ret);
  519. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  520. ASSERT_EQ(0, ret);
  521. EXPECT_EQ(0, syscall(__NR_getpid)) {
  522. TH_LOG("getpid() shouldn't ever return");
  523. }
  524. }
  525. /* return code >= 0x80000000 is unused. */
  526. TEST_SIGNAL(unknown_ret_is_kill_above_allow, SIGSYS)
  527. {
  528. struct sock_filter filter[] = {
  529. BPF_STMT(BPF_RET|BPF_K, 0x90000000U),
  530. };
  531. struct sock_fprog prog = {
  532. .len = (unsigned short)ARRAY_SIZE(filter),
  533. .filter = filter,
  534. };
  535. long ret;
  536. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  537. ASSERT_EQ(0, ret);
  538. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  539. ASSERT_EQ(0, ret);
  540. EXPECT_EQ(0, syscall(__NR_getpid)) {
  541. TH_LOG("getpid() shouldn't ever return");
  542. }
  543. }
  544. TEST_SIGNAL(KILL_all, SIGSYS)
  545. {
  546. struct sock_filter filter[] = {
  547. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  548. };
  549. struct sock_fprog prog = {
  550. .len = (unsigned short)ARRAY_SIZE(filter),
  551. .filter = filter,
  552. };
  553. long ret;
  554. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  555. ASSERT_EQ(0, ret);
  556. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  557. ASSERT_EQ(0, ret);
  558. }
  559. TEST_SIGNAL(KILL_one, SIGSYS)
  560. {
  561. struct sock_filter filter[] = {
  562. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  563. offsetof(struct seccomp_data, nr)),
  564. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  565. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  566. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  567. };
  568. struct sock_fprog prog = {
  569. .len = (unsigned short)ARRAY_SIZE(filter),
  570. .filter = filter,
  571. };
  572. long ret;
  573. pid_t parent = getppid();
  574. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  575. ASSERT_EQ(0, ret);
  576. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  577. ASSERT_EQ(0, ret);
  578. EXPECT_EQ(parent, syscall(__NR_getppid));
  579. /* getpid() should never return. */
  580. EXPECT_EQ(0, syscall(__NR_getpid));
  581. }
  582. TEST_SIGNAL(KILL_one_arg_one, SIGSYS)
  583. {
  584. void *fatal_address;
  585. struct sock_filter filter[] = {
  586. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  587. offsetof(struct seccomp_data, nr)),
  588. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_times, 1, 0),
  589. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  590. /* Only both with lower 32-bit for now. */
  591. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)),
  592. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K,
  593. (unsigned long)&fatal_address, 0, 1),
  594. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  595. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  596. };
  597. struct sock_fprog prog = {
  598. .len = (unsigned short)ARRAY_SIZE(filter),
  599. .filter = filter,
  600. };
  601. long ret;
  602. pid_t parent = getppid();
  603. struct tms timebuf;
  604. clock_t clock = times(&timebuf);
  605. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  606. ASSERT_EQ(0, ret);
  607. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  608. ASSERT_EQ(0, ret);
  609. EXPECT_EQ(parent, syscall(__NR_getppid));
  610. EXPECT_LE(clock, syscall(__NR_times, &timebuf));
  611. /* times() should never return. */
  612. EXPECT_EQ(0, syscall(__NR_times, &fatal_address));
  613. }
  614. TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
  615. {
  616. #ifndef __NR_mmap2
  617. int sysno = __NR_mmap;
  618. #else
  619. int sysno = __NR_mmap2;
  620. #endif
  621. struct sock_filter filter[] = {
  622. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  623. offsetof(struct seccomp_data, nr)),
  624. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, sysno, 1, 0),
  625. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  626. /* Only both with lower 32-bit for now. */
  627. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)),
  628. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
  629. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  630. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  631. };
  632. struct sock_fprog prog = {
  633. .len = (unsigned short)ARRAY_SIZE(filter),
  634. .filter = filter,
  635. };
  636. long ret;
  637. pid_t parent = getppid();
  638. int fd;
  639. void *map1, *map2;
  640. int page_size = sysconf(_SC_PAGESIZE);
  641. ASSERT_LT(0, page_size);
  642. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  643. ASSERT_EQ(0, ret);
  644. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  645. ASSERT_EQ(0, ret);
  646. fd = open("/dev/zero", O_RDONLY);
  647. ASSERT_NE(-1, fd);
  648. EXPECT_EQ(parent, syscall(__NR_getppid));
  649. map1 = (void *)syscall(sysno,
  650. NULL, page_size, PROT_READ, MAP_PRIVATE, fd, page_size);
  651. EXPECT_NE(MAP_FAILED, map1);
  652. /* mmap2() should never return. */
  653. map2 = (void *)syscall(sysno,
  654. NULL, page_size, PROT_READ, MAP_PRIVATE, fd, 0x0C0FFEE);
  655. EXPECT_EQ(MAP_FAILED, map2);
  656. /* The test failed, so clean up the resources. */
  657. munmap(map1, page_size);
  658. munmap(map2, page_size);
  659. close(fd);
  660. }
  661. /* This is a thread task to die via seccomp filter violation. */
  662. void *kill_thread(void *data)
  663. {
  664. bool die = (bool)data;
  665. if (die) {
  666. syscall(__NR_getpid);
  667. return (void *)SIBLING_EXIT_FAILURE;
  668. }
  669. return (void *)SIBLING_EXIT_UNKILLED;
  670. }
  671. enum kill_t {
  672. KILL_THREAD,
  673. KILL_PROCESS,
  674. RET_UNKNOWN
  675. };
  676. /* Prepare a thread that will kill itself or both of us. */
  677. void kill_thread_or_group(struct __test_metadata *_metadata,
  678. enum kill_t kill_how)
  679. {
  680. pthread_t thread;
  681. void *status;
  682. /* Kill only when calling __NR_getpid. */
  683. struct sock_filter filter_thread[] = {
  684. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  685. offsetof(struct seccomp_data, nr)),
  686. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  687. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_THREAD),
  688. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  689. };
  690. struct sock_fprog prog_thread = {
  691. .len = (unsigned short)ARRAY_SIZE(filter_thread),
  692. .filter = filter_thread,
  693. };
  694. int kill = kill_how == KILL_PROCESS ? SECCOMP_RET_KILL_PROCESS : 0xAAAAAAAA;
  695. struct sock_filter filter_process[] = {
  696. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  697. offsetof(struct seccomp_data, nr)),
  698. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  699. BPF_STMT(BPF_RET|BPF_K, kill),
  700. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  701. };
  702. struct sock_fprog prog_process = {
  703. .len = (unsigned short)ARRAY_SIZE(filter_process),
  704. .filter = filter_process,
  705. };
  706. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  707. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  708. }
  709. ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0,
  710. kill_how == KILL_THREAD ? &prog_thread
  711. : &prog_process));
  712. /*
  713. * Add the KILL_THREAD rule again to make sure that the KILL_PROCESS
  714. * flag cannot be downgraded by a new filter.
  715. */
  716. if (kill_how == KILL_PROCESS)
  717. ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog_thread));
  718. /* Start a thread that will exit immediately. */
  719. ASSERT_EQ(0, pthread_create(&thread, NULL, kill_thread, (void *)false));
  720. ASSERT_EQ(0, pthread_join(thread, &status));
  721. ASSERT_EQ(SIBLING_EXIT_UNKILLED, (unsigned long)status);
  722. /* Start a thread that will die immediately. */
  723. ASSERT_EQ(0, pthread_create(&thread, NULL, kill_thread, (void *)true));
  724. ASSERT_EQ(0, pthread_join(thread, &status));
  725. ASSERT_NE(SIBLING_EXIT_FAILURE, (unsigned long)status);
  726. /*
  727. * If we get here, only the spawned thread died. Let the parent know
  728. * the whole process didn't die (i.e. this thread, the spawner,
  729. * stayed running).
  730. */
  731. exit(42);
  732. }
  733. TEST(KILL_thread)
  734. {
  735. int status;
  736. pid_t child_pid;
  737. child_pid = fork();
  738. ASSERT_LE(0, child_pid);
  739. if (child_pid == 0) {
  740. kill_thread_or_group(_metadata, KILL_THREAD);
  741. _exit(38);
  742. }
  743. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  744. /* If only the thread was killed, we'll see exit 42. */
  745. ASSERT_TRUE(WIFEXITED(status));
  746. ASSERT_EQ(42, WEXITSTATUS(status));
  747. }
  748. TEST(KILL_process)
  749. {
  750. int status;
  751. pid_t child_pid;
  752. child_pid = fork();
  753. ASSERT_LE(0, child_pid);
  754. if (child_pid == 0) {
  755. kill_thread_or_group(_metadata, KILL_PROCESS);
  756. _exit(38);
  757. }
  758. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  759. /* If the entire process was killed, we'll see SIGSYS. */
  760. ASSERT_TRUE(WIFSIGNALED(status));
  761. ASSERT_EQ(SIGSYS, WTERMSIG(status));
  762. }
  763. TEST(KILL_unknown)
  764. {
  765. int status;
  766. pid_t child_pid;
  767. child_pid = fork();
  768. ASSERT_LE(0, child_pid);
  769. if (child_pid == 0) {
  770. kill_thread_or_group(_metadata, RET_UNKNOWN);
  771. _exit(38);
  772. }
  773. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  774. /* If the entire process was killed, we'll see SIGSYS. */
  775. EXPECT_TRUE(WIFSIGNALED(status)) {
  776. TH_LOG("Unknown SECCOMP_RET is only killing the thread?");
  777. }
  778. ASSERT_EQ(SIGSYS, WTERMSIG(status));
  779. }
  780. /* TODO(wad) add 64-bit versus 32-bit arg tests. */
  781. TEST(arg_out_of_range)
  782. {
  783. struct sock_filter filter[] = {
  784. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(6)),
  785. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  786. };
  787. struct sock_fprog prog = {
  788. .len = (unsigned short)ARRAY_SIZE(filter),
  789. .filter = filter,
  790. };
  791. long ret;
  792. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  793. ASSERT_EQ(0, ret);
  794. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
  795. EXPECT_EQ(-1, ret);
  796. EXPECT_EQ(EINVAL, errno);
  797. }
  798. #define ERRNO_FILTER(name, errno) \
  799. struct sock_filter _read_filter_##name[] = { \
  800. BPF_STMT(BPF_LD|BPF_W|BPF_ABS, \
  801. offsetof(struct seccomp_data, nr)), \
  802. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), \
  803. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | errno), \
  804. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), \
  805. }; \
  806. struct sock_fprog prog_##name = { \
  807. .len = (unsigned short)ARRAY_SIZE(_read_filter_##name), \
  808. .filter = _read_filter_##name, \
  809. }
  810. /* Make sure basic errno values are correctly passed through a filter. */
  811. TEST(ERRNO_valid)
  812. {
  813. ERRNO_FILTER(valid, E2BIG);
  814. long ret;
  815. pid_t parent = getppid();
  816. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  817. ASSERT_EQ(0, ret);
  818. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_valid);
  819. ASSERT_EQ(0, ret);
  820. EXPECT_EQ(parent, syscall(__NR_getppid));
  821. EXPECT_EQ(-1, read(-1, NULL, 0));
  822. EXPECT_EQ(E2BIG, errno);
  823. }
  824. /* Make sure an errno of zero is correctly handled by the arch code. */
  825. TEST(ERRNO_zero)
  826. {
  827. ERRNO_FILTER(zero, 0);
  828. long ret;
  829. pid_t parent = getppid();
  830. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  831. ASSERT_EQ(0, ret);
  832. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_zero);
  833. ASSERT_EQ(0, ret);
  834. EXPECT_EQ(parent, syscall(__NR_getppid));
  835. /* "errno" of 0 is ok. */
  836. EXPECT_EQ(0, read(-1, NULL, 0));
  837. }
  838. /*
  839. * The SECCOMP_RET_DATA mask is 16 bits wide, but errno is smaller.
  840. * This tests that the errno value gets capped correctly, fixed by
  841. * 580c57f10768 ("seccomp: cap SECCOMP_RET_ERRNO data to MAX_ERRNO").
  842. */
  843. TEST(ERRNO_capped)
  844. {
  845. ERRNO_FILTER(capped, 4096);
  846. long ret;
  847. pid_t parent = getppid();
  848. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  849. ASSERT_EQ(0, ret);
  850. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_capped);
  851. ASSERT_EQ(0, ret);
  852. EXPECT_EQ(parent, syscall(__NR_getppid));
  853. EXPECT_EQ(-1, read(-1, NULL, 0));
  854. EXPECT_EQ(4095, errno);
  855. }
  856. /*
  857. * Filters are processed in reverse order: last applied is executed first.
  858. * Since only the SECCOMP_RET_ACTION mask is tested for return values, the
  859. * SECCOMP_RET_DATA mask results will follow the most recently applied
  860. * matching filter return (and not the lowest or highest value).
  861. */
  862. TEST(ERRNO_order)
  863. {
  864. ERRNO_FILTER(first, 11);
  865. ERRNO_FILTER(second, 13);
  866. ERRNO_FILTER(third, 12);
  867. long ret;
  868. pid_t parent = getppid();
  869. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  870. ASSERT_EQ(0, ret);
  871. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_first);
  872. ASSERT_EQ(0, ret);
  873. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_second);
  874. ASSERT_EQ(0, ret);
  875. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_third);
  876. ASSERT_EQ(0, ret);
  877. EXPECT_EQ(parent, syscall(__NR_getppid));
  878. EXPECT_EQ(-1, read(-1, NULL, 0));
  879. EXPECT_EQ(12, errno);
  880. }
  881. FIXTURE(TRAP) {
  882. struct sock_fprog prog;
  883. };
  884. FIXTURE_SETUP(TRAP)
  885. {
  886. struct sock_filter filter[] = {
  887. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  888. offsetof(struct seccomp_data, nr)),
  889. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  890. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
  891. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  892. };
  893. memset(&self->prog, 0, sizeof(self->prog));
  894. self->prog.filter = malloc(sizeof(filter));
  895. ASSERT_NE(NULL, self->prog.filter);
  896. memcpy(self->prog.filter, filter, sizeof(filter));
  897. self->prog.len = (unsigned short)ARRAY_SIZE(filter);
  898. }
  899. FIXTURE_TEARDOWN(TRAP)
  900. {
  901. if (self->prog.filter)
  902. free(self->prog.filter);
  903. }
  904. TEST_F_SIGNAL(TRAP, dfl, SIGSYS)
  905. {
  906. long ret;
  907. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  908. ASSERT_EQ(0, ret);
  909. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
  910. ASSERT_EQ(0, ret);
  911. syscall(__NR_getpid);
  912. }
  913. /* Ensure that SIGSYS overrides SIG_IGN */
  914. TEST_F_SIGNAL(TRAP, ign, SIGSYS)
  915. {
  916. long ret;
  917. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  918. ASSERT_EQ(0, ret);
  919. signal(SIGSYS, SIG_IGN);
  920. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
  921. ASSERT_EQ(0, ret);
  922. syscall(__NR_getpid);
  923. }
  924. static siginfo_t TRAP_info;
  925. static volatile int TRAP_nr;
  926. static void TRAP_action(int nr, siginfo_t *info, void *void_context)
  927. {
  928. memcpy(&TRAP_info, info, sizeof(TRAP_info));
  929. TRAP_nr = nr;
  930. }
  931. TEST_F(TRAP, handler)
  932. {
  933. int ret, test;
  934. struct sigaction act;
  935. sigset_t mask;
  936. memset(&act, 0, sizeof(act));
  937. sigemptyset(&mask);
  938. sigaddset(&mask, SIGSYS);
  939. act.sa_sigaction = &TRAP_action;
  940. act.sa_flags = SA_SIGINFO;
  941. ret = sigaction(SIGSYS, &act, NULL);
  942. ASSERT_EQ(0, ret) {
  943. TH_LOG("sigaction failed");
  944. }
  945. ret = sigprocmask(SIG_UNBLOCK, &mask, NULL);
  946. ASSERT_EQ(0, ret) {
  947. TH_LOG("sigprocmask failed");
  948. }
  949. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  950. ASSERT_EQ(0, ret);
  951. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog);
  952. ASSERT_EQ(0, ret);
  953. TRAP_nr = 0;
  954. memset(&TRAP_info, 0, sizeof(TRAP_info));
  955. /* Expect the registers to be rolled back. (nr = error) may vary
  956. * based on arch. */
  957. ret = syscall(__NR_getpid);
  958. /* Silence gcc warning about volatile. */
  959. test = TRAP_nr;
  960. EXPECT_EQ(SIGSYS, test);
  961. struct local_sigsys {
  962. void *_call_addr; /* calling user insn */
  963. int _syscall; /* triggering system call number */
  964. unsigned int _arch; /* AUDIT_ARCH_* of syscall */
  965. } *sigsys = (struct local_sigsys *)
  966. #ifdef si_syscall
  967. &(TRAP_info.si_call_addr);
  968. #else
  969. &TRAP_info.si_pid;
  970. #endif
  971. EXPECT_EQ(__NR_getpid, sigsys->_syscall);
  972. /* Make sure arch is non-zero. */
  973. EXPECT_NE(0, sigsys->_arch);
  974. EXPECT_NE(0, (unsigned long)sigsys->_call_addr);
  975. }
  976. FIXTURE(precedence) {
  977. struct sock_fprog allow;
  978. struct sock_fprog log;
  979. struct sock_fprog trace;
  980. struct sock_fprog error;
  981. struct sock_fprog trap;
  982. struct sock_fprog kill;
  983. };
  984. FIXTURE_SETUP(precedence)
  985. {
  986. struct sock_filter allow_insns[] = {
  987. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  988. };
  989. struct sock_filter log_insns[] = {
  990. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  991. offsetof(struct seccomp_data, nr)),
  992. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  993. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  994. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_LOG),
  995. };
  996. struct sock_filter trace_insns[] = {
  997. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  998. offsetof(struct seccomp_data, nr)),
  999. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  1000. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1001. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE),
  1002. };
  1003. struct sock_filter error_insns[] = {
  1004. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1005. offsetof(struct seccomp_data, nr)),
  1006. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  1007. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1008. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO),
  1009. };
  1010. struct sock_filter trap_insns[] = {
  1011. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1012. offsetof(struct seccomp_data, nr)),
  1013. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  1014. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1015. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRAP),
  1016. };
  1017. struct sock_filter kill_insns[] = {
  1018. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1019. offsetof(struct seccomp_data, nr)),
  1020. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
  1021. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1022. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  1023. };
  1024. memset(self, 0, sizeof(*self));
  1025. #define FILTER_ALLOC(_x) \
  1026. self->_x.filter = malloc(sizeof(_x##_insns)); \
  1027. ASSERT_NE(NULL, self->_x.filter); \
  1028. memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \
  1029. self->_x.len = (unsigned short)ARRAY_SIZE(_x##_insns)
  1030. FILTER_ALLOC(allow);
  1031. FILTER_ALLOC(log);
  1032. FILTER_ALLOC(trace);
  1033. FILTER_ALLOC(error);
  1034. FILTER_ALLOC(trap);
  1035. FILTER_ALLOC(kill);
  1036. }
  1037. FIXTURE_TEARDOWN(precedence)
  1038. {
  1039. #define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter)
  1040. FILTER_FREE(allow);
  1041. FILTER_FREE(log);
  1042. FILTER_FREE(trace);
  1043. FILTER_FREE(error);
  1044. FILTER_FREE(trap);
  1045. FILTER_FREE(kill);
  1046. }
  1047. TEST_F(precedence, allow_ok)
  1048. {
  1049. pid_t parent, res = 0;
  1050. long ret;
  1051. parent = getppid();
  1052. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1053. ASSERT_EQ(0, ret);
  1054. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1055. ASSERT_EQ(0, ret);
  1056. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1057. ASSERT_EQ(0, ret);
  1058. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1059. ASSERT_EQ(0, ret);
  1060. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1061. ASSERT_EQ(0, ret);
  1062. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  1063. ASSERT_EQ(0, ret);
  1064. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
  1065. ASSERT_EQ(0, ret);
  1066. /* Should work just fine. */
  1067. res = syscall(__NR_getppid);
  1068. EXPECT_EQ(parent, res);
  1069. }
  1070. TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS)
  1071. {
  1072. pid_t parent, res = 0;
  1073. long ret;
  1074. parent = getppid();
  1075. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1076. ASSERT_EQ(0, ret);
  1077. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1078. ASSERT_EQ(0, ret);
  1079. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1080. ASSERT_EQ(0, ret);
  1081. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1082. ASSERT_EQ(0, ret);
  1083. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1084. ASSERT_EQ(0, ret);
  1085. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  1086. ASSERT_EQ(0, ret);
  1087. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
  1088. ASSERT_EQ(0, ret);
  1089. /* Should work just fine. */
  1090. res = syscall(__NR_getppid);
  1091. EXPECT_EQ(parent, res);
  1092. /* getpid() should never return. */
  1093. res = syscall(__NR_getpid);
  1094. EXPECT_EQ(0, res);
  1095. }
  1096. TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS)
  1097. {
  1098. pid_t parent;
  1099. long ret;
  1100. parent = getppid();
  1101. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1102. ASSERT_EQ(0, ret);
  1103. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1104. ASSERT_EQ(0, ret);
  1105. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->kill);
  1106. ASSERT_EQ(0, ret);
  1107. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1108. ASSERT_EQ(0, ret);
  1109. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1110. ASSERT_EQ(0, ret);
  1111. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1112. ASSERT_EQ(0, ret);
  1113. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  1114. ASSERT_EQ(0, ret);
  1115. /* Should work just fine. */
  1116. EXPECT_EQ(parent, syscall(__NR_getppid));
  1117. /* getpid() should never return. */
  1118. EXPECT_EQ(0, syscall(__NR_getpid));
  1119. }
  1120. TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS)
  1121. {
  1122. pid_t parent;
  1123. long ret;
  1124. parent = getppid();
  1125. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1126. ASSERT_EQ(0, ret);
  1127. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1128. ASSERT_EQ(0, ret);
  1129. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1130. ASSERT_EQ(0, ret);
  1131. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1132. ASSERT_EQ(0, ret);
  1133. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1134. ASSERT_EQ(0, ret);
  1135. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  1136. ASSERT_EQ(0, ret);
  1137. /* Should work just fine. */
  1138. EXPECT_EQ(parent, syscall(__NR_getppid));
  1139. /* getpid() should never return. */
  1140. EXPECT_EQ(0, syscall(__NR_getpid));
  1141. }
  1142. TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS)
  1143. {
  1144. pid_t parent;
  1145. long ret;
  1146. parent = getppid();
  1147. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1148. ASSERT_EQ(0, ret);
  1149. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1150. ASSERT_EQ(0, ret);
  1151. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);
  1152. ASSERT_EQ(0, ret);
  1153. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1154. ASSERT_EQ(0, ret);
  1155. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1156. ASSERT_EQ(0, ret);
  1157. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1158. ASSERT_EQ(0, ret);
  1159. /* Should work just fine. */
  1160. EXPECT_EQ(parent, syscall(__NR_getppid));
  1161. /* getpid() should never return. */
  1162. EXPECT_EQ(0, syscall(__NR_getpid));
  1163. }
  1164. TEST_F(precedence, errno_is_third)
  1165. {
  1166. pid_t parent;
  1167. long ret;
  1168. parent = getppid();
  1169. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1170. ASSERT_EQ(0, ret);
  1171. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1172. ASSERT_EQ(0, ret);
  1173. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1174. ASSERT_EQ(0, ret);
  1175. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1176. ASSERT_EQ(0, ret);
  1177. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1178. ASSERT_EQ(0, ret);
  1179. /* Should work just fine. */
  1180. EXPECT_EQ(parent, syscall(__NR_getppid));
  1181. EXPECT_EQ(0, syscall(__NR_getpid));
  1182. }
  1183. TEST_F(precedence, errno_is_third_in_any_order)
  1184. {
  1185. pid_t parent;
  1186. long ret;
  1187. parent = getppid();
  1188. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1189. ASSERT_EQ(0, ret);
  1190. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1191. ASSERT_EQ(0, ret);
  1192. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);
  1193. ASSERT_EQ(0, ret);
  1194. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1195. ASSERT_EQ(0, ret);
  1196. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1197. ASSERT_EQ(0, ret);
  1198. /* Should work just fine. */
  1199. EXPECT_EQ(parent, syscall(__NR_getppid));
  1200. EXPECT_EQ(0, syscall(__NR_getpid));
  1201. }
  1202. TEST_F(precedence, trace_is_fourth)
  1203. {
  1204. pid_t parent;
  1205. long ret;
  1206. parent = getppid();
  1207. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1208. ASSERT_EQ(0, ret);
  1209. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1210. ASSERT_EQ(0, ret);
  1211. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1212. ASSERT_EQ(0, ret);
  1213. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1214. ASSERT_EQ(0, ret);
  1215. /* Should work just fine. */
  1216. EXPECT_EQ(parent, syscall(__NR_getppid));
  1217. /* No ptracer */
  1218. EXPECT_EQ(-1, syscall(__NR_getpid));
  1219. }
  1220. TEST_F(precedence, trace_is_fourth_in_any_order)
  1221. {
  1222. pid_t parent;
  1223. long ret;
  1224. parent = getppid();
  1225. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1226. ASSERT_EQ(0, ret);
  1227. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);
  1228. ASSERT_EQ(0, ret);
  1229. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1230. ASSERT_EQ(0, ret);
  1231. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1232. ASSERT_EQ(0, ret);
  1233. /* Should work just fine. */
  1234. EXPECT_EQ(parent, syscall(__NR_getppid));
  1235. /* No ptracer */
  1236. EXPECT_EQ(-1, syscall(__NR_getpid));
  1237. }
  1238. TEST_F(precedence, log_is_fifth)
  1239. {
  1240. pid_t mypid, parent;
  1241. long ret;
  1242. mypid = getpid();
  1243. parent = getppid();
  1244. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1245. ASSERT_EQ(0, ret);
  1246. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1247. ASSERT_EQ(0, ret);
  1248. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1249. ASSERT_EQ(0, ret);
  1250. /* Should work just fine. */
  1251. EXPECT_EQ(parent, syscall(__NR_getppid));
  1252. /* Should also work just fine */
  1253. EXPECT_EQ(mypid, syscall(__NR_getpid));
  1254. }
  1255. TEST_F(precedence, log_is_fifth_in_any_order)
  1256. {
  1257. pid_t mypid, parent;
  1258. long ret;
  1259. mypid = getpid();
  1260. parent = getppid();
  1261. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1262. ASSERT_EQ(0, ret);
  1263. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log);
  1264. ASSERT_EQ(0, ret);
  1265. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);
  1266. ASSERT_EQ(0, ret);
  1267. /* Should work just fine. */
  1268. EXPECT_EQ(parent, syscall(__NR_getppid));
  1269. /* Should also work just fine */
  1270. EXPECT_EQ(mypid, syscall(__NR_getpid));
  1271. }
  1272. #ifndef PTRACE_O_TRACESECCOMP
  1273. #define PTRACE_O_TRACESECCOMP 0x00000080
  1274. #endif
  1275. /* Catch the Ubuntu 12.04 value error. */
  1276. #if PTRACE_EVENT_SECCOMP != 7
  1277. #undef PTRACE_EVENT_SECCOMP
  1278. #endif
  1279. #ifndef PTRACE_EVENT_SECCOMP
  1280. #define PTRACE_EVENT_SECCOMP 7
  1281. #endif
  1282. #define PTRACE_EVENT_MASK(status) ((status) >> 16)
  1283. bool tracer_running;
  1284. void tracer_stop(int sig)
  1285. {
  1286. tracer_running = false;
  1287. }
  1288. typedef void tracer_func_t(struct __test_metadata *_metadata,
  1289. pid_t tracee, int status, void *args);
  1290. void start_tracer(struct __test_metadata *_metadata, int fd, pid_t tracee,
  1291. tracer_func_t tracer_func, void *args, bool ptrace_syscall)
  1292. {
  1293. int ret = -1;
  1294. struct sigaction action = {
  1295. .sa_handler = tracer_stop,
  1296. };
  1297. /* Allow external shutdown. */
  1298. tracer_running = true;
  1299. ASSERT_EQ(0, sigaction(SIGUSR1, &action, NULL));
  1300. errno = 0;
  1301. while (ret == -1 && errno != EINVAL)
  1302. ret = ptrace(PTRACE_ATTACH, tracee, NULL, 0);
  1303. ASSERT_EQ(0, ret) {
  1304. kill(tracee, SIGKILL);
  1305. }
  1306. /* Wait for attach stop */
  1307. wait(NULL);
  1308. ret = ptrace(PTRACE_SETOPTIONS, tracee, NULL, ptrace_syscall ?
  1309. PTRACE_O_TRACESYSGOOD :
  1310. PTRACE_O_TRACESECCOMP);
  1311. ASSERT_EQ(0, ret) {
  1312. TH_LOG("Failed to set PTRACE_O_TRACESECCOMP");
  1313. kill(tracee, SIGKILL);
  1314. }
  1315. ret = ptrace(ptrace_syscall ? PTRACE_SYSCALL : PTRACE_CONT,
  1316. tracee, NULL, 0);
  1317. ASSERT_EQ(0, ret);
  1318. /* Unblock the tracee */
  1319. ASSERT_EQ(1, write(fd, "A", 1));
  1320. ASSERT_EQ(0, close(fd));
  1321. /* Run until we're shut down. Must assert to stop execution. */
  1322. while (tracer_running) {
  1323. int status;
  1324. if (wait(&status) != tracee)
  1325. continue;
  1326. if (WIFSIGNALED(status)) {
  1327. /* Child caught a fatal signal. */
  1328. return;
  1329. }
  1330. if (WIFEXITED(status)) {
  1331. /* Child exited with code. */
  1332. return;
  1333. }
  1334. /* Check if we got an expected event. */
  1335. ASSERT_EQ(WIFCONTINUED(status), false);
  1336. ASSERT_EQ(WIFSTOPPED(status), true);
  1337. ASSERT_EQ(WSTOPSIG(status) & SIGTRAP, SIGTRAP) {
  1338. TH_LOG("Unexpected WSTOPSIG: %d", WSTOPSIG(status));
  1339. }
  1340. tracer_func(_metadata, tracee, status, args);
  1341. ret = ptrace(ptrace_syscall ? PTRACE_SYSCALL : PTRACE_CONT,
  1342. tracee, NULL, 0);
  1343. ASSERT_EQ(0, ret);
  1344. }
  1345. /* Directly report the status of our test harness results. */
  1346. syscall(__NR_exit, _metadata->exit_code);
  1347. }
  1348. /* Common tracer setup/teardown functions. */
  1349. void cont_handler(int num)
  1350. { }
  1351. pid_t setup_trace_fixture(struct __test_metadata *_metadata,
  1352. tracer_func_t func, void *args, bool ptrace_syscall)
  1353. {
  1354. char sync;
  1355. int pipefd[2];
  1356. pid_t tracer_pid;
  1357. pid_t tracee = getpid();
  1358. /* Setup a pipe for clean synchronization. */
  1359. ASSERT_EQ(0, pipe(pipefd));
  1360. /* Fork a child which we'll promote to tracer */
  1361. tracer_pid = fork();
  1362. ASSERT_LE(0, tracer_pid);
  1363. signal(SIGALRM, cont_handler);
  1364. if (tracer_pid == 0) {
  1365. close(pipefd[0]);
  1366. start_tracer(_metadata, pipefd[1], tracee, func, args,
  1367. ptrace_syscall);
  1368. syscall(__NR_exit, 0);
  1369. }
  1370. close(pipefd[1]);
  1371. prctl(PR_SET_PTRACER, tracer_pid, 0, 0, 0);
  1372. read(pipefd[0], &sync, 1);
  1373. close(pipefd[0]);
  1374. return tracer_pid;
  1375. }
  1376. void teardown_trace_fixture(struct __test_metadata *_metadata,
  1377. pid_t tracer)
  1378. {
  1379. if (tracer) {
  1380. int status;
  1381. ASSERT_EQ(0, kill(tracer, SIGUSR1));
  1382. ASSERT_EQ(tracer, waitpid(tracer, &status, 0));
  1383. }
  1384. }
  1385. /* "poke" tracer arguments and function. */
  1386. struct tracer_args_poke_t {
  1387. unsigned long poke_addr;
  1388. };
  1389. void tracer_poke(struct __test_metadata *_metadata, pid_t tracee, int status,
  1390. void *args)
  1391. {
  1392. int ret;
  1393. unsigned long msg;
  1394. struct tracer_args_poke_t *info = (struct tracer_args_poke_t *)args;
  1395. ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
  1396. EXPECT_EQ(0, ret);
  1397. /* If this fails, don't try to recover. */
  1398. ASSERT_EQ(0x1001, msg) {
  1399. kill(tracee, SIGKILL);
  1400. }
  1401. /*
  1402. * Poke in the message.
  1403. * Registers are not touched to try to keep this relatively arch
  1404. * agnostic.
  1405. */
  1406. ret = ptrace(PTRACE_POKEDATA, tracee, info->poke_addr, 0x1001);
  1407. EXPECT_EQ(0, ret);
  1408. }
  1409. FIXTURE(TRACE_poke) {
  1410. struct sock_fprog prog;
  1411. pid_t tracer;
  1412. long poked;
  1413. struct tracer_args_poke_t tracer_args;
  1414. };
  1415. FIXTURE_SETUP(TRACE_poke)
  1416. {
  1417. struct sock_filter filter[] = {
  1418. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1419. offsetof(struct seccomp_data, nr)),
  1420. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  1421. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1001),
  1422. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1423. };
  1424. self->poked = 0;
  1425. memset(&self->prog, 0, sizeof(self->prog));
  1426. self->prog.filter = malloc(sizeof(filter));
  1427. ASSERT_NE(NULL, self->prog.filter);
  1428. memcpy(self->prog.filter, filter, sizeof(filter));
  1429. self->prog.len = (unsigned short)ARRAY_SIZE(filter);
  1430. /* Set up tracer args. */
  1431. self->tracer_args.poke_addr = (unsigned long)&self->poked;
  1432. /* Launch tracer. */
  1433. self->tracer = setup_trace_fixture(_metadata, tracer_poke,
  1434. &self->tracer_args, false);
  1435. }
  1436. FIXTURE_TEARDOWN(TRACE_poke)
  1437. {
  1438. teardown_trace_fixture(_metadata, self->tracer);
  1439. if (self->prog.filter)
  1440. free(self->prog.filter);
  1441. }
  1442. TEST_F(TRACE_poke, read_has_side_effects)
  1443. {
  1444. ssize_t ret;
  1445. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1446. ASSERT_EQ(0, ret);
  1447. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1448. ASSERT_EQ(0, ret);
  1449. EXPECT_EQ(0, self->poked);
  1450. ret = read(-1, NULL, 0);
  1451. EXPECT_EQ(-1, ret);
  1452. EXPECT_EQ(0x1001, self->poked);
  1453. }
  1454. TEST_F(TRACE_poke, getpid_runs_normally)
  1455. {
  1456. long ret;
  1457. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1458. ASSERT_EQ(0, ret);
  1459. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
  1460. ASSERT_EQ(0, ret);
  1461. EXPECT_EQ(0, self->poked);
  1462. EXPECT_NE(0, syscall(__NR_getpid));
  1463. EXPECT_EQ(0, self->poked);
  1464. }
  1465. #if defined(__x86_64__)
  1466. # define ARCH_REGS struct user_regs_struct
  1467. # define SYSCALL_NUM(_regs) (_regs).orig_rax
  1468. # define SYSCALL_RET(_regs) (_regs).rax
  1469. #elif defined(__i386__)
  1470. # define ARCH_REGS struct user_regs_struct
  1471. # define SYSCALL_NUM(_regs) (_regs).orig_eax
  1472. # define SYSCALL_RET(_regs) (_regs).eax
  1473. #elif defined(__arm__)
  1474. # define ARCH_REGS struct pt_regs
  1475. # define SYSCALL_NUM(_regs) (_regs).ARM_r7
  1476. # ifndef PTRACE_SET_SYSCALL
  1477. # define PTRACE_SET_SYSCALL 23
  1478. # endif
  1479. # define SYSCALL_NUM_SET(_regs, _nr) \
  1480. EXPECT_EQ(0, ptrace(PTRACE_SET_SYSCALL, tracee, NULL, _nr))
  1481. # define SYSCALL_RET(_regs) (_regs).ARM_r0
  1482. #elif defined(__aarch64__)
  1483. # define ARCH_REGS struct user_pt_regs
  1484. # define SYSCALL_NUM(_regs) (_regs).regs[8]
  1485. # ifndef NT_ARM_SYSTEM_CALL
  1486. # define NT_ARM_SYSTEM_CALL 0x404
  1487. # endif
  1488. # define SYSCALL_NUM_SET(_regs, _nr) \
  1489. do { \
  1490. struct iovec __v; \
  1491. typeof(_nr) __nr = (_nr); \
  1492. __v.iov_base = &__nr; \
  1493. __v.iov_len = sizeof(__nr); \
  1494. EXPECT_EQ(0, ptrace(PTRACE_SETREGSET, tracee, \
  1495. NT_ARM_SYSTEM_CALL, &__v)); \
  1496. } while (0)
  1497. # define SYSCALL_RET(_regs) (_regs).regs[0]
  1498. #elif defined(__loongarch__)
  1499. # define ARCH_REGS struct user_pt_regs
  1500. # define SYSCALL_NUM(_regs) (_regs).regs[11]
  1501. # define SYSCALL_RET(_regs) (_regs).regs[4]
  1502. #elif defined(__riscv) && __riscv_xlen == 64
  1503. # define ARCH_REGS struct user_regs_struct
  1504. # define SYSCALL_NUM(_regs) (_regs).a7
  1505. # define SYSCALL_RET(_regs) (_regs).a0
  1506. #elif defined(__csky__)
  1507. # define ARCH_REGS struct pt_regs
  1508. # if defined(__CSKYABIV2__)
  1509. # define SYSCALL_NUM(_regs) (_regs).regs[3]
  1510. # else
  1511. # define SYSCALL_NUM(_regs) (_regs).regs[9]
  1512. # endif
  1513. # define SYSCALL_RET(_regs) (_regs).a0
  1514. #elif defined(__hppa__)
  1515. # define ARCH_REGS struct user_regs_struct
  1516. # define SYSCALL_NUM(_regs) (_regs).gr[20]
  1517. # define SYSCALL_RET(_regs) (_regs).gr[28]
  1518. #elif defined(__powerpc__)
  1519. # define ARCH_REGS struct pt_regs
  1520. # define SYSCALL_NUM(_regs) (_regs).gpr[0]
  1521. # define SYSCALL_RET(_regs) (_regs).gpr[3]
  1522. # define SYSCALL_RET_SET(_regs, _val) \
  1523. do { \
  1524. typeof(_val) _result = (_val); \
  1525. if ((_regs.trap & 0xfff0) == 0x3000) { \
  1526. /* \
  1527. * scv 0 system call uses -ve result \
  1528. * for error, so no need to adjust. \
  1529. */ \
  1530. SYSCALL_RET(_regs) = _result; \
  1531. } else { \
  1532. /* \
  1533. * A syscall error is signaled by the \
  1534. * CR0 SO bit and the code is stored as \
  1535. * a positive value. \
  1536. */ \
  1537. if (_result < 0) { \
  1538. SYSCALL_RET(_regs) = -_result; \
  1539. (_regs).ccr |= 0x10000000; \
  1540. } else { \
  1541. SYSCALL_RET(_regs) = _result; \
  1542. (_regs).ccr &= ~0x10000000; \
  1543. } \
  1544. } \
  1545. } while (0)
  1546. # define SYSCALL_RET_SET_ON_PTRACE_EXIT
  1547. #elif defined(__s390__)
  1548. # define ARCH_REGS s390_regs
  1549. # define SYSCALL_NUM(_regs) (_regs).gprs[2]
  1550. # define SYSCALL_RET_SET(_regs, _val) \
  1551. TH_LOG("Can't modify syscall return on this architecture")
  1552. #elif defined(__mips__)
  1553. # include <asm/unistd_nr_n32.h>
  1554. # include <asm/unistd_nr_n64.h>
  1555. # include <asm/unistd_nr_o32.h>
  1556. # define ARCH_REGS struct pt_regs
  1557. # define SYSCALL_NUM(_regs) \
  1558. ({ \
  1559. typeof((_regs).regs[2]) _nr; \
  1560. if ((_regs).regs[2] == __NR_O32_Linux) \
  1561. _nr = (_regs).regs[4]; \
  1562. else \
  1563. _nr = (_regs).regs[2]; \
  1564. _nr; \
  1565. })
  1566. # define SYSCALL_NUM_SET(_regs, _nr) \
  1567. do { \
  1568. if ((_regs).regs[2] == __NR_O32_Linux) \
  1569. (_regs).regs[4] = _nr; \
  1570. else \
  1571. (_regs).regs[2] = _nr; \
  1572. } while (0)
  1573. # define SYSCALL_RET_SET(_regs, _val) \
  1574. TH_LOG("Can't modify syscall return on this architecture")
  1575. #elif defined(__xtensa__)
  1576. # define ARCH_REGS struct user_pt_regs
  1577. # define SYSCALL_NUM(_regs) (_regs).syscall
  1578. /*
  1579. * On xtensa syscall return value is in the register
  1580. * a2 of the current window which is not fixed.
  1581. */
  1582. #define SYSCALL_RET(_regs) (_regs).a[(_regs).windowbase * 4 + 2]
  1583. #elif defined(__sh__)
  1584. # define ARCH_REGS struct pt_regs
  1585. # define SYSCALL_NUM(_regs) (_regs).regs[3]
  1586. # define SYSCALL_RET(_regs) (_regs).regs[0]
  1587. #elif defined(__mc68000__)
  1588. # define ARCH_REGS struct user_regs_struct
  1589. # define SYSCALL_NUM(_regs) (_regs).orig_d0
  1590. # define SYSCALL_RET(_regs) (_regs).d0
  1591. #else
  1592. # error "Do not know how to find your architecture's registers and syscalls"
  1593. #endif
  1594. /*
  1595. * Most architectures can change the syscall by just updating the
  1596. * associated register. This is the default if not defined above.
  1597. */
  1598. #ifndef SYSCALL_NUM_SET
  1599. # define SYSCALL_NUM_SET(_regs, _nr) \
  1600. do { \
  1601. SYSCALL_NUM(_regs) = (_nr); \
  1602. } while (0)
  1603. #endif
  1604. /*
  1605. * Most architectures can change the syscall return value by just
  1606. * writing to the SYSCALL_RET register. This is the default if not
  1607. * defined above. If an architecture cannot set the return value
  1608. * (for example when the syscall and return value register is
  1609. * shared), report it with TH_LOG() in an arch-specific definition
  1610. * of SYSCALL_RET_SET() above, and leave SYSCALL_RET undefined.
  1611. */
  1612. #if !defined(SYSCALL_RET) && !defined(SYSCALL_RET_SET)
  1613. # error "One of SYSCALL_RET or SYSCALL_RET_SET is needed for this arch"
  1614. #endif
  1615. #ifndef SYSCALL_RET_SET
  1616. # define SYSCALL_RET_SET(_regs, _val) \
  1617. do { \
  1618. SYSCALL_RET(_regs) = (_val); \
  1619. } while (0)
  1620. #endif
  1621. /* When the syscall return can't be changed, stub out the tests for it. */
  1622. #ifndef SYSCALL_RET
  1623. # define EXPECT_SYSCALL_RETURN(val, action) EXPECT_EQ(-1, action)
  1624. #else
  1625. # define EXPECT_SYSCALL_RETURN(val, action) \
  1626. do { \
  1627. errno = 0; \
  1628. if (val < 0) { \
  1629. EXPECT_EQ(-1, action); \
  1630. EXPECT_EQ(-(val), errno); \
  1631. } else { \
  1632. EXPECT_EQ(val, action); \
  1633. } \
  1634. } while (0)
  1635. #endif
  1636. /*
  1637. * Some architectures (e.g. powerpc) can only set syscall
  1638. * return values on syscall exit during ptrace.
  1639. */
  1640. const bool ptrace_entry_set_syscall_nr = true;
  1641. const bool ptrace_entry_set_syscall_ret =
  1642. #ifndef SYSCALL_RET_SET_ON_PTRACE_EXIT
  1643. true;
  1644. #else
  1645. false;
  1646. #endif
  1647. /*
  1648. * Use PTRACE_GETREGS and PTRACE_SETREGS when available. This is useful for
  1649. * architectures without HAVE_ARCH_TRACEHOOK (e.g. User-mode Linux).
  1650. */
  1651. #if defined(__x86_64__) || defined(__i386__) || defined(__mips__) || defined(__mc68000__)
  1652. # define ARCH_GETREGS(_regs) ptrace(PTRACE_GETREGS, tracee, 0, &(_regs))
  1653. # define ARCH_SETREGS(_regs) ptrace(PTRACE_SETREGS, tracee, 0, &(_regs))
  1654. #else
  1655. # define ARCH_GETREGS(_regs) ({ \
  1656. struct iovec __v; \
  1657. __v.iov_base = &(_regs); \
  1658. __v.iov_len = sizeof(_regs); \
  1659. ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &__v); \
  1660. })
  1661. # define ARCH_SETREGS(_regs) ({ \
  1662. struct iovec __v; \
  1663. __v.iov_base = &(_regs); \
  1664. __v.iov_len = sizeof(_regs); \
  1665. ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &__v); \
  1666. })
  1667. #endif
  1668. /* Architecture-specific syscall fetching routine. */
  1669. int get_syscall(struct __test_metadata *_metadata, pid_t tracee)
  1670. {
  1671. ARCH_REGS regs;
  1672. EXPECT_EQ(0, ARCH_GETREGS(regs)) {
  1673. return -1;
  1674. }
  1675. return SYSCALL_NUM(regs);
  1676. }
  1677. /* Architecture-specific syscall changing routine. */
  1678. void __change_syscall(struct __test_metadata *_metadata,
  1679. pid_t tracee, long *syscall, long *ret)
  1680. {
  1681. ARCH_REGS orig, regs;
  1682. /* Do not get/set registers if we have nothing to do. */
  1683. if (!syscall && !ret)
  1684. return;
  1685. EXPECT_EQ(0, ARCH_GETREGS(regs)) {
  1686. return;
  1687. }
  1688. orig = regs;
  1689. if (syscall)
  1690. SYSCALL_NUM_SET(regs, *syscall);
  1691. if (ret)
  1692. SYSCALL_RET_SET(regs, *ret);
  1693. /* Flush any register changes made. */
  1694. if (memcmp(&orig, &regs, sizeof(orig)) != 0)
  1695. EXPECT_EQ(0, ARCH_SETREGS(regs));
  1696. }
  1697. /* Change only syscall number. */
  1698. void change_syscall_nr(struct __test_metadata *_metadata,
  1699. pid_t tracee, long syscall)
  1700. {
  1701. __change_syscall(_metadata, tracee, &syscall, NULL);
  1702. }
  1703. /* Change syscall return value (and set syscall number to -1). */
  1704. void change_syscall_ret(struct __test_metadata *_metadata,
  1705. pid_t tracee, long ret)
  1706. {
  1707. long syscall = -1;
  1708. __change_syscall(_metadata, tracee, &syscall, &ret);
  1709. }
  1710. void tracer_seccomp(struct __test_metadata *_metadata, pid_t tracee,
  1711. int status, void *args)
  1712. {
  1713. int ret;
  1714. unsigned long msg;
  1715. EXPECT_EQ(PTRACE_EVENT_MASK(status), PTRACE_EVENT_SECCOMP) {
  1716. TH_LOG("Unexpected ptrace event: %d", PTRACE_EVENT_MASK(status));
  1717. return;
  1718. }
  1719. /* Make sure we got the right message. */
  1720. ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
  1721. EXPECT_EQ(0, ret);
  1722. /* Validate and take action on expected syscalls. */
  1723. switch (msg) {
  1724. case 0x1002:
  1725. /* change getpid to getppid. */
  1726. EXPECT_EQ(__NR_getpid, get_syscall(_metadata, tracee));
  1727. change_syscall_nr(_metadata, tracee, __NR_getppid);
  1728. break;
  1729. case 0x1003:
  1730. /* skip gettid with valid return code. */
  1731. EXPECT_EQ(__NR_gettid, get_syscall(_metadata, tracee));
  1732. change_syscall_ret(_metadata, tracee, 45000);
  1733. break;
  1734. case 0x1004:
  1735. /* skip openat with error. */
  1736. EXPECT_EQ(__NR_openat, get_syscall(_metadata, tracee));
  1737. change_syscall_ret(_metadata, tracee, -ESRCH);
  1738. break;
  1739. case 0x1005:
  1740. /* do nothing (allow getppid) */
  1741. EXPECT_EQ(__NR_getppid, get_syscall(_metadata, tracee));
  1742. break;
  1743. default:
  1744. EXPECT_EQ(0, msg) {
  1745. TH_LOG("Unknown PTRACE_GETEVENTMSG: 0x%lx", msg);
  1746. kill(tracee, SIGKILL);
  1747. }
  1748. }
  1749. }
  1750. FIXTURE(TRACE_syscall) {
  1751. struct sock_fprog prog;
  1752. pid_t tracer, mytid, mypid, parent;
  1753. long syscall_nr;
  1754. };
  1755. void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,
  1756. int status, void *args)
  1757. {
  1758. int ret;
  1759. unsigned long msg;
  1760. static bool entry;
  1761. long syscall_nr_val, syscall_ret_val;
  1762. long *syscall_nr = NULL, *syscall_ret = NULL;
  1763. FIXTURE_DATA(TRACE_syscall) *self = args;
  1764. EXPECT_EQ(WSTOPSIG(status) & 0x80, 0x80) {
  1765. TH_LOG("Unexpected WSTOPSIG: %d", WSTOPSIG(status));
  1766. return;
  1767. }
  1768. /*
  1769. * The traditional way to tell PTRACE_SYSCALL entry/exit
  1770. * is by counting.
  1771. */
  1772. entry = !entry;
  1773. /* Make sure we got an appropriate message. */
  1774. ret = ptrace(PTRACE_GETEVENTMSG, tracee, NULL, &msg);
  1775. EXPECT_EQ(0, ret);
  1776. EXPECT_EQ(entry ? PTRACE_EVENTMSG_SYSCALL_ENTRY
  1777. : PTRACE_EVENTMSG_SYSCALL_EXIT, msg);
  1778. /*
  1779. * Some architectures only support setting return values during
  1780. * syscall exit under ptrace, and on exit the syscall number may
  1781. * no longer be available. Therefore, save the initial sycall
  1782. * number here, so it can be examined during both entry and exit
  1783. * phases.
  1784. */
  1785. if (entry)
  1786. self->syscall_nr = get_syscall(_metadata, tracee);
  1787. /*
  1788. * Depending on the architecture's syscall setting abilities, we
  1789. * pick which things to set during this phase (entry or exit).
  1790. */
  1791. if (entry == ptrace_entry_set_syscall_nr)
  1792. syscall_nr = &syscall_nr_val;
  1793. if (entry == ptrace_entry_set_syscall_ret)
  1794. syscall_ret = &syscall_ret_val;
  1795. /* Now handle the actual rewriting cases. */
  1796. switch (self->syscall_nr) {
  1797. case __NR_getpid:
  1798. syscall_nr_val = __NR_getppid;
  1799. /* Never change syscall return for this case. */
  1800. syscall_ret = NULL;
  1801. break;
  1802. case __NR_gettid:
  1803. syscall_nr_val = -1;
  1804. syscall_ret_val = 45000;
  1805. break;
  1806. case __NR_openat:
  1807. syscall_nr_val = -1;
  1808. syscall_ret_val = -ESRCH;
  1809. break;
  1810. default:
  1811. /* Unhandled, do nothing. */
  1812. return;
  1813. }
  1814. __change_syscall(_metadata, tracee, syscall_nr, syscall_ret);
  1815. }
  1816. FIXTURE_VARIANT(TRACE_syscall) {
  1817. /*
  1818. * All of the SECCOMP_RET_TRACE behaviors can be tested with either
  1819. * SECCOMP_RET_TRACE+PTRACE_CONT or plain ptrace()+PTRACE_SYSCALL.
  1820. * This indicates if we should use SECCOMP_RET_TRACE (false), or
  1821. * ptrace (true).
  1822. */
  1823. bool use_ptrace;
  1824. };
  1825. FIXTURE_VARIANT_ADD(TRACE_syscall, ptrace) {
  1826. .use_ptrace = true,
  1827. };
  1828. FIXTURE_VARIANT_ADD(TRACE_syscall, seccomp) {
  1829. .use_ptrace = false,
  1830. };
  1831. FIXTURE_SETUP(TRACE_syscall)
  1832. {
  1833. struct sock_filter filter[] = {
  1834. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1835. offsetof(struct seccomp_data, nr)),
  1836. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  1837. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1002),
  1838. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_gettid, 0, 1),
  1839. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1003),
  1840. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_openat, 0, 1),
  1841. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1004),
  1842. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1843. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE | 0x1005),
  1844. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1845. };
  1846. struct sock_fprog prog = {
  1847. .len = (unsigned short)ARRAY_SIZE(filter),
  1848. .filter = filter,
  1849. };
  1850. long ret;
  1851. /* Prepare some testable syscall results. */
  1852. self->mytid = syscall(__NR_gettid);
  1853. ASSERT_GT(self->mytid, 0);
  1854. ASSERT_NE(self->mytid, 1) {
  1855. TH_LOG("Running this test as init is not supported. :)");
  1856. }
  1857. self->mypid = getpid();
  1858. ASSERT_GT(self->mypid, 0);
  1859. ASSERT_EQ(self->mytid, self->mypid);
  1860. self->parent = getppid();
  1861. ASSERT_GT(self->parent, 0);
  1862. ASSERT_NE(self->parent, self->mypid);
  1863. /* Launch tracer. */
  1864. self->tracer = setup_trace_fixture(_metadata,
  1865. variant->use_ptrace ? tracer_ptrace
  1866. : tracer_seccomp,
  1867. self, variant->use_ptrace);
  1868. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1869. ASSERT_EQ(0, ret);
  1870. /* Do not install seccomp rewrite filters, as we'll use ptrace instead. */
  1871. if (variant->use_ptrace)
  1872. return;
  1873. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1874. ASSERT_EQ(0, ret);
  1875. }
  1876. FIXTURE_TEARDOWN(TRACE_syscall)
  1877. {
  1878. teardown_trace_fixture(_metadata, self->tracer);
  1879. }
  1880. TEST(negative_ENOSYS)
  1881. {
  1882. #if defined(__arm__)
  1883. SKIP(return, "arm32 does not support calling syscall -1");
  1884. #endif
  1885. /*
  1886. * There should be no difference between an "internal" skip
  1887. * and userspace asking for syscall "-1".
  1888. */
  1889. errno = 0;
  1890. EXPECT_EQ(-1, syscall(-1));
  1891. EXPECT_EQ(errno, ENOSYS);
  1892. /* And no difference for "still not valid but not -1". */
  1893. errno = 0;
  1894. EXPECT_EQ(-1, syscall(-101));
  1895. EXPECT_EQ(errno, ENOSYS);
  1896. }
  1897. TEST_F(TRACE_syscall, negative_ENOSYS)
  1898. {
  1899. negative_ENOSYS(_metadata);
  1900. }
  1901. TEST_F(TRACE_syscall, syscall_allowed)
  1902. {
  1903. /* getppid works as expected (no changes). */
  1904. EXPECT_EQ(self->parent, syscall(__NR_getppid));
  1905. EXPECT_NE(self->mypid, syscall(__NR_getppid));
  1906. }
  1907. TEST_F(TRACE_syscall, syscall_redirected)
  1908. {
  1909. /* getpid has been redirected to getppid as expected. */
  1910. EXPECT_EQ(self->parent, syscall(__NR_getpid));
  1911. EXPECT_NE(self->mypid, syscall(__NR_getpid));
  1912. }
  1913. TEST_F(TRACE_syscall, syscall_errno)
  1914. {
  1915. /* Tracer should skip the open syscall, resulting in ESRCH. */
  1916. EXPECT_SYSCALL_RETURN(-ESRCH, syscall(__NR_openat));
  1917. }
  1918. TEST_F(TRACE_syscall, syscall_faked)
  1919. {
  1920. /* Tracer skips the gettid syscall and store altered return value. */
  1921. EXPECT_SYSCALL_RETURN(45000, syscall(__NR_gettid));
  1922. }
  1923. TEST_F_SIGNAL(TRACE_syscall, kill_immediate, SIGSYS)
  1924. {
  1925. struct sock_filter filter[] = {
  1926. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1927. offsetof(struct seccomp_data, nr)),
  1928. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_mknodat, 0, 1),
  1929. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_THREAD),
  1930. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1931. };
  1932. struct sock_fprog prog = {
  1933. .len = (unsigned short)ARRAY_SIZE(filter),
  1934. .filter = filter,
  1935. };
  1936. long ret;
  1937. /* Install "kill on mknodat" filter. */
  1938. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1939. ASSERT_EQ(0, ret);
  1940. /* This should immediately die with SIGSYS, regardless of tracer. */
  1941. EXPECT_EQ(-1, syscall(__NR_mknodat, -1, NULL, 0, 0));
  1942. }
  1943. TEST_F(TRACE_syscall, skip_after)
  1944. {
  1945. struct sock_filter filter[] = {
  1946. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1947. offsetof(struct seccomp_data, nr)),
  1948. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1949. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EPERM),
  1950. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1951. };
  1952. struct sock_fprog prog = {
  1953. .len = (unsigned short)ARRAY_SIZE(filter),
  1954. .filter = filter,
  1955. };
  1956. long ret;
  1957. /* Install additional "errno on getppid" filter. */
  1958. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1959. ASSERT_EQ(0, ret);
  1960. /* Tracer will redirect getpid to getppid, and we should see EPERM. */
  1961. errno = 0;
  1962. EXPECT_EQ(-1, syscall(__NR_getpid));
  1963. EXPECT_EQ(EPERM, errno);
  1964. }
  1965. TEST_F_SIGNAL(TRACE_syscall, kill_after, SIGSYS)
  1966. {
  1967. struct sock_filter filter[] = {
  1968. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  1969. offsetof(struct seccomp_data, nr)),
  1970. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getppid, 0, 1),
  1971. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  1972. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1973. };
  1974. struct sock_fprog prog = {
  1975. .len = (unsigned short)ARRAY_SIZE(filter),
  1976. .filter = filter,
  1977. };
  1978. long ret;
  1979. /* Install additional "death on getppid" filter. */
  1980. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  1981. ASSERT_EQ(0, ret);
  1982. /* Tracer will redirect getpid to getppid, and we should die. */
  1983. EXPECT_NE(self->mypid, syscall(__NR_getpid));
  1984. }
  1985. TEST(seccomp_syscall)
  1986. {
  1987. struct sock_filter filter[] = {
  1988. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  1989. };
  1990. struct sock_fprog prog = {
  1991. .len = (unsigned short)ARRAY_SIZE(filter),
  1992. .filter = filter,
  1993. };
  1994. long ret;
  1995. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  1996. ASSERT_EQ(0, ret) {
  1997. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  1998. }
  1999. /* Reject insane operation. */
  2000. ret = seccomp(-1, 0, &prog);
  2001. ASSERT_NE(ENOSYS, errno) {
  2002. TH_LOG("Kernel does not support seccomp syscall!");
  2003. }
  2004. EXPECT_EQ(EINVAL, errno) {
  2005. TH_LOG("Did not reject crazy op value!");
  2006. }
  2007. /* Reject strict with flags or pointer. */
  2008. ret = seccomp(SECCOMP_SET_MODE_STRICT, -1, NULL);
  2009. EXPECT_EQ(EINVAL, errno) {
  2010. TH_LOG("Did not reject mode strict with flags!");
  2011. }
  2012. ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, &prog);
  2013. EXPECT_EQ(EINVAL, errno) {
  2014. TH_LOG("Did not reject mode strict with uargs!");
  2015. }
  2016. /* Reject insane args for filter. */
  2017. ret = seccomp(SECCOMP_SET_MODE_FILTER, -1, &prog);
  2018. EXPECT_EQ(EINVAL, errno) {
  2019. TH_LOG("Did not reject crazy filter flags!");
  2020. }
  2021. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, NULL);
  2022. EXPECT_EQ(EFAULT, errno) {
  2023. TH_LOG("Did not reject NULL filter!");
  2024. }
  2025. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
  2026. EXPECT_EQ(0, errno) {
  2027. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER: %s",
  2028. strerror(errno));
  2029. }
  2030. }
  2031. TEST(seccomp_syscall_mode_lock)
  2032. {
  2033. struct sock_filter filter[] = {
  2034. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2035. };
  2036. struct sock_fprog prog = {
  2037. .len = (unsigned short)ARRAY_SIZE(filter),
  2038. .filter = filter,
  2039. };
  2040. long ret;
  2041. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
  2042. ASSERT_EQ(0, ret) {
  2043. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2044. }
  2045. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
  2046. ASSERT_NE(ENOSYS, errno) {
  2047. TH_LOG("Kernel does not support seccomp syscall!");
  2048. }
  2049. EXPECT_EQ(0, ret) {
  2050. TH_LOG("Could not install filter!");
  2051. }
  2052. /* Make sure neither entry point will switch to strict. */
  2053. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT, 0, 0, 0);
  2054. EXPECT_EQ(EINVAL, errno) {
  2055. TH_LOG("Switched to mode strict!");
  2056. }
  2057. ret = seccomp(SECCOMP_SET_MODE_STRICT, 0, NULL);
  2058. EXPECT_EQ(EINVAL, errno) {
  2059. TH_LOG("Switched to mode strict!");
  2060. }
  2061. }
  2062. /*
  2063. * Test detection of known and unknown filter flags. Userspace needs to be able
  2064. * to check if a filter flag is supported by the current kernel and a good way
  2065. * of doing that is by attempting to enter filter mode, with the flag bit in
  2066. * question set, and a NULL pointer for the _args_ parameter. EFAULT indicates
  2067. * that the flag is valid and EINVAL indicates that the flag is invalid.
  2068. */
  2069. TEST(detect_seccomp_filter_flags)
  2070. {
  2071. unsigned int flags[] = { SECCOMP_FILTER_FLAG_TSYNC,
  2072. SECCOMP_FILTER_FLAG_LOG,
  2073. SECCOMP_FILTER_FLAG_SPEC_ALLOW,
  2074. SECCOMP_FILTER_FLAG_NEW_LISTENER,
  2075. SECCOMP_FILTER_FLAG_TSYNC_ESRCH };
  2076. unsigned int exclusive[] = {
  2077. SECCOMP_FILTER_FLAG_TSYNC,
  2078. SECCOMP_FILTER_FLAG_NEW_LISTENER };
  2079. unsigned int flag, all_flags, exclusive_mask;
  2080. int i;
  2081. long ret;
  2082. /* Test detection of individual known-good filter flags */
  2083. for (i = 0, all_flags = 0; i < ARRAY_SIZE(flags); i++) {
  2084. int bits = 0;
  2085. flag = flags[i];
  2086. /* Make sure the flag is a single bit! */
  2087. while (flag) {
  2088. if (flag & 0x1)
  2089. bits ++;
  2090. flag >>= 1;
  2091. }
  2092. ASSERT_EQ(1, bits);
  2093. flag = flags[i];
  2094. ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
  2095. ASSERT_NE(ENOSYS, errno) {
  2096. TH_LOG("Kernel does not support seccomp syscall!");
  2097. }
  2098. EXPECT_EQ(-1, ret);
  2099. EXPECT_EQ(EFAULT, errno) {
  2100. TH_LOG("Failed to detect that a known-good filter flag (0x%X) is supported!",
  2101. flag);
  2102. }
  2103. all_flags |= flag;
  2104. }
  2105. /*
  2106. * Test detection of all known-good filter flags combined. But
  2107. * for the exclusive flags we need to mask them out and try them
  2108. * individually for the "all flags" testing.
  2109. */
  2110. exclusive_mask = 0;
  2111. for (i = 0; i < ARRAY_SIZE(exclusive); i++)
  2112. exclusive_mask |= exclusive[i];
  2113. for (i = 0; i < ARRAY_SIZE(exclusive); i++) {
  2114. flag = all_flags & ~exclusive_mask;
  2115. flag |= exclusive[i];
  2116. ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
  2117. EXPECT_EQ(-1, ret);
  2118. EXPECT_EQ(EFAULT, errno) {
  2119. TH_LOG("Failed to detect that all known-good filter flags (0x%X) are supported!",
  2120. flag);
  2121. }
  2122. }
  2123. /* Test detection of an unknown filter flags, without exclusives. */
  2124. flag = -1;
  2125. flag &= ~exclusive_mask;
  2126. ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
  2127. EXPECT_EQ(-1, ret);
  2128. EXPECT_EQ(EINVAL, errno) {
  2129. TH_LOG("Failed to detect that an unknown filter flag (0x%X) is unsupported!",
  2130. flag);
  2131. }
  2132. /*
  2133. * Test detection of an unknown filter flag that may simply need to be
  2134. * added to this test
  2135. */
  2136. flag = flags[ARRAY_SIZE(flags) - 1] << 1;
  2137. ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL);
  2138. EXPECT_EQ(-1, ret);
  2139. EXPECT_EQ(EINVAL, errno) {
  2140. 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?",
  2141. flag);
  2142. }
  2143. }
  2144. TEST(TSYNC_first)
  2145. {
  2146. struct sock_filter filter[] = {
  2147. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2148. };
  2149. struct sock_fprog prog = {
  2150. .len = (unsigned short)ARRAY_SIZE(filter),
  2151. .filter = filter,
  2152. };
  2153. long ret;
  2154. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, NULL, 0, 0);
  2155. ASSERT_EQ(0, ret) {
  2156. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2157. }
  2158. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2159. &prog);
  2160. ASSERT_NE(ENOSYS, errno) {
  2161. TH_LOG("Kernel does not support seccomp syscall!");
  2162. }
  2163. EXPECT_EQ(0, ret) {
  2164. TH_LOG("Could not install initial filter with TSYNC!");
  2165. }
  2166. }
  2167. #define TSYNC_SIBLINGS 2
  2168. struct tsync_sibling {
  2169. pthread_t tid;
  2170. pid_t system_tid;
  2171. sem_t *started;
  2172. pthread_cond_t *cond;
  2173. pthread_mutex_t *mutex;
  2174. int diverge;
  2175. int num_waits;
  2176. struct sock_fprog *prog;
  2177. struct __test_metadata *metadata;
  2178. };
  2179. /*
  2180. * To avoid joining joined threads (which is not allowed by Bionic),
  2181. * make sure we both successfully join and clear the tid to skip a
  2182. * later join attempt during fixture teardown. Any remaining threads
  2183. * will be directly killed during teardown.
  2184. */
  2185. #define PTHREAD_JOIN(tid, status) \
  2186. do { \
  2187. int _rc = pthread_join(tid, status); \
  2188. if (_rc) { \
  2189. TH_LOG("pthread_join of tid %u failed: %d\n", \
  2190. (unsigned int)tid, _rc); \
  2191. } else { \
  2192. tid = 0; \
  2193. } \
  2194. } while (0)
  2195. FIXTURE(TSYNC) {
  2196. struct sock_fprog root_prog, apply_prog;
  2197. struct tsync_sibling sibling[TSYNC_SIBLINGS];
  2198. sem_t started;
  2199. pthread_cond_t cond;
  2200. pthread_mutex_t mutex;
  2201. int sibling_count;
  2202. };
  2203. FIXTURE_SETUP(TSYNC)
  2204. {
  2205. struct sock_filter root_filter[] = {
  2206. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2207. };
  2208. struct sock_filter apply_filter[] = {
  2209. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  2210. offsetof(struct seccomp_data, nr)),
  2211. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),
  2212. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  2213. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2214. };
  2215. memset(&self->root_prog, 0, sizeof(self->root_prog));
  2216. memset(&self->apply_prog, 0, sizeof(self->apply_prog));
  2217. memset(&self->sibling, 0, sizeof(self->sibling));
  2218. self->root_prog.filter = malloc(sizeof(root_filter));
  2219. ASSERT_NE(NULL, self->root_prog.filter);
  2220. memcpy(self->root_prog.filter, &root_filter, sizeof(root_filter));
  2221. self->root_prog.len = (unsigned short)ARRAY_SIZE(root_filter);
  2222. self->apply_prog.filter = malloc(sizeof(apply_filter));
  2223. ASSERT_NE(NULL, self->apply_prog.filter);
  2224. memcpy(self->apply_prog.filter, &apply_filter, sizeof(apply_filter));
  2225. self->apply_prog.len = (unsigned short)ARRAY_SIZE(apply_filter);
  2226. self->sibling_count = 0;
  2227. pthread_mutex_init(&self->mutex, NULL);
  2228. pthread_cond_init(&self->cond, NULL);
  2229. sem_init(&self->started, 0, 0);
  2230. self->sibling[0].tid = 0;
  2231. self->sibling[0].cond = &self->cond;
  2232. self->sibling[0].started = &self->started;
  2233. self->sibling[0].mutex = &self->mutex;
  2234. self->sibling[0].diverge = 0;
  2235. self->sibling[0].num_waits = 1;
  2236. self->sibling[0].prog = &self->root_prog;
  2237. self->sibling[0].metadata = _metadata;
  2238. self->sibling[1].tid = 0;
  2239. self->sibling[1].cond = &self->cond;
  2240. self->sibling[1].started = &self->started;
  2241. self->sibling[1].mutex = &self->mutex;
  2242. self->sibling[1].diverge = 0;
  2243. self->sibling[1].prog = &self->root_prog;
  2244. self->sibling[1].num_waits = 1;
  2245. self->sibling[1].metadata = _metadata;
  2246. }
  2247. FIXTURE_TEARDOWN(TSYNC)
  2248. {
  2249. int sib = 0;
  2250. if (self->root_prog.filter)
  2251. free(self->root_prog.filter);
  2252. if (self->apply_prog.filter)
  2253. free(self->apply_prog.filter);
  2254. for ( ; sib < self->sibling_count; ++sib) {
  2255. struct tsync_sibling *s = &self->sibling[sib];
  2256. if (!s->tid)
  2257. continue;
  2258. /*
  2259. * If a thread is still running, it may be stuck, so hit
  2260. * it over the head really hard.
  2261. */
  2262. pthread_kill(s->tid, 9);
  2263. }
  2264. pthread_mutex_destroy(&self->mutex);
  2265. pthread_cond_destroy(&self->cond);
  2266. sem_destroy(&self->started);
  2267. }
  2268. void *tsync_sibling(void *data)
  2269. {
  2270. long ret = 0;
  2271. struct tsync_sibling *me = data;
  2272. me->system_tid = syscall(__NR_gettid);
  2273. pthread_mutex_lock(me->mutex);
  2274. if (me->diverge) {
  2275. /* Just re-apply the root prog to fork the tree */
  2276. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER,
  2277. me->prog, 0, 0);
  2278. }
  2279. sem_post(me->started);
  2280. /* Return outside of started so parent notices failures. */
  2281. if (ret) {
  2282. pthread_mutex_unlock(me->mutex);
  2283. return (void *)SIBLING_EXIT_FAILURE;
  2284. }
  2285. do {
  2286. pthread_cond_wait(me->cond, me->mutex);
  2287. me->num_waits = me->num_waits - 1;
  2288. } while (me->num_waits);
  2289. pthread_mutex_unlock(me->mutex);
  2290. ret = prctl(PR_GET_NO_NEW_PRIVS, 0, 0, 0, 0);
  2291. if (!ret)
  2292. return (void *)SIBLING_EXIT_NEWPRIVS;
  2293. read(-1, NULL, 0);
  2294. return (void *)SIBLING_EXIT_UNKILLED;
  2295. }
  2296. void tsync_start_sibling(struct tsync_sibling *sibling)
  2297. {
  2298. pthread_create(&sibling->tid, NULL, tsync_sibling, (void *)sibling);
  2299. }
  2300. TEST_F(TSYNC, siblings_fail_prctl)
  2301. {
  2302. long ret;
  2303. void *status;
  2304. struct sock_filter filter[] = {
  2305. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  2306. offsetof(struct seccomp_data, nr)),
  2307. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1),
  2308. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | EINVAL),
  2309. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2310. };
  2311. struct sock_fprog prog = {
  2312. .len = (unsigned short)ARRAY_SIZE(filter),
  2313. .filter = filter,
  2314. };
  2315. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2316. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2317. }
  2318. /* Check prctl failure detection by requesting sib 0 diverge. */
  2319. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog);
  2320. ASSERT_NE(ENOSYS, errno) {
  2321. TH_LOG("Kernel does not support seccomp syscall!");
  2322. }
  2323. ASSERT_EQ(0, ret) {
  2324. TH_LOG("setting filter failed");
  2325. }
  2326. self->sibling[0].diverge = 1;
  2327. tsync_start_sibling(&self->sibling[0]);
  2328. tsync_start_sibling(&self->sibling[1]);
  2329. while (self->sibling_count < TSYNC_SIBLINGS) {
  2330. sem_wait(&self->started);
  2331. self->sibling_count++;
  2332. }
  2333. /* Signal the threads to clean up*/
  2334. pthread_mutex_lock(&self->mutex);
  2335. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2336. TH_LOG("cond broadcast non-zero");
  2337. }
  2338. pthread_mutex_unlock(&self->mutex);
  2339. /* Ensure diverging sibling failed to call prctl. */
  2340. PTHREAD_JOIN(self->sibling[0].tid, &status);
  2341. EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status);
  2342. PTHREAD_JOIN(self->sibling[1].tid, &status);
  2343. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  2344. }
  2345. TEST_F(TSYNC, two_siblings_with_ancestor)
  2346. {
  2347. long ret;
  2348. void *status;
  2349. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2350. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2351. }
  2352. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  2353. ASSERT_NE(ENOSYS, errno) {
  2354. TH_LOG("Kernel does not support seccomp syscall!");
  2355. }
  2356. ASSERT_EQ(0, ret) {
  2357. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  2358. }
  2359. tsync_start_sibling(&self->sibling[0]);
  2360. tsync_start_sibling(&self->sibling[1]);
  2361. while (self->sibling_count < TSYNC_SIBLINGS) {
  2362. sem_wait(&self->started);
  2363. self->sibling_count++;
  2364. }
  2365. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2366. &self->apply_prog);
  2367. ASSERT_EQ(0, ret) {
  2368. TH_LOG("Could install filter on all threads!");
  2369. }
  2370. /* Tell the siblings to test the policy */
  2371. pthread_mutex_lock(&self->mutex);
  2372. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2373. TH_LOG("cond broadcast non-zero");
  2374. }
  2375. pthread_mutex_unlock(&self->mutex);
  2376. /* Ensure they are both killed and don't exit cleanly. */
  2377. PTHREAD_JOIN(self->sibling[0].tid, &status);
  2378. EXPECT_EQ(0x0, (long)status);
  2379. PTHREAD_JOIN(self->sibling[1].tid, &status);
  2380. EXPECT_EQ(0x0, (long)status);
  2381. }
  2382. TEST_F(TSYNC, two_sibling_want_nnp)
  2383. {
  2384. void *status;
  2385. /* start siblings before any prctl() operations */
  2386. tsync_start_sibling(&self->sibling[0]);
  2387. tsync_start_sibling(&self->sibling[1]);
  2388. while (self->sibling_count < TSYNC_SIBLINGS) {
  2389. sem_wait(&self->started);
  2390. self->sibling_count++;
  2391. }
  2392. /* Tell the siblings to test no policy */
  2393. pthread_mutex_lock(&self->mutex);
  2394. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2395. TH_LOG("cond broadcast non-zero");
  2396. }
  2397. pthread_mutex_unlock(&self->mutex);
  2398. /* Ensure they are both upset about lacking nnp. */
  2399. PTHREAD_JOIN(self->sibling[0].tid, &status);
  2400. EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
  2401. PTHREAD_JOIN(self->sibling[1].tid, &status);
  2402. EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status);
  2403. }
  2404. TEST_F(TSYNC, two_siblings_with_no_filter)
  2405. {
  2406. long ret;
  2407. void *status;
  2408. /* start siblings before any prctl() operations */
  2409. tsync_start_sibling(&self->sibling[0]);
  2410. tsync_start_sibling(&self->sibling[1]);
  2411. while (self->sibling_count < TSYNC_SIBLINGS) {
  2412. sem_wait(&self->started);
  2413. self->sibling_count++;
  2414. }
  2415. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2416. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2417. }
  2418. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2419. &self->apply_prog);
  2420. ASSERT_NE(ENOSYS, errno) {
  2421. TH_LOG("Kernel does not support seccomp syscall!");
  2422. }
  2423. ASSERT_EQ(0, ret) {
  2424. TH_LOG("Could install filter on all threads!");
  2425. }
  2426. /* Tell the siblings to test the policy */
  2427. pthread_mutex_lock(&self->mutex);
  2428. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2429. TH_LOG("cond broadcast non-zero");
  2430. }
  2431. pthread_mutex_unlock(&self->mutex);
  2432. /* Ensure they are both killed and don't exit cleanly. */
  2433. PTHREAD_JOIN(self->sibling[0].tid, &status);
  2434. EXPECT_EQ(0x0, (long)status);
  2435. PTHREAD_JOIN(self->sibling[1].tid, &status);
  2436. EXPECT_EQ(0x0, (long)status);
  2437. }
  2438. TEST_F(TSYNC, two_siblings_with_one_divergence)
  2439. {
  2440. long ret;
  2441. void *status;
  2442. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2443. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2444. }
  2445. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  2446. ASSERT_NE(ENOSYS, errno) {
  2447. TH_LOG("Kernel does not support seccomp syscall!");
  2448. }
  2449. ASSERT_EQ(0, ret) {
  2450. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  2451. }
  2452. self->sibling[0].diverge = 1;
  2453. tsync_start_sibling(&self->sibling[0]);
  2454. tsync_start_sibling(&self->sibling[1]);
  2455. while (self->sibling_count < TSYNC_SIBLINGS) {
  2456. sem_wait(&self->started);
  2457. self->sibling_count++;
  2458. }
  2459. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2460. &self->apply_prog);
  2461. ASSERT_EQ(self->sibling[0].system_tid, ret) {
  2462. TH_LOG("Did not fail on diverged sibling.");
  2463. }
  2464. /* Wake the threads */
  2465. pthread_mutex_lock(&self->mutex);
  2466. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2467. TH_LOG("cond broadcast non-zero");
  2468. }
  2469. pthread_mutex_unlock(&self->mutex);
  2470. /* Ensure they are both unkilled. */
  2471. PTHREAD_JOIN(self->sibling[0].tid, &status);
  2472. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  2473. PTHREAD_JOIN(self->sibling[1].tid, &status);
  2474. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  2475. }
  2476. TEST_F(TSYNC, two_siblings_with_one_divergence_no_tid_in_err)
  2477. {
  2478. long ret, flags;
  2479. void *status;
  2480. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2481. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2482. }
  2483. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  2484. ASSERT_NE(ENOSYS, errno) {
  2485. TH_LOG("Kernel does not support seccomp syscall!");
  2486. }
  2487. ASSERT_EQ(0, ret) {
  2488. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  2489. }
  2490. self->sibling[0].diverge = 1;
  2491. tsync_start_sibling(&self->sibling[0]);
  2492. tsync_start_sibling(&self->sibling[1]);
  2493. while (self->sibling_count < TSYNC_SIBLINGS) {
  2494. sem_wait(&self->started);
  2495. self->sibling_count++;
  2496. }
  2497. flags = SECCOMP_FILTER_FLAG_TSYNC | \
  2498. SECCOMP_FILTER_FLAG_TSYNC_ESRCH;
  2499. ret = seccomp(SECCOMP_SET_MODE_FILTER, flags, &self->apply_prog);
  2500. ASSERT_EQ(ESRCH, errno) {
  2501. TH_LOG("Did not return ESRCH for diverged sibling.");
  2502. }
  2503. ASSERT_EQ(-1, ret) {
  2504. TH_LOG("Did not fail on diverged sibling.");
  2505. }
  2506. /* Wake the threads */
  2507. pthread_mutex_lock(&self->mutex);
  2508. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2509. TH_LOG("cond broadcast non-zero");
  2510. }
  2511. pthread_mutex_unlock(&self->mutex);
  2512. /* Ensure they are both unkilled. */
  2513. PTHREAD_JOIN(self->sibling[0].tid, &status);
  2514. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  2515. PTHREAD_JOIN(self->sibling[1].tid, &status);
  2516. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  2517. }
  2518. TEST_F(TSYNC, two_siblings_not_under_filter)
  2519. {
  2520. long ret, sib;
  2521. void *status;
  2522. struct timespec delay = { .tv_nsec = 100000000 };
  2523. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2524. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2525. }
  2526. /*
  2527. * Sibling 0 will have its own seccomp policy
  2528. * and Sibling 1 will not be under seccomp at
  2529. * all. Sibling 1 will enter seccomp and 0
  2530. * will cause failure.
  2531. */
  2532. self->sibling[0].diverge = 1;
  2533. tsync_start_sibling(&self->sibling[0]);
  2534. tsync_start_sibling(&self->sibling[1]);
  2535. while (self->sibling_count < TSYNC_SIBLINGS) {
  2536. sem_wait(&self->started);
  2537. self->sibling_count++;
  2538. }
  2539. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &self->root_prog);
  2540. ASSERT_NE(ENOSYS, errno) {
  2541. TH_LOG("Kernel does not support seccomp syscall!");
  2542. }
  2543. ASSERT_EQ(0, ret) {
  2544. TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!");
  2545. }
  2546. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2547. &self->apply_prog);
  2548. ASSERT_EQ(ret, self->sibling[0].system_tid) {
  2549. TH_LOG("Did not fail on diverged sibling.");
  2550. }
  2551. sib = 1;
  2552. if (ret == self->sibling[0].system_tid)
  2553. sib = 0;
  2554. pthread_mutex_lock(&self->mutex);
  2555. /* Increment the other siblings num_waits so we can clean up
  2556. * the one we just saw.
  2557. */
  2558. self->sibling[!sib].num_waits += 1;
  2559. /* Signal the thread to clean up*/
  2560. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2561. TH_LOG("cond broadcast non-zero");
  2562. }
  2563. pthread_mutex_unlock(&self->mutex);
  2564. PTHREAD_JOIN(self->sibling[sib].tid, &status);
  2565. EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status);
  2566. /* Poll for actual task death. pthread_join doesn't guarantee it. */
  2567. while (!kill(self->sibling[sib].system_tid, 0))
  2568. nanosleep(&delay, NULL);
  2569. /* Switch to the remaining sibling */
  2570. sib = !sib;
  2571. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2572. &self->apply_prog);
  2573. ASSERT_EQ(0, ret) {
  2574. TH_LOG("Expected the remaining sibling to sync");
  2575. };
  2576. pthread_mutex_lock(&self->mutex);
  2577. /* If remaining sibling didn't have a chance to wake up during
  2578. * the first broadcast, manually reduce the num_waits now.
  2579. */
  2580. if (self->sibling[sib].num_waits > 1)
  2581. self->sibling[sib].num_waits = 1;
  2582. ASSERT_EQ(0, pthread_cond_broadcast(&self->cond)) {
  2583. TH_LOG("cond broadcast non-zero");
  2584. }
  2585. pthread_mutex_unlock(&self->mutex);
  2586. PTHREAD_JOIN(self->sibling[sib].tid, &status);
  2587. EXPECT_EQ(0, (long)status);
  2588. /* Poll for actual task death. pthread_join doesn't guarantee it. */
  2589. while (!kill(self->sibling[sib].system_tid, 0))
  2590. nanosleep(&delay, NULL);
  2591. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC,
  2592. &self->apply_prog);
  2593. ASSERT_EQ(0, ret); /* just us chickens */
  2594. }
  2595. /* Make sure restarted syscalls are seen directly as "restart_syscall". */
  2596. TEST(syscall_restart)
  2597. {
  2598. long ret;
  2599. unsigned long msg;
  2600. pid_t child_pid;
  2601. int pipefd[2];
  2602. int status;
  2603. siginfo_t info = { };
  2604. struct sock_filter filter[] = {
  2605. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  2606. offsetof(struct seccomp_data, nr)),
  2607. #ifdef __NR_sigreturn
  2608. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_sigreturn, 7, 0),
  2609. #endif
  2610. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 6, 0),
  2611. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 5, 0),
  2612. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 4, 0),
  2613. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_nanosleep, 5, 0),
  2614. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_clock_nanosleep, 4, 0),
  2615. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0),
  2616. /* Allow __NR_write for easy logging. */
  2617. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1),
  2618. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2619. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  2620. /* The nanosleep jump target. */
  2621. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100),
  2622. /* The restart_syscall jump target. */
  2623. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200),
  2624. };
  2625. struct sock_fprog prog = {
  2626. .len = (unsigned short)ARRAY_SIZE(filter),
  2627. .filter = filter,
  2628. };
  2629. #if defined(__arm__)
  2630. struct utsname utsbuf;
  2631. #endif
  2632. ASSERT_EQ(0, pipe(pipefd));
  2633. child_pid = fork();
  2634. ASSERT_LE(0, child_pid);
  2635. if (child_pid == 0) {
  2636. /* Child uses EXPECT not ASSERT to deliver status correctly. */
  2637. char buf = ' ';
  2638. struct timespec timeout = { };
  2639. /* Attach parent as tracer and stop. */
  2640. EXPECT_EQ(0, ptrace(PTRACE_TRACEME));
  2641. EXPECT_EQ(0, raise(SIGSTOP));
  2642. EXPECT_EQ(0, close(pipefd[1]));
  2643. EXPECT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
  2644. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2645. }
  2646. ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
  2647. EXPECT_EQ(0, ret) {
  2648. TH_LOG("Failed to install filter!");
  2649. }
  2650. EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
  2651. TH_LOG("Failed to read() sync from parent");
  2652. }
  2653. EXPECT_EQ('.', buf) {
  2654. TH_LOG("Failed to get sync data from read()");
  2655. }
  2656. /* Start nanosleep to be interrupted. */
  2657. timeout.tv_sec = 1;
  2658. errno = 0;
  2659. EXPECT_EQ(0, nanosleep(&timeout, NULL)) {
  2660. TH_LOG("Call to nanosleep() failed (errno %d: %s)",
  2661. errno, strerror(errno));
  2662. }
  2663. /* Read final sync from parent. */
  2664. EXPECT_EQ(1, read(pipefd[0], &buf, 1)) {
  2665. TH_LOG("Failed final read() from parent");
  2666. }
  2667. EXPECT_EQ('!', buf) {
  2668. TH_LOG("Failed to get final data from read()");
  2669. }
  2670. /* Directly report the status of our test harness results. */
  2671. syscall(__NR_exit, _metadata->exit_code);
  2672. }
  2673. EXPECT_EQ(0, close(pipefd[0]));
  2674. /* Attach to child, setup options, and release. */
  2675. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2676. ASSERT_EQ(true, WIFSTOPPED(status));
  2677. ASSERT_EQ(0, ptrace(PTRACE_SETOPTIONS, child_pid, NULL,
  2678. PTRACE_O_TRACESECCOMP));
  2679. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2680. ASSERT_EQ(1, write(pipefd[1], ".", 1));
  2681. /* Wait for nanosleep() to start. */
  2682. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2683. ASSERT_EQ(true, WIFSTOPPED(status));
  2684. ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
  2685. ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
  2686. ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
  2687. ASSERT_EQ(0x100, msg);
  2688. ret = get_syscall(_metadata, child_pid);
  2689. EXPECT_TRUE(ret == __NR_nanosleep || ret == __NR_clock_nanosleep);
  2690. /* Might as well check siginfo for sanity while we're here. */
  2691. ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
  2692. ASSERT_EQ(SIGTRAP, info.si_signo);
  2693. ASSERT_EQ(SIGTRAP | (PTRACE_EVENT_SECCOMP << 8), info.si_code);
  2694. EXPECT_EQ(0, info.si_errno);
  2695. EXPECT_EQ(getuid(), info.si_uid);
  2696. /* Verify signal delivery came from child (seccomp-triggered). */
  2697. EXPECT_EQ(child_pid, info.si_pid);
  2698. /* Interrupt nanosleep with SIGSTOP (which we'll need to handle). */
  2699. ASSERT_EQ(0, kill(child_pid, SIGSTOP));
  2700. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2701. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2702. ASSERT_EQ(true, WIFSTOPPED(status));
  2703. ASSERT_EQ(SIGSTOP, WSTOPSIG(status));
  2704. ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
  2705. /*
  2706. * There is no siginfo on SIGSTOP any more, so we can't verify
  2707. * signal delivery came from parent now (getpid() == info.si_pid).
  2708. * https://lkml.kernel.org/r/CAGXu5jJaZAOzP1qFz66tYrtbuywqb+UN2SOA1VLHpCCOiYvYeg@mail.gmail.com
  2709. * At least verify the SIGSTOP via PTRACE_GETSIGINFO.
  2710. */
  2711. EXPECT_EQ(SIGSTOP, info.si_signo);
  2712. /* Restart nanosleep with SIGCONT, which triggers restart_syscall. */
  2713. ASSERT_EQ(0, kill(child_pid, SIGCONT));
  2714. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2715. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2716. ASSERT_EQ(true, WIFSTOPPED(status));
  2717. ASSERT_EQ(SIGCONT, WSTOPSIG(status));
  2718. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2719. /* Wait for restart_syscall() to start. */
  2720. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2721. ASSERT_EQ(true, WIFSTOPPED(status));
  2722. ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
  2723. ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
  2724. ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
  2725. ASSERT_EQ(0x200, msg);
  2726. ret = get_syscall(_metadata, child_pid);
  2727. #if defined(__arm__)
  2728. /*
  2729. * - native ARM registers do NOT expose true syscall.
  2730. * - compat ARM registers on ARM64 DO expose true syscall.
  2731. * - values of utsbuf.machine include 'armv8l' or 'armb8b'
  2732. * for ARM64 running in compat mode.
  2733. */
  2734. ASSERT_EQ(0, uname(&utsbuf));
  2735. if ((strncmp(utsbuf.machine, "arm", 3) == 0) &&
  2736. (strncmp(utsbuf.machine, "armv8l", 6) != 0) &&
  2737. (strncmp(utsbuf.machine, "armv8b", 6) != 0)) {
  2738. EXPECT_EQ(__NR_nanosleep, ret);
  2739. } else
  2740. #endif
  2741. {
  2742. EXPECT_EQ(__NR_restart_syscall, ret);
  2743. }
  2744. /* Write again to end test. */
  2745. ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
  2746. ASSERT_EQ(1, write(pipefd[1], "!", 1));
  2747. EXPECT_EQ(0, close(pipefd[1]));
  2748. ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
  2749. if (WIFSIGNALED(status) || WEXITSTATUS(status))
  2750. _metadata->exit_code = KSFT_FAIL;
  2751. }
  2752. TEST_SIGNAL(filter_flag_log, SIGSYS)
  2753. {
  2754. struct sock_filter allow_filter[] = {
  2755. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2756. };
  2757. struct sock_filter kill_filter[] = {
  2758. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  2759. offsetof(struct seccomp_data, nr)),
  2760. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1),
  2761. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
  2762. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2763. };
  2764. struct sock_fprog allow_prog = {
  2765. .len = (unsigned short)ARRAY_SIZE(allow_filter),
  2766. .filter = allow_filter,
  2767. };
  2768. struct sock_fprog kill_prog = {
  2769. .len = (unsigned short)ARRAY_SIZE(kill_filter),
  2770. .filter = kill_filter,
  2771. };
  2772. long ret;
  2773. pid_t parent = getppid();
  2774. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  2775. ASSERT_EQ(0, ret);
  2776. /* Verify that the FILTER_FLAG_LOG flag isn't accepted in strict mode */
  2777. ret = seccomp(SECCOMP_SET_MODE_STRICT, SECCOMP_FILTER_FLAG_LOG,
  2778. &allow_prog);
  2779. ASSERT_NE(ENOSYS, errno) {
  2780. TH_LOG("Kernel does not support seccomp syscall!");
  2781. }
  2782. EXPECT_NE(0, ret) {
  2783. TH_LOG("Kernel accepted FILTER_FLAG_LOG flag in strict mode!");
  2784. }
  2785. EXPECT_EQ(EINVAL, errno) {
  2786. TH_LOG("Kernel returned unexpected errno for FILTER_FLAG_LOG flag in strict mode!");
  2787. }
  2788. /* Verify that a simple, permissive filter can be added with no flags */
  2789. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &allow_prog);
  2790. EXPECT_EQ(0, ret);
  2791. /* See if the same filter can be added with the FILTER_FLAG_LOG flag */
  2792. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG,
  2793. &allow_prog);
  2794. ASSERT_NE(EINVAL, errno) {
  2795. TH_LOG("Kernel does not support the FILTER_FLAG_LOG flag!");
  2796. }
  2797. EXPECT_EQ(0, ret);
  2798. /* Ensure that the kill filter works with the FILTER_FLAG_LOG flag */
  2799. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG,
  2800. &kill_prog);
  2801. EXPECT_EQ(0, ret);
  2802. EXPECT_EQ(parent, syscall(__NR_getppid));
  2803. /* getpid() should never return. */
  2804. EXPECT_EQ(0, syscall(__NR_getpid));
  2805. }
  2806. TEST(get_action_avail)
  2807. {
  2808. __u32 actions[] = { SECCOMP_RET_KILL_THREAD, SECCOMP_RET_TRAP,
  2809. SECCOMP_RET_ERRNO, SECCOMP_RET_TRACE,
  2810. SECCOMP_RET_LOG, SECCOMP_RET_ALLOW };
  2811. __u32 unknown_action = 0x10000000U;
  2812. int i;
  2813. long ret;
  2814. ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &actions[0]);
  2815. ASSERT_NE(ENOSYS, errno) {
  2816. TH_LOG("Kernel does not support seccomp syscall!");
  2817. }
  2818. ASSERT_NE(EINVAL, errno) {
  2819. TH_LOG("Kernel does not support SECCOMP_GET_ACTION_AVAIL operation!");
  2820. }
  2821. EXPECT_EQ(ret, 0);
  2822. for (i = 0; i < ARRAY_SIZE(actions); i++) {
  2823. ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &actions[i]);
  2824. EXPECT_EQ(ret, 0) {
  2825. TH_LOG("Expected action (0x%X) not available!",
  2826. actions[i]);
  2827. }
  2828. }
  2829. /* Check that an unknown action is handled properly (EOPNOTSUPP) */
  2830. ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &unknown_action);
  2831. EXPECT_EQ(ret, -1);
  2832. EXPECT_EQ(errno, EOPNOTSUPP);
  2833. }
  2834. TEST(get_metadata)
  2835. {
  2836. pid_t pid;
  2837. int pipefd[2];
  2838. char buf;
  2839. struct seccomp_metadata md;
  2840. long ret;
  2841. /* Only real root can get metadata. */
  2842. if (geteuid()) {
  2843. SKIP(return, "get_metadata requires real root");
  2844. return;
  2845. }
  2846. ASSERT_EQ(0, pipe(pipefd));
  2847. pid = fork();
  2848. ASSERT_GE(pid, 0);
  2849. if (pid == 0) {
  2850. struct sock_filter filter[] = {
  2851. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2852. };
  2853. struct sock_fprog prog = {
  2854. .len = (unsigned short)ARRAY_SIZE(filter),
  2855. .filter = filter,
  2856. };
  2857. /* one with log, one without */
  2858. EXPECT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER,
  2859. SECCOMP_FILTER_FLAG_LOG, &prog));
  2860. EXPECT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog));
  2861. EXPECT_EQ(0, close(pipefd[0]));
  2862. ASSERT_EQ(1, write(pipefd[1], "1", 1));
  2863. ASSERT_EQ(0, close(pipefd[1]));
  2864. while (1)
  2865. sleep(100);
  2866. }
  2867. ASSERT_EQ(0, close(pipefd[1]));
  2868. ASSERT_EQ(1, read(pipefd[0], &buf, 1));
  2869. ASSERT_EQ(0, ptrace(PTRACE_ATTACH, pid));
  2870. ASSERT_EQ(pid, waitpid(pid, NULL, 0));
  2871. /* Past here must not use ASSERT or child process is never killed. */
  2872. md.filter_off = 0;
  2873. errno = 0;
  2874. ret = ptrace(PTRACE_SECCOMP_GET_METADATA, pid, sizeof(md), &md);
  2875. EXPECT_EQ(sizeof(md), ret) {
  2876. if (errno == EINVAL)
  2877. SKIP(goto skip, "Kernel does not support PTRACE_SECCOMP_GET_METADATA (missing CONFIG_CHECKPOINT_RESTORE?)");
  2878. }
  2879. EXPECT_EQ(md.flags, SECCOMP_FILTER_FLAG_LOG);
  2880. EXPECT_EQ(md.filter_off, 0);
  2881. md.filter_off = 1;
  2882. ret = ptrace(PTRACE_SECCOMP_GET_METADATA, pid, sizeof(md), &md);
  2883. EXPECT_EQ(sizeof(md), ret);
  2884. EXPECT_EQ(md.flags, 0);
  2885. EXPECT_EQ(md.filter_off, 1);
  2886. skip:
  2887. ASSERT_EQ(0, kill(pid, SIGKILL));
  2888. }
  2889. static int user_notif_syscall(int nr, unsigned int flags)
  2890. {
  2891. struct sock_filter filter[] = {
  2892. BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
  2893. offsetof(struct seccomp_data, nr)),
  2894. BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, nr, 0, 1),
  2895. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_USER_NOTIF),
  2896. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2897. };
  2898. struct sock_fprog prog = {
  2899. .len = (unsigned short)ARRAY_SIZE(filter),
  2900. .filter = filter,
  2901. };
  2902. return seccomp(SECCOMP_SET_MODE_FILTER, flags, &prog);
  2903. }
  2904. #define USER_NOTIF_MAGIC INT_MAX
  2905. TEST(user_notification_basic)
  2906. {
  2907. pid_t pid;
  2908. long ret;
  2909. int status, listener;
  2910. struct seccomp_notif req = {};
  2911. struct seccomp_notif_resp resp = {};
  2912. struct pollfd pollfd;
  2913. struct sock_filter filter[] = {
  2914. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  2915. };
  2916. struct sock_fprog prog = {
  2917. .len = (unsigned short)ARRAY_SIZE(filter),
  2918. .filter = filter,
  2919. };
  2920. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  2921. ASSERT_EQ(0, ret) {
  2922. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2923. }
  2924. pid = fork();
  2925. ASSERT_GE(pid, 0);
  2926. /* Check that we get -ENOSYS with no listener attached */
  2927. if (pid == 0) {
  2928. if (user_notif_syscall(__NR_getppid, 0) < 0)
  2929. exit(1);
  2930. ret = syscall(__NR_getppid);
  2931. exit(ret >= 0 || errno != ENOSYS);
  2932. }
  2933. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  2934. EXPECT_EQ(true, WIFEXITED(status));
  2935. EXPECT_EQ(0, WEXITSTATUS(status));
  2936. /* Add some no-op filters for grins. */
  2937. EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
  2938. EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
  2939. EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
  2940. EXPECT_EQ(seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog), 0);
  2941. /* Check that the basic notification machinery works */
  2942. listener = user_notif_syscall(__NR_getppid,
  2943. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  2944. ASSERT_GE(listener, 0);
  2945. /* Installing a second listener in the chain should EBUSY */
  2946. EXPECT_EQ(user_notif_syscall(__NR_getppid,
  2947. SECCOMP_FILTER_FLAG_NEW_LISTENER),
  2948. -1);
  2949. EXPECT_EQ(errno, EBUSY);
  2950. pid = fork();
  2951. ASSERT_GE(pid, 0);
  2952. if (pid == 0) {
  2953. ret = syscall(__NR_getppid);
  2954. exit(ret != USER_NOTIF_MAGIC);
  2955. }
  2956. pollfd.fd = listener;
  2957. pollfd.events = POLLIN | POLLOUT;
  2958. EXPECT_GT(poll(&pollfd, 1, -1), 0);
  2959. EXPECT_EQ(pollfd.revents, POLLIN);
  2960. /* Test that we can't pass garbage to the kernel. */
  2961. memset(&req, 0, sizeof(req));
  2962. req.pid = -1;
  2963. errno = 0;
  2964. ret = ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req);
  2965. EXPECT_EQ(-1, ret);
  2966. EXPECT_EQ(EINVAL, errno);
  2967. if (ret) {
  2968. req.pid = 0;
  2969. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  2970. }
  2971. pollfd.fd = listener;
  2972. pollfd.events = POLLIN | POLLOUT;
  2973. EXPECT_GT(poll(&pollfd, 1, -1), 0);
  2974. EXPECT_EQ(pollfd.revents, POLLOUT);
  2975. EXPECT_EQ(req.data.nr, __NR_getppid);
  2976. resp.id = req.id;
  2977. resp.error = 0;
  2978. resp.val = USER_NOTIF_MAGIC;
  2979. /* check that we make sure flags == 0 */
  2980. resp.flags = 1;
  2981. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), -1);
  2982. EXPECT_EQ(errno, EINVAL);
  2983. resp.flags = 0;
  2984. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  2985. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  2986. EXPECT_EQ(true, WIFEXITED(status));
  2987. EXPECT_EQ(0, WEXITSTATUS(status));
  2988. }
  2989. TEST(user_notification_with_tsync)
  2990. {
  2991. int ret;
  2992. unsigned int flags;
  2993. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  2994. ASSERT_EQ(0, ret) {
  2995. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  2996. }
  2997. /* these were exclusive */
  2998. flags = SECCOMP_FILTER_FLAG_NEW_LISTENER |
  2999. SECCOMP_FILTER_FLAG_TSYNC;
  3000. ASSERT_EQ(-1, user_notif_syscall(__NR_getppid, flags));
  3001. ASSERT_EQ(EINVAL, errno);
  3002. /* but now they're not */
  3003. flags |= SECCOMP_FILTER_FLAG_TSYNC_ESRCH;
  3004. ret = user_notif_syscall(__NR_getppid, flags);
  3005. close(ret);
  3006. ASSERT_LE(0, ret);
  3007. }
  3008. TEST(user_notification_kill_in_middle)
  3009. {
  3010. pid_t pid;
  3011. long ret;
  3012. int listener;
  3013. struct seccomp_notif req = {};
  3014. struct seccomp_notif_resp resp = {};
  3015. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3016. ASSERT_EQ(0, ret) {
  3017. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3018. }
  3019. listener = user_notif_syscall(__NR_getppid,
  3020. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3021. ASSERT_GE(listener, 0);
  3022. /*
  3023. * Check that nothing bad happens when we kill the task in the middle
  3024. * of a syscall.
  3025. */
  3026. pid = fork();
  3027. ASSERT_GE(pid, 0);
  3028. if (pid == 0) {
  3029. ret = syscall(__NR_getppid);
  3030. exit(ret != USER_NOTIF_MAGIC);
  3031. }
  3032. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3033. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ID_VALID, &req.id), 0);
  3034. EXPECT_EQ(kill(pid, SIGKILL), 0);
  3035. EXPECT_EQ(waitpid(pid, NULL, 0), pid);
  3036. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ID_VALID, &req.id), -1);
  3037. resp.id = req.id;
  3038. ret = ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp);
  3039. EXPECT_EQ(ret, -1);
  3040. EXPECT_EQ(errno, ENOENT);
  3041. }
  3042. static int handled = -1;
  3043. static void signal_handler(int signal)
  3044. {
  3045. if (write(handled, "c", 1) != 1)
  3046. perror("write from signal");
  3047. }
  3048. TEST(user_notification_signal)
  3049. {
  3050. pid_t pid;
  3051. long ret;
  3052. int status, listener, sk_pair[2];
  3053. struct seccomp_notif req = {};
  3054. struct seccomp_notif_resp resp = {};
  3055. char c;
  3056. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3057. ASSERT_EQ(0, ret) {
  3058. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3059. }
  3060. ASSERT_EQ(socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair), 0);
  3061. listener = user_notif_syscall(__NR_gettid,
  3062. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3063. ASSERT_GE(listener, 0);
  3064. pid = fork();
  3065. ASSERT_GE(pid, 0);
  3066. if (pid == 0) {
  3067. close(sk_pair[0]);
  3068. handled = sk_pair[1];
  3069. if (signal(SIGUSR1, signal_handler) == SIG_ERR) {
  3070. perror("signal");
  3071. exit(1);
  3072. }
  3073. /*
  3074. * ERESTARTSYS behavior is a bit hard to test, because we need
  3075. * to rely on a signal that has not yet been handled. Let's at
  3076. * least check that the error code gets propagated through, and
  3077. * hope that it doesn't break when there is actually a signal :)
  3078. */
  3079. ret = syscall(__NR_gettid);
  3080. exit(!(ret == -1 && errno == 512));
  3081. }
  3082. close(sk_pair[1]);
  3083. memset(&req, 0, sizeof(req));
  3084. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3085. EXPECT_EQ(kill(pid, SIGUSR1), 0);
  3086. /*
  3087. * Make sure the signal really is delivered, which means we're not
  3088. * stuck in the user notification code any more and the notification
  3089. * should be dead.
  3090. */
  3091. EXPECT_EQ(read(sk_pair[0], &c, 1), 1);
  3092. resp.id = req.id;
  3093. resp.error = -EPERM;
  3094. resp.val = 0;
  3095. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), -1);
  3096. EXPECT_EQ(errno, ENOENT);
  3097. memset(&req, 0, sizeof(req));
  3098. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3099. resp.id = req.id;
  3100. resp.error = -512; /* -ERESTARTSYS */
  3101. resp.val = 0;
  3102. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3103. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3104. EXPECT_EQ(true, WIFEXITED(status));
  3105. EXPECT_EQ(0, WEXITSTATUS(status));
  3106. }
  3107. TEST(user_notification_closed_listener)
  3108. {
  3109. pid_t pid;
  3110. long ret;
  3111. int status, listener;
  3112. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3113. ASSERT_EQ(0, ret) {
  3114. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3115. }
  3116. listener = user_notif_syscall(__NR_getppid,
  3117. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3118. ASSERT_GE(listener, 0);
  3119. /*
  3120. * Check that we get an ENOSYS when the listener is closed.
  3121. */
  3122. pid = fork();
  3123. ASSERT_GE(pid, 0);
  3124. if (pid == 0) {
  3125. close(listener);
  3126. ret = syscall(__NR_getppid);
  3127. exit(ret != -1 && errno != ENOSYS);
  3128. }
  3129. close(listener);
  3130. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3131. EXPECT_EQ(true, WIFEXITED(status));
  3132. EXPECT_EQ(0, WEXITSTATUS(status));
  3133. }
  3134. /*
  3135. * Check that a pid in a child namespace still shows up as valid in ours.
  3136. */
  3137. TEST(user_notification_child_pid_ns)
  3138. {
  3139. pid_t pid;
  3140. int status, listener;
  3141. struct seccomp_notif req = {};
  3142. struct seccomp_notif_resp resp = {};
  3143. ASSERT_EQ(unshare(CLONE_NEWUSER | CLONE_NEWPID), 0) {
  3144. if (errno == EINVAL)
  3145. SKIP(return, "kernel missing CLONE_NEWUSER support");
  3146. };
  3147. listener = user_notif_syscall(__NR_getppid,
  3148. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3149. ASSERT_GE(listener, 0);
  3150. pid = fork();
  3151. ASSERT_GE(pid, 0);
  3152. if (pid == 0)
  3153. exit(syscall(__NR_getppid) != USER_NOTIF_MAGIC);
  3154. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3155. EXPECT_EQ(req.pid, pid);
  3156. resp.id = req.id;
  3157. resp.error = 0;
  3158. resp.val = USER_NOTIF_MAGIC;
  3159. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3160. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3161. EXPECT_EQ(true, WIFEXITED(status));
  3162. EXPECT_EQ(0, WEXITSTATUS(status));
  3163. close(listener);
  3164. }
  3165. /*
  3166. * Check that a pid in a sibling (i.e. unrelated) namespace shows up as 0, i.e.
  3167. * invalid.
  3168. */
  3169. TEST(user_notification_sibling_pid_ns)
  3170. {
  3171. pid_t pid, pid2;
  3172. int status, listener;
  3173. struct seccomp_notif req = {};
  3174. struct seccomp_notif_resp resp = {};
  3175. ASSERT_EQ(prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0), 0) {
  3176. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3177. }
  3178. listener = user_notif_syscall(__NR_getppid,
  3179. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3180. ASSERT_GE(listener, 0);
  3181. pid = fork();
  3182. ASSERT_GE(pid, 0);
  3183. if (pid == 0) {
  3184. ASSERT_EQ(unshare(CLONE_NEWPID), 0) {
  3185. if (errno == EPERM)
  3186. SKIP(return, "CLONE_NEWPID requires CAP_SYS_ADMIN");
  3187. else if (errno == EINVAL)
  3188. SKIP(return, "CLONE_NEWPID is invalid (missing CONFIG_PID_NS?)");
  3189. }
  3190. pid2 = fork();
  3191. ASSERT_GE(pid2, 0);
  3192. if (pid2 == 0)
  3193. exit(syscall(__NR_getppid) != USER_NOTIF_MAGIC);
  3194. EXPECT_EQ(waitpid(pid2, &status, 0), pid2);
  3195. EXPECT_EQ(true, WIFEXITED(status));
  3196. EXPECT_EQ(0, WEXITSTATUS(status));
  3197. exit(WEXITSTATUS(status));
  3198. }
  3199. /* Create the sibling ns, and sibling in it. */
  3200. ASSERT_EQ(unshare(CLONE_NEWPID), 0) {
  3201. if (errno == EPERM)
  3202. SKIP(return, "CLONE_NEWPID requires CAP_SYS_ADMIN");
  3203. else if (errno == EINVAL)
  3204. SKIP(return, "CLONE_NEWPID is invalid (missing CONFIG_PID_NS?)");
  3205. }
  3206. ASSERT_EQ(errno, 0);
  3207. pid2 = fork();
  3208. ASSERT_GE(pid2, 0);
  3209. if (pid2 == 0) {
  3210. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3211. /*
  3212. * The pid should be 0, i.e. the task is in some namespace that
  3213. * we can't "see".
  3214. */
  3215. EXPECT_EQ(req.pid, 0);
  3216. resp.id = req.id;
  3217. resp.error = 0;
  3218. resp.val = USER_NOTIF_MAGIC;
  3219. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3220. exit(0);
  3221. }
  3222. close(listener);
  3223. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3224. EXPECT_EQ(true, WIFEXITED(status));
  3225. EXPECT_EQ(0, WEXITSTATUS(status));
  3226. EXPECT_EQ(waitpid(pid2, &status, 0), pid2);
  3227. EXPECT_EQ(true, WIFEXITED(status));
  3228. EXPECT_EQ(0, WEXITSTATUS(status));
  3229. }
  3230. TEST(user_notification_fault_recv)
  3231. {
  3232. pid_t pid;
  3233. int status, listener;
  3234. struct seccomp_notif req = {};
  3235. struct seccomp_notif_resp resp = {};
  3236. ASSERT_EQ(unshare(CLONE_NEWUSER), 0) {
  3237. if (errno == EINVAL)
  3238. SKIP(return, "kernel missing CLONE_NEWUSER support");
  3239. }
  3240. listener = user_notif_syscall(__NR_getppid,
  3241. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3242. ASSERT_GE(listener, 0);
  3243. pid = fork();
  3244. ASSERT_GE(pid, 0);
  3245. if (pid == 0)
  3246. exit(syscall(__NR_getppid) != USER_NOTIF_MAGIC);
  3247. /* Do a bad recv() */
  3248. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, NULL), -1);
  3249. EXPECT_EQ(errno, EFAULT);
  3250. /* We should still be able to receive this notification, though. */
  3251. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3252. EXPECT_EQ(req.pid, pid);
  3253. resp.id = req.id;
  3254. resp.error = 0;
  3255. resp.val = USER_NOTIF_MAGIC;
  3256. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3257. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3258. EXPECT_EQ(true, WIFEXITED(status));
  3259. EXPECT_EQ(0, WEXITSTATUS(status));
  3260. }
  3261. TEST(seccomp_get_notif_sizes)
  3262. {
  3263. struct seccomp_notif_sizes sizes;
  3264. ASSERT_EQ(seccomp(SECCOMP_GET_NOTIF_SIZES, 0, &sizes), 0);
  3265. EXPECT_EQ(sizes.seccomp_notif, sizeof(struct seccomp_notif));
  3266. EXPECT_EQ(sizes.seccomp_notif_resp, sizeof(struct seccomp_notif_resp));
  3267. }
  3268. TEST(user_notification_continue)
  3269. {
  3270. pid_t pid;
  3271. long ret;
  3272. int status, listener;
  3273. struct seccomp_notif req = {};
  3274. struct seccomp_notif_resp resp = {};
  3275. struct pollfd pollfd;
  3276. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3277. ASSERT_EQ(0, ret) {
  3278. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3279. }
  3280. listener = user_notif_syscall(__NR_dup, SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3281. ASSERT_GE(listener, 0);
  3282. pid = fork();
  3283. ASSERT_GE(pid, 0);
  3284. if (pid == 0) {
  3285. int dup_fd, pipe_fds[2];
  3286. pid_t self;
  3287. ASSERT_GE(pipe(pipe_fds), 0);
  3288. dup_fd = dup(pipe_fds[0]);
  3289. ASSERT_GE(dup_fd, 0);
  3290. EXPECT_NE(pipe_fds[0], dup_fd);
  3291. self = getpid();
  3292. ASSERT_EQ(filecmp(self, self, pipe_fds[0], dup_fd), 0);
  3293. exit(0);
  3294. }
  3295. pollfd.fd = listener;
  3296. pollfd.events = POLLIN | POLLOUT;
  3297. EXPECT_GT(poll(&pollfd, 1, -1), 0);
  3298. EXPECT_EQ(pollfd.revents, POLLIN);
  3299. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3300. pollfd.fd = listener;
  3301. pollfd.events = POLLIN | POLLOUT;
  3302. EXPECT_GT(poll(&pollfd, 1, -1), 0);
  3303. EXPECT_EQ(pollfd.revents, POLLOUT);
  3304. EXPECT_EQ(req.data.nr, __NR_dup);
  3305. resp.id = req.id;
  3306. resp.flags = SECCOMP_USER_NOTIF_FLAG_CONTINUE;
  3307. /*
  3308. * Verify that setting SECCOMP_USER_NOTIF_FLAG_CONTINUE enforces other
  3309. * args be set to 0.
  3310. */
  3311. resp.error = 0;
  3312. resp.val = USER_NOTIF_MAGIC;
  3313. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), -1);
  3314. EXPECT_EQ(errno, EINVAL);
  3315. resp.error = USER_NOTIF_MAGIC;
  3316. resp.val = 0;
  3317. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), -1);
  3318. EXPECT_EQ(errno, EINVAL);
  3319. resp.error = 0;
  3320. resp.val = 0;
  3321. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0) {
  3322. if (errno == EINVAL)
  3323. SKIP(goto skip, "Kernel does not support SECCOMP_USER_NOTIF_FLAG_CONTINUE");
  3324. }
  3325. skip:
  3326. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3327. EXPECT_EQ(true, WIFEXITED(status));
  3328. EXPECT_EQ(0, WEXITSTATUS(status)) {
  3329. if (WEXITSTATUS(status) == 2) {
  3330. SKIP(return, "Kernel does not support kcmp() syscall");
  3331. return;
  3332. }
  3333. }
  3334. }
  3335. TEST(user_notification_filter_empty)
  3336. {
  3337. pid_t pid;
  3338. long ret;
  3339. int status;
  3340. struct pollfd pollfd;
  3341. struct __clone_args args = {
  3342. .flags = CLONE_FILES,
  3343. .exit_signal = SIGCHLD,
  3344. };
  3345. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3346. ASSERT_EQ(0, ret) {
  3347. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3348. }
  3349. if (__NR_clone3 < 0)
  3350. SKIP(return, "Test not built with clone3 support");
  3351. pid = sys_clone3(&args, sizeof(args));
  3352. ASSERT_GE(pid, 0);
  3353. if (pid == 0) {
  3354. int listener;
  3355. listener = user_notif_syscall(__NR_mknodat, SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3356. if (listener < 0)
  3357. _exit(EXIT_FAILURE);
  3358. if (dup2(listener, 200) != 200)
  3359. _exit(EXIT_FAILURE);
  3360. close(listener);
  3361. _exit(EXIT_SUCCESS);
  3362. }
  3363. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3364. EXPECT_EQ(true, WIFEXITED(status));
  3365. EXPECT_EQ(0, WEXITSTATUS(status));
  3366. /*
  3367. * The seccomp filter has become unused so we should be notified once
  3368. * the kernel gets around to cleaning up task struct.
  3369. */
  3370. pollfd.fd = 200;
  3371. pollfd.events = POLLHUP;
  3372. EXPECT_GT(poll(&pollfd, 1, 2000), 0);
  3373. EXPECT_GT((pollfd.revents & POLLHUP) ?: 0, 0);
  3374. }
  3375. TEST(user_ioctl_notification_filter_empty)
  3376. {
  3377. pid_t pid;
  3378. long ret;
  3379. int status, p[2];
  3380. struct __clone_args args = {
  3381. .flags = CLONE_FILES,
  3382. .exit_signal = SIGCHLD,
  3383. };
  3384. struct seccomp_notif req = {};
  3385. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3386. ASSERT_EQ(0, ret) {
  3387. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3388. }
  3389. if (__NR_clone3 < 0)
  3390. SKIP(return, "Test not built with clone3 support");
  3391. ASSERT_EQ(0, pipe(p));
  3392. pid = sys_clone3(&args, sizeof(args));
  3393. ASSERT_GE(pid, 0);
  3394. if (pid == 0) {
  3395. int listener;
  3396. listener = user_notif_syscall(__NR_mknodat, SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3397. if (listener < 0)
  3398. _exit(EXIT_FAILURE);
  3399. if (dup2(listener, 200) != 200)
  3400. _exit(EXIT_FAILURE);
  3401. close(p[1]);
  3402. close(listener);
  3403. sleep(1);
  3404. _exit(EXIT_SUCCESS);
  3405. }
  3406. if (read(p[0], &status, 1) != 0)
  3407. _exit(EXIT_SUCCESS);
  3408. close(p[0]);
  3409. /*
  3410. * The seccomp filter has become unused so we should be notified once
  3411. * the kernel gets around to cleaning up task struct.
  3412. */
  3413. EXPECT_EQ(ioctl(200, SECCOMP_IOCTL_NOTIF_RECV, &req), -1);
  3414. EXPECT_EQ(errno, ENOENT);
  3415. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3416. EXPECT_EQ(true, WIFEXITED(status));
  3417. EXPECT_EQ(0, WEXITSTATUS(status));
  3418. }
  3419. static void *do_thread(void *data)
  3420. {
  3421. return NULL;
  3422. }
  3423. TEST(user_notification_filter_empty_threaded)
  3424. {
  3425. pid_t pid;
  3426. long ret;
  3427. int status;
  3428. struct pollfd pollfd;
  3429. struct __clone_args args = {
  3430. .flags = CLONE_FILES,
  3431. .exit_signal = SIGCHLD,
  3432. };
  3433. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3434. ASSERT_EQ(0, ret) {
  3435. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3436. }
  3437. if (__NR_clone3 < 0)
  3438. SKIP(return, "Test not built with clone3 support");
  3439. pid = sys_clone3(&args, sizeof(args));
  3440. ASSERT_GE(pid, 0);
  3441. if (pid == 0) {
  3442. pid_t pid1, pid2;
  3443. int listener, status;
  3444. pthread_t thread;
  3445. listener = user_notif_syscall(__NR_dup, SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3446. if (listener < 0)
  3447. _exit(EXIT_FAILURE);
  3448. if (dup2(listener, 200) != 200)
  3449. _exit(EXIT_FAILURE);
  3450. close(listener);
  3451. pid1 = fork();
  3452. if (pid1 < 0)
  3453. _exit(EXIT_FAILURE);
  3454. if (pid1 == 0)
  3455. _exit(EXIT_SUCCESS);
  3456. pid2 = fork();
  3457. if (pid2 < 0)
  3458. _exit(EXIT_FAILURE);
  3459. if (pid2 == 0)
  3460. _exit(EXIT_SUCCESS);
  3461. if (pthread_create(&thread, NULL, do_thread, NULL) ||
  3462. pthread_join(thread, NULL))
  3463. _exit(EXIT_FAILURE);
  3464. if (pthread_create(&thread, NULL, do_thread, NULL) ||
  3465. pthread_join(thread, NULL))
  3466. _exit(EXIT_FAILURE);
  3467. if (waitpid(pid1, &status, 0) != pid1 || !WIFEXITED(status) ||
  3468. WEXITSTATUS(status))
  3469. _exit(EXIT_FAILURE);
  3470. if (waitpid(pid2, &status, 0) != pid2 || !WIFEXITED(status) ||
  3471. WEXITSTATUS(status))
  3472. _exit(EXIT_FAILURE);
  3473. exit(EXIT_SUCCESS);
  3474. }
  3475. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3476. EXPECT_EQ(true, WIFEXITED(status));
  3477. EXPECT_EQ(0, WEXITSTATUS(status));
  3478. /*
  3479. * The seccomp filter has become unused so we should be notified once
  3480. * the kernel gets around to cleaning up task struct.
  3481. */
  3482. pollfd.fd = 200;
  3483. pollfd.events = POLLHUP;
  3484. EXPECT_GT(poll(&pollfd, 1, 2000), 0);
  3485. EXPECT_GT((pollfd.revents & POLLHUP) ?: 0, 0);
  3486. }
  3487. int get_next_fd(int prev_fd)
  3488. {
  3489. for (int i = prev_fd + 1; i < FD_SETSIZE; ++i) {
  3490. if (fcntl(i, F_GETFD) == -1)
  3491. return i;
  3492. }
  3493. _exit(EXIT_FAILURE);
  3494. }
  3495. TEST(user_notification_addfd)
  3496. {
  3497. pid_t pid;
  3498. long ret;
  3499. int status, listener, memfd, fd, nextfd;
  3500. struct seccomp_notif_addfd addfd = {};
  3501. struct seccomp_notif_addfd_small small = {};
  3502. struct seccomp_notif_addfd_big big = {};
  3503. struct seccomp_notif req = {};
  3504. struct seccomp_notif_resp resp = {};
  3505. /* 100 ms */
  3506. struct timespec delay = { .tv_nsec = 100000000 };
  3507. /* There may be arbitrary already-open fds at test start. */
  3508. memfd = memfd_create("test", 0);
  3509. ASSERT_GE(memfd, 0);
  3510. nextfd = get_next_fd(memfd);
  3511. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3512. ASSERT_EQ(0, ret) {
  3513. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3514. }
  3515. /* fd: 4 */
  3516. /* Check that the basic notification machinery works */
  3517. listener = user_notif_syscall(__NR_getppid,
  3518. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3519. ASSERT_EQ(listener, nextfd);
  3520. nextfd = get_next_fd(nextfd);
  3521. pid = fork();
  3522. ASSERT_GE(pid, 0);
  3523. if (pid == 0) {
  3524. /* fds will be added and this value is expected */
  3525. if (syscall(__NR_getppid) != USER_NOTIF_MAGIC)
  3526. exit(1);
  3527. /* Atomic addfd+send is received here. Check it is a valid fd */
  3528. if (fcntl(syscall(__NR_getppid), F_GETFD) == -1)
  3529. exit(1);
  3530. exit(syscall(__NR_getppid) != USER_NOTIF_MAGIC);
  3531. }
  3532. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3533. addfd.srcfd = memfd;
  3534. addfd.newfd = 0;
  3535. addfd.id = req.id;
  3536. addfd.flags = 0x0;
  3537. /* Verify bad newfd_flags cannot be set */
  3538. addfd.newfd_flags = ~O_CLOEXEC;
  3539. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
  3540. EXPECT_EQ(errno, EINVAL);
  3541. addfd.newfd_flags = O_CLOEXEC;
  3542. /* Verify bad flags cannot be set */
  3543. addfd.flags = 0xff;
  3544. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
  3545. EXPECT_EQ(errno, EINVAL);
  3546. addfd.flags = 0;
  3547. /* Verify that remote_fd cannot be set without setting flags */
  3548. addfd.newfd = 1;
  3549. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
  3550. EXPECT_EQ(errno, EINVAL);
  3551. addfd.newfd = 0;
  3552. /* Verify small size cannot be set */
  3553. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD_SMALL, &small), -1);
  3554. EXPECT_EQ(errno, EINVAL);
  3555. /* Verify we can't send bits filled in unknown buffer area */
  3556. memset(&big, 0xAA, sizeof(big));
  3557. big.addfd = addfd;
  3558. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD_BIG, &big), -1);
  3559. EXPECT_EQ(errno, E2BIG);
  3560. /* Verify we can set an arbitrary remote fd */
  3561. fd = ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd);
  3562. EXPECT_EQ(fd, nextfd);
  3563. nextfd = get_next_fd(nextfd);
  3564. EXPECT_EQ(filecmp(getpid(), pid, memfd, fd), 0);
  3565. /* Verify we can set an arbitrary remote fd with large size */
  3566. memset(&big, 0x0, sizeof(big));
  3567. big.addfd = addfd;
  3568. fd = ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD_BIG, &big);
  3569. EXPECT_EQ(fd, nextfd);
  3570. nextfd = get_next_fd(nextfd);
  3571. /* Verify we can set a specific remote fd */
  3572. addfd.newfd = 42;
  3573. addfd.flags = SECCOMP_ADDFD_FLAG_SETFD;
  3574. fd = ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd);
  3575. EXPECT_EQ(fd, 42);
  3576. EXPECT_EQ(filecmp(getpid(), pid, memfd, fd), 0);
  3577. /* Resume syscall */
  3578. resp.id = req.id;
  3579. resp.error = 0;
  3580. resp.val = USER_NOTIF_MAGIC;
  3581. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3582. /*
  3583. * This sets the ID of the ADD FD to the last request plus 1. The
  3584. * notification ID increments 1 per notification.
  3585. */
  3586. addfd.id = req.id + 1;
  3587. /* This spins until the underlying notification is generated */
  3588. while (ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd) != -1 &&
  3589. errno != -EINPROGRESS)
  3590. nanosleep(&delay, NULL);
  3591. memset(&req, 0, sizeof(req));
  3592. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3593. ASSERT_EQ(addfd.id, req.id);
  3594. /* Verify we can do an atomic addfd and send */
  3595. addfd.newfd = 0;
  3596. addfd.flags = SECCOMP_ADDFD_FLAG_SEND;
  3597. fd = ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd);
  3598. /*
  3599. * Child has earlier "low" fds and now 42, so we expect the next
  3600. * lowest available fd to be assigned here.
  3601. */
  3602. EXPECT_EQ(fd, nextfd);
  3603. nextfd = get_next_fd(nextfd);
  3604. ASSERT_EQ(filecmp(getpid(), pid, memfd, fd), 0);
  3605. /*
  3606. * This sets the ID of the ADD FD to the last request plus 1. The
  3607. * notification ID increments 1 per notification.
  3608. */
  3609. addfd.id = req.id + 1;
  3610. /* This spins until the underlying notification is generated */
  3611. while (ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd) != -1 &&
  3612. errno != -EINPROGRESS)
  3613. nanosleep(&delay, NULL);
  3614. memset(&req, 0, sizeof(req));
  3615. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3616. ASSERT_EQ(addfd.id, req.id);
  3617. resp.id = req.id;
  3618. resp.error = 0;
  3619. resp.val = USER_NOTIF_MAGIC;
  3620. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3621. /* Wait for child to finish. */
  3622. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3623. EXPECT_EQ(true, WIFEXITED(status));
  3624. EXPECT_EQ(0, WEXITSTATUS(status));
  3625. close(memfd);
  3626. }
  3627. TEST(user_notification_addfd_rlimit)
  3628. {
  3629. pid_t pid;
  3630. long ret;
  3631. int status, listener, memfd;
  3632. struct seccomp_notif_addfd addfd = {};
  3633. struct seccomp_notif req = {};
  3634. struct seccomp_notif_resp resp = {};
  3635. const struct rlimit lim = {
  3636. .rlim_cur = 0,
  3637. .rlim_max = 0,
  3638. };
  3639. memfd = memfd_create("test", 0);
  3640. ASSERT_GE(memfd, 0);
  3641. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3642. ASSERT_EQ(0, ret) {
  3643. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3644. }
  3645. /* Check that the basic notification machinery works */
  3646. listener = user_notif_syscall(__NR_getppid,
  3647. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3648. ASSERT_GE(listener, 0);
  3649. pid = fork();
  3650. ASSERT_GE(pid, 0);
  3651. if (pid == 0)
  3652. exit(syscall(__NR_getppid) != USER_NOTIF_MAGIC);
  3653. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3654. ASSERT_EQ(prlimit(pid, RLIMIT_NOFILE, &lim, NULL), 0);
  3655. addfd.srcfd = memfd;
  3656. addfd.newfd_flags = O_CLOEXEC;
  3657. addfd.newfd = 0;
  3658. addfd.id = req.id;
  3659. addfd.flags = 0;
  3660. /* Should probably spot check /proc/sys/fs/file-nr */
  3661. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
  3662. EXPECT_EQ(errno, EMFILE);
  3663. addfd.flags = SECCOMP_ADDFD_FLAG_SEND;
  3664. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
  3665. EXPECT_EQ(errno, EMFILE);
  3666. addfd.newfd = 100;
  3667. addfd.flags = SECCOMP_ADDFD_FLAG_SETFD;
  3668. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
  3669. EXPECT_EQ(errno, EBADF);
  3670. resp.id = req.id;
  3671. resp.error = 0;
  3672. resp.val = USER_NOTIF_MAGIC;
  3673. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3674. /* Wait for child to finish. */
  3675. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3676. EXPECT_EQ(true, WIFEXITED(status));
  3677. EXPECT_EQ(0, WEXITSTATUS(status));
  3678. close(memfd);
  3679. }
  3680. #ifndef SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP
  3681. #define SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP (1UL << 0)
  3682. #define SECCOMP_IOCTL_NOTIF_SET_FLAGS SECCOMP_IOW(4, __u64)
  3683. #endif
  3684. TEST(user_notification_sync)
  3685. {
  3686. struct seccomp_notif req = {};
  3687. struct seccomp_notif_resp resp = {};
  3688. int status, listener;
  3689. pid_t pid;
  3690. long ret;
  3691. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3692. ASSERT_EQ(0, ret) {
  3693. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3694. }
  3695. listener = user_notif_syscall(__NR_getppid,
  3696. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3697. ASSERT_GE(listener, 0);
  3698. /* Try to set invalid flags. */
  3699. EXPECT_SYSCALL_RETURN(-EINVAL,
  3700. ioctl(listener, SECCOMP_IOCTL_NOTIF_SET_FLAGS, 0xffffffff, 0));
  3701. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SET_FLAGS,
  3702. SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP, 0), 0);
  3703. pid = fork();
  3704. ASSERT_GE(pid, 0);
  3705. if (pid == 0) {
  3706. ret = syscall(__NR_getppid);
  3707. ASSERT_EQ(ret, USER_NOTIF_MAGIC) {
  3708. _exit(1);
  3709. }
  3710. _exit(0);
  3711. }
  3712. req.pid = 0;
  3713. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3714. ASSERT_EQ(req.data.nr, __NR_getppid);
  3715. resp.id = req.id;
  3716. resp.error = 0;
  3717. resp.val = USER_NOTIF_MAGIC;
  3718. resp.flags = 0;
  3719. ASSERT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3720. ASSERT_EQ(waitpid(pid, &status, 0), pid);
  3721. ASSERT_EQ(status, 0);
  3722. }
  3723. /* Make sure PTRACE_O_SUSPEND_SECCOMP requires CAP_SYS_ADMIN. */
  3724. FIXTURE(O_SUSPEND_SECCOMP) {
  3725. pid_t pid;
  3726. };
  3727. FIXTURE_SETUP(O_SUSPEND_SECCOMP)
  3728. {
  3729. ERRNO_FILTER(block_read, E2BIG);
  3730. cap_value_t cap_list[] = { CAP_SYS_ADMIN };
  3731. cap_t caps;
  3732. self->pid = 0;
  3733. /* make sure we don't have CAP_SYS_ADMIN */
  3734. caps = cap_get_proc();
  3735. ASSERT_NE(NULL, caps);
  3736. ASSERT_EQ(0, cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_CLEAR));
  3737. ASSERT_EQ(0, cap_set_proc(caps));
  3738. cap_free(caps);
  3739. ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0));
  3740. ASSERT_EQ(0, prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_block_read));
  3741. self->pid = fork();
  3742. ASSERT_GE(self->pid, 0);
  3743. if (self->pid == 0) {
  3744. while (1)
  3745. pause();
  3746. _exit(127);
  3747. }
  3748. }
  3749. FIXTURE_TEARDOWN(O_SUSPEND_SECCOMP)
  3750. {
  3751. if (self->pid)
  3752. kill(self->pid, SIGKILL);
  3753. }
  3754. TEST_F(O_SUSPEND_SECCOMP, setoptions)
  3755. {
  3756. int wstatus;
  3757. ASSERT_EQ(0, ptrace(PTRACE_ATTACH, self->pid, NULL, 0));
  3758. ASSERT_EQ(self->pid, wait(&wstatus));
  3759. ASSERT_EQ(-1, ptrace(PTRACE_SETOPTIONS, self->pid, NULL, PTRACE_O_SUSPEND_SECCOMP));
  3760. if (errno == EINVAL)
  3761. SKIP(return, "Kernel does not support PTRACE_O_SUSPEND_SECCOMP (missing CONFIG_CHECKPOINT_RESTORE?)");
  3762. ASSERT_EQ(EPERM, errno);
  3763. }
  3764. TEST_F(O_SUSPEND_SECCOMP, seize)
  3765. {
  3766. int ret;
  3767. ret = ptrace(PTRACE_SEIZE, self->pid, NULL, PTRACE_O_SUSPEND_SECCOMP);
  3768. ASSERT_EQ(-1, ret);
  3769. if (errno == EINVAL)
  3770. SKIP(return, "Kernel does not support PTRACE_O_SUSPEND_SECCOMP (missing CONFIG_CHECKPOINT_RESTORE?)");
  3771. ASSERT_EQ(EPERM, errno);
  3772. }
  3773. /*
  3774. * get_nth - Get the nth, space separated entry in a file.
  3775. *
  3776. * Returns the length of the read field.
  3777. * Throws error if field is zero-lengthed.
  3778. */
  3779. static ssize_t get_nth(struct __test_metadata *_metadata, const char *path,
  3780. const unsigned int position, char **entry)
  3781. {
  3782. char *line = NULL;
  3783. unsigned int i;
  3784. ssize_t nread;
  3785. size_t len = 0;
  3786. FILE *f;
  3787. f = fopen(path, "r");
  3788. ASSERT_NE(f, NULL) {
  3789. TH_LOG("Could not open %s: %s", path, strerror(errno));
  3790. }
  3791. for (i = 0; i < position; i++) {
  3792. nread = getdelim(&line, &len, ' ', f);
  3793. ASSERT_GE(nread, 0) {
  3794. TH_LOG("Failed to read %d entry in file %s", i, path);
  3795. }
  3796. }
  3797. fclose(f);
  3798. ASSERT_GT(nread, 0) {
  3799. TH_LOG("Entry in file %s had zero length", path);
  3800. }
  3801. *entry = line;
  3802. return nread - 1;
  3803. }
  3804. /* For a given PID, get the task state (D, R, etc...) */
  3805. static char get_proc_stat(struct __test_metadata *_metadata, pid_t pid)
  3806. {
  3807. char proc_path[100] = {0};
  3808. char status;
  3809. char *line;
  3810. snprintf(proc_path, sizeof(proc_path), "/proc/%d/stat", pid);
  3811. ASSERT_EQ(get_nth(_metadata, proc_path, 3, &line), 1);
  3812. status = *line;
  3813. free(line);
  3814. return status;
  3815. }
  3816. TEST(user_notification_fifo)
  3817. {
  3818. struct seccomp_notif_resp resp = {};
  3819. struct seccomp_notif req = {};
  3820. int i, status, listener;
  3821. pid_t pid, pids[3];
  3822. __u64 baseid;
  3823. long ret;
  3824. /* 100 ms */
  3825. struct timespec delay = { .tv_nsec = 100000000 };
  3826. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3827. ASSERT_EQ(0, ret) {
  3828. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3829. }
  3830. /* Setup a listener */
  3831. listener = user_notif_syscall(__NR_getppid,
  3832. SECCOMP_FILTER_FLAG_NEW_LISTENER);
  3833. ASSERT_GE(listener, 0);
  3834. pid = fork();
  3835. ASSERT_GE(pid, 0);
  3836. if (pid == 0) {
  3837. ret = syscall(__NR_getppid);
  3838. exit(ret != USER_NOTIF_MAGIC);
  3839. }
  3840. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3841. baseid = req.id + 1;
  3842. resp.id = req.id;
  3843. resp.error = 0;
  3844. resp.val = USER_NOTIF_MAGIC;
  3845. /* check that we make sure flags == 0 */
  3846. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3847. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3848. EXPECT_EQ(true, WIFEXITED(status));
  3849. EXPECT_EQ(0, WEXITSTATUS(status));
  3850. /* Start children, and generate notifications */
  3851. for (i = 0; i < ARRAY_SIZE(pids); i++) {
  3852. pid = fork();
  3853. if (pid == 0) {
  3854. ret = syscall(__NR_getppid);
  3855. exit(ret != USER_NOTIF_MAGIC);
  3856. }
  3857. pids[i] = pid;
  3858. }
  3859. /* This spins until all of the children are sleeping */
  3860. restart_wait:
  3861. for (i = 0; i < ARRAY_SIZE(pids); i++) {
  3862. if (get_proc_stat(_metadata, pids[i]) != 'S') {
  3863. nanosleep(&delay, NULL);
  3864. goto restart_wait;
  3865. }
  3866. }
  3867. /* Read the notifications in order (and respond) */
  3868. for (i = 0; i < ARRAY_SIZE(pids); i++) {
  3869. memset(&req, 0, sizeof(req));
  3870. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  3871. EXPECT_EQ(req.id, baseid + i);
  3872. resp.id = req.id;
  3873. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  3874. }
  3875. /* Make sure notifications were received */
  3876. for (i = 0; i < ARRAY_SIZE(pids); i++) {
  3877. EXPECT_EQ(waitpid(pids[i], &status, 0), pids[i]);
  3878. EXPECT_EQ(true, WIFEXITED(status));
  3879. EXPECT_EQ(0, WEXITSTATUS(status));
  3880. }
  3881. }
  3882. /* get_proc_syscall - Get the syscall in progress for a given pid
  3883. *
  3884. * Returns the current syscall number for a given process
  3885. * Returns -1 if not in syscall (running or blocked)
  3886. */
  3887. static long get_proc_syscall(struct __test_metadata *_metadata, int pid)
  3888. {
  3889. char proc_path[100] = {0};
  3890. long ret = -1;
  3891. ssize_t nread;
  3892. char *line;
  3893. snprintf(proc_path, sizeof(proc_path), "/proc/%d/syscall", pid);
  3894. nread = get_nth(_metadata, proc_path, 1, &line);
  3895. ASSERT_GT(nread, 0);
  3896. if (!strncmp("running", line, MIN(7, nread)))
  3897. ret = strtol(line, NULL, 16);
  3898. free(line);
  3899. return ret;
  3900. }
  3901. /* Ensure non-fatal signals prior to receive are unmodified */
  3902. TEST(user_notification_wait_killable_pre_notification)
  3903. {
  3904. struct sigaction new_action = {
  3905. .sa_handler = signal_handler,
  3906. };
  3907. int listener, status, sk_pair[2];
  3908. pid_t pid;
  3909. long ret;
  3910. char c;
  3911. /* 100 ms */
  3912. struct timespec delay = { .tv_nsec = 100000000 };
  3913. ASSERT_EQ(sigemptyset(&new_action.sa_mask), 0);
  3914. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3915. ASSERT_EQ(0, ret)
  3916. {
  3917. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3918. }
  3919. ASSERT_EQ(socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair), 0);
  3920. listener = user_notif_syscall(
  3921. __NR_getppid, SECCOMP_FILTER_FLAG_NEW_LISTENER |
  3922. SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV);
  3923. ASSERT_GE(listener, 0);
  3924. /*
  3925. * Check that we can kill the process with SIGUSR1 prior to receiving
  3926. * the notification. SIGUSR1 is wired up to a custom signal handler,
  3927. * and make sure it gets called.
  3928. */
  3929. pid = fork();
  3930. ASSERT_GE(pid, 0);
  3931. if (pid == 0) {
  3932. close(sk_pair[0]);
  3933. handled = sk_pair[1];
  3934. /* Setup the non-fatal sigaction without SA_RESTART */
  3935. if (sigaction(SIGUSR1, &new_action, NULL)) {
  3936. perror("sigaction");
  3937. exit(1);
  3938. }
  3939. ret = syscall(__NR_getppid);
  3940. /* Make sure we got a return from a signal interruption */
  3941. exit(ret != -1 || errno != EINTR);
  3942. }
  3943. /*
  3944. * Make sure we've gotten to the seccomp user notification wait
  3945. * from getppid prior to sending any signals
  3946. */
  3947. while (get_proc_syscall(_metadata, pid) != __NR_getppid &&
  3948. get_proc_stat(_metadata, pid) != 'S')
  3949. nanosleep(&delay, NULL);
  3950. /* Send non-fatal kill signal */
  3951. EXPECT_EQ(kill(pid, SIGUSR1), 0);
  3952. /* wait for process to exit (exit checks for EINTR) */
  3953. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  3954. EXPECT_EQ(true, WIFEXITED(status));
  3955. EXPECT_EQ(0, WEXITSTATUS(status));
  3956. EXPECT_EQ(read(sk_pair[0], &c, 1), 1);
  3957. }
  3958. /* Ensure non-fatal signals after receive are blocked */
  3959. TEST(user_notification_wait_killable)
  3960. {
  3961. struct sigaction new_action = {
  3962. .sa_handler = signal_handler,
  3963. };
  3964. struct seccomp_notif_resp resp = {};
  3965. struct seccomp_notif req = {};
  3966. int listener, status, sk_pair[2];
  3967. pid_t pid;
  3968. long ret;
  3969. char c;
  3970. /* 100 ms */
  3971. struct timespec delay = { .tv_nsec = 100000000 };
  3972. ASSERT_EQ(sigemptyset(&new_action.sa_mask), 0);
  3973. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  3974. ASSERT_EQ(0, ret)
  3975. {
  3976. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  3977. }
  3978. ASSERT_EQ(socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sk_pair), 0);
  3979. listener = user_notif_syscall(
  3980. __NR_getppid, SECCOMP_FILTER_FLAG_NEW_LISTENER |
  3981. SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV);
  3982. ASSERT_GE(listener, 0);
  3983. pid = fork();
  3984. ASSERT_GE(pid, 0);
  3985. if (pid == 0) {
  3986. close(sk_pair[0]);
  3987. handled = sk_pair[1];
  3988. /* Setup the sigaction without SA_RESTART */
  3989. if (sigaction(SIGUSR1, &new_action, NULL)) {
  3990. perror("sigaction");
  3991. exit(1);
  3992. }
  3993. /* Make sure that the syscall is completed (no EINTR) */
  3994. ret = syscall(__NR_getppid);
  3995. exit(ret != USER_NOTIF_MAGIC);
  3996. }
  3997. /*
  3998. * Get the notification, to make move the notifying process into a
  3999. * non-preemptible (TASK_KILLABLE) state.
  4000. */
  4001. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  4002. /* Send non-fatal kill signal */
  4003. EXPECT_EQ(kill(pid, SIGUSR1), 0);
  4004. /*
  4005. * Make sure the task enters moves to TASK_KILLABLE by waiting for
  4006. * D (Disk Sleep) state after receiving non-fatal signal.
  4007. */
  4008. while (get_proc_stat(_metadata, pid) != 'D')
  4009. nanosleep(&delay, NULL);
  4010. resp.id = req.id;
  4011. resp.val = USER_NOTIF_MAGIC;
  4012. /* Make sure the notification is found and able to be replied to */
  4013. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_SEND, &resp), 0);
  4014. /*
  4015. * Make sure that the signal handler does get called once we're back in
  4016. * userspace.
  4017. */
  4018. EXPECT_EQ(read(sk_pair[0], &c, 1), 1);
  4019. /* wait for process to exit (exit checks for USER_NOTIF_MAGIC) */
  4020. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  4021. EXPECT_EQ(true, WIFEXITED(status));
  4022. EXPECT_EQ(0, WEXITSTATUS(status));
  4023. }
  4024. /* Ensure fatal signals after receive are not blocked */
  4025. TEST(user_notification_wait_killable_fatal)
  4026. {
  4027. struct seccomp_notif req = {};
  4028. int listener, status;
  4029. pid_t pid;
  4030. long ret;
  4031. /* 100 ms */
  4032. struct timespec delay = { .tv_nsec = 100000000 };
  4033. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  4034. ASSERT_EQ(0, ret)
  4035. {
  4036. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  4037. }
  4038. listener = user_notif_syscall(
  4039. __NR_getppid, SECCOMP_FILTER_FLAG_NEW_LISTENER |
  4040. SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV);
  4041. ASSERT_GE(listener, 0);
  4042. pid = fork();
  4043. ASSERT_GE(pid, 0);
  4044. if (pid == 0) {
  4045. /* This should never complete as it should get a SIGTERM */
  4046. syscall(__NR_getppid);
  4047. exit(1);
  4048. }
  4049. while (get_proc_stat(_metadata, pid) != 'S')
  4050. nanosleep(&delay, NULL);
  4051. /*
  4052. * Get the notification, to make move the notifying process into a
  4053. * non-preemptible (TASK_KILLABLE) state.
  4054. */
  4055. EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_RECV, &req), 0);
  4056. /* Kill the process with a fatal signal */
  4057. EXPECT_EQ(kill(pid, SIGTERM), 0);
  4058. /*
  4059. * Wait for the process to exit, and make sure the process terminated
  4060. * due to the SIGTERM signal.
  4061. */
  4062. EXPECT_EQ(waitpid(pid, &status, 0), pid);
  4063. EXPECT_EQ(true, WIFSIGNALED(status));
  4064. EXPECT_EQ(SIGTERM, WTERMSIG(status));
  4065. }
  4066. struct tsync_vs_thread_leader_args {
  4067. pthread_t leader;
  4068. };
  4069. static void *tsync_vs_dead_thread_leader_sibling(void *_args)
  4070. {
  4071. struct sock_filter allow_filter[] = {
  4072. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  4073. };
  4074. struct sock_fprog allow_prog = {
  4075. .len = (unsigned short)ARRAY_SIZE(allow_filter),
  4076. .filter = allow_filter,
  4077. };
  4078. struct tsync_vs_thread_leader_args *args = _args;
  4079. void *retval;
  4080. long ret;
  4081. ret = pthread_join(args->leader, &retval);
  4082. if (ret)
  4083. exit(1);
  4084. if (retval != _args)
  4085. exit(2);
  4086. ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, &allow_prog);
  4087. if (ret)
  4088. exit(3);
  4089. exit(0);
  4090. }
  4091. /*
  4092. * Ensure that a dead thread leader doesn't prevent installing new filters with
  4093. * SECCOMP_FILTER_FLAG_TSYNC from other threads.
  4094. */
  4095. TEST(tsync_vs_dead_thread_leader)
  4096. {
  4097. int status;
  4098. pid_t pid;
  4099. long ret;
  4100. ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
  4101. ASSERT_EQ(0, ret) {
  4102. TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!");
  4103. }
  4104. pid = fork();
  4105. ASSERT_GE(pid, 0);
  4106. if (pid == 0) {
  4107. struct sock_filter allow_filter[] = {
  4108. BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
  4109. };
  4110. struct sock_fprog allow_prog = {
  4111. .len = (unsigned short)ARRAY_SIZE(allow_filter),
  4112. .filter = allow_filter,
  4113. };
  4114. struct tsync_vs_thread_leader_args *args;
  4115. pthread_t sibling;
  4116. args = malloc(sizeof(*args));
  4117. ASSERT_NE(NULL, args);
  4118. args->leader = pthread_self();
  4119. ret = pthread_create(&sibling, NULL,
  4120. tsync_vs_dead_thread_leader_sibling, args);
  4121. ASSERT_EQ(0, ret);
  4122. /* Install a new filter just to the leader thread. */
  4123. ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &allow_prog);
  4124. ASSERT_EQ(0, ret);
  4125. pthread_exit(args);
  4126. exit(1);
  4127. }
  4128. EXPECT_EQ(pid, waitpid(pid, &status, 0));
  4129. EXPECT_EQ(0, status);
  4130. }
  4131. /*
  4132. * TODO:
  4133. * - expand NNP testing
  4134. * - better arch-specific TRACE and TRAP handlers.
  4135. * - endianness checking when appropriate
  4136. * - 64-bit arg prodding
  4137. * - arch value testing (x86 modes especially)
  4138. * - verify that FILTER_FLAG_LOG filters generate log messages
  4139. * - verify that RET_LOG generates log messages
  4140. */
  4141. TEST_HARNESS_MAIN