ctx.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. {
  2. "context stores via ST",
  3. .insns = {
  4. BPF_MOV64_IMM(BPF_REG_0, 0),
  5. BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0),
  6. BPF_EXIT_INSN(),
  7. },
  8. .errstr = "BPF_ST stores into R1 ctx is not allowed",
  9. .result = REJECT,
  10. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  11. },
  12. {
  13. "context stores via BPF_ATOMIC",
  14. .insns = {
  15. BPF_MOV64_IMM(BPF_REG_0, 0),
  16. BPF_ATOMIC_OP(BPF_W, BPF_ADD, BPF_REG_1, BPF_REG_0, offsetof(struct __sk_buff, mark)),
  17. BPF_EXIT_INSN(),
  18. },
  19. .errstr = "BPF_ATOMIC stores into R1 ctx is not allowed",
  20. .result = REJECT,
  21. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  22. },
  23. {
  24. "arithmetic ops make PTR_TO_CTX unusable",
  25. .insns = {
  26. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1,
  27. offsetof(struct __sk_buff, data) -
  28. offsetof(struct __sk_buff, mark)),
  29. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
  30. offsetof(struct __sk_buff, mark)),
  31. BPF_EXIT_INSN(),
  32. },
  33. .errstr = "dereference of modified ctx ptr",
  34. .result = REJECT,
  35. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  36. },
  37. {
  38. "pass unmodified ctx pointer to helper",
  39. .insns = {
  40. BPF_MOV64_IMM(BPF_REG_2, 0),
  41. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  42. BPF_FUNC_csum_update),
  43. BPF_MOV64_IMM(BPF_REG_0, 0),
  44. BPF_EXIT_INSN(),
  45. },
  46. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  47. .result = ACCEPT,
  48. },
  49. {
  50. "pass modified ctx pointer to helper, 1",
  51. .insns = {
  52. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612),
  53. BPF_MOV64_IMM(BPF_REG_2, 0),
  54. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  55. BPF_FUNC_csum_update),
  56. BPF_MOV64_IMM(BPF_REG_0, 0),
  57. BPF_EXIT_INSN(),
  58. },
  59. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  60. .result = REJECT,
  61. .errstr = "negative offset ctx ptr R1 off=-612 disallowed",
  62. },
  63. {
  64. "pass modified ctx pointer to helper, 2",
  65. .insns = {
  66. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612),
  67. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  68. BPF_FUNC_get_socket_cookie),
  69. BPF_MOV64_IMM(BPF_REG_0, 0),
  70. BPF_EXIT_INSN(),
  71. },
  72. .result_unpriv = REJECT,
  73. .result = REJECT,
  74. .errstr_unpriv = "negative offset ctx ptr R1 off=-612 disallowed",
  75. .errstr = "negative offset ctx ptr R1 off=-612 disallowed",
  76. },
  77. {
  78. "pass modified ctx pointer to helper, 3",
  79. .insns = {
  80. BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 0),
  81. BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 4),
  82. BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3),
  83. BPF_MOV64_IMM(BPF_REG_2, 0),
  84. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  85. BPF_FUNC_csum_update),
  86. BPF_MOV64_IMM(BPF_REG_0, 0),
  87. BPF_EXIT_INSN(),
  88. },
  89. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  90. .result = REJECT,
  91. .errstr = "variable ctx access var_off=(0x0; 0x4)",
  92. },
  93. {
  94. "pass ctx or null check, 1: ctx",
  95. .insns = {
  96. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  97. BPF_FUNC_get_netns_cookie),
  98. BPF_MOV64_IMM(BPF_REG_0, 0),
  99. BPF_EXIT_INSN(),
  100. },
  101. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
  102. .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
  103. .result = ACCEPT,
  104. },
  105. {
  106. "pass ctx or null check, 2: null",
  107. .insns = {
  108. BPF_MOV64_IMM(BPF_REG_1, 0),
  109. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  110. BPF_FUNC_get_netns_cookie),
  111. BPF_MOV64_IMM(BPF_REG_0, 0),
  112. BPF_EXIT_INSN(),
  113. },
  114. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
  115. .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
  116. .result = ACCEPT,
  117. },
  118. {
  119. "pass ctx or null check, 3: 1",
  120. .insns = {
  121. BPF_MOV64_IMM(BPF_REG_1, 1),
  122. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  123. BPF_FUNC_get_netns_cookie),
  124. BPF_MOV64_IMM(BPF_REG_0, 0),
  125. BPF_EXIT_INSN(),
  126. },
  127. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
  128. .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
  129. .result = REJECT,
  130. .errstr = "R1 type=scalar expected=ctx",
  131. },
  132. {
  133. "pass ctx or null check, 4: ctx - const",
  134. .insns = {
  135. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612),
  136. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  137. BPF_FUNC_get_netns_cookie),
  138. BPF_MOV64_IMM(BPF_REG_0, 0),
  139. BPF_EXIT_INSN(),
  140. },
  141. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
  142. .expected_attach_type = BPF_CGROUP_UDP6_SENDMSG,
  143. .result = REJECT,
  144. .errstr = "negative offset ctx ptr R1 off=-612 disallowed",
  145. },
  146. {
  147. "pass ctx or null check, 5: null (connect)",
  148. .insns = {
  149. BPF_MOV64_IMM(BPF_REG_1, 0),
  150. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  151. BPF_FUNC_get_netns_cookie),
  152. BPF_MOV64_IMM(BPF_REG_0, 0),
  153. BPF_EXIT_INSN(),
  154. },
  155. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
  156. .expected_attach_type = BPF_CGROUP_INET4_CONNECT,
  157. .result = ACCEPT,
  158. },
  159. {
  160. "pass ctx or null check, 6: null (bind)",
  161. .insns = {
  162. BPF_MOV64_IMM(BPF_REG_1, 0),
  163. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  164. BPF_FUNC_get_netns_cookie),
  165. BPF_MOV64_IMM(BPF_REG_0, 0),
  166. BPF_EXIT_INSN(),
  167. },
  168. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
  169. .expected_attach_type = BPF_CGROUP_INET4_POST_BIND,
  170. .result = ACCEPT,
  171. },
  172. {
  173. "pass ctx or null check, 7: ctx (bind)",
  174. .insns = {
  175. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  176. BPF_FUNC_get_socket_cookie),
  177. BPF_MOV64_IMM(BPF_REG_0, 0),
  178. BPF_EXIT_INSN(),
  179. },
  180. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
  181. .expected_attach_type = BPF_CGROUP_INET4_POST_BIND,
  182. .result = ACCEPT,
  183. },
  184. {
  185. "pass ctx or null check, 8: null (bind)",
  186. .insns = {
  187. BPF_MOV64_IMM(BPF_REG_1, 0),
  188. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
  189. BPF_FUNC_get_socket_cookie),
  190. BPF_MOV64_IMM(BPF_REG_0, 0),
  191. BPF_EXIT_INSN(),
  192. },
  193. .prog_type = BPF_PROG_TYPE_CGROUP_SOCK,
  194. .expected_attach_type = BPF_CGROUP_INET4_POST_BIND,
  195. .result = REJECT,
  196. .errstr = "R1 type=scalar expected=ctx",
  197. },