precise.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. {
  2. "precise: test 1",
  3. .insns = {
  4. BPF_MOV64_IMM(BPF_REG_0, 1),
  5. BPF_LD_MAP_FD(BPF_REG_6, 0),
  6. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  7. BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
  8. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  9. BPF_ST_MEM(BPF_DW, BPF_REG_FP, -8, 0),
  10. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  11. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  12. BPF_EXIT_INSN(),
  13. BPF_MOV64_REG(BPF_REG_9, BPF_REG_0),
  14. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  15. BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
  16. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  17. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  18. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  19. BPF_EXIT_INSN(),
  20. BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
  21. BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8), /* map_value_ptr -= map_value_ptr */
  22. BPF_MOV64_REG(BPF_REG_2, BPF_REG_9),
  23. BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 8, 1),
  24. BPF_EXIT_INSN(),
  25. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), /* R2=scalar(umin=1, umax=8) */
  26. BPF_MOV64_REG(BPF_REG_1, BPF_REG_FP),
  27. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
  28. BPF_MOV64_IMM(BPF_REG_3, 0),
  29. BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
  30. BPF_EXIT_INSN(),
  31. },
  32. .prog_type = BPF_PROG_TYPE_TRACEPOINT,
  33. .fixup_map_array_48b = { 1 },
  34. .result = VERBOSE_ACCEPT,
  35. .errstr =
  36. "26: (85) call bpf_probe_read_kernel#113\
  37. last_idx 26 first_idx 20\
  38. regs=4 stack=0 before 25\
  39. regs=4 stack=0 before 24\
  40. regs=4 stack=0 before 23\
  41. regs=4 stack=0 before 22\
  42. regs=4 stack=0 before 20\
  43. parent didn't have regs=4 stack=0 marks\
  44. last_idx 19 first_idx 10\
  45. regs=4 stack=0 before 19\
  46. regs=200 stack=0 before 18\
  47. regs=300 stack=0 before 17\
  48. regs=201 stack=0 before 15\
  49. regs=201 stack=0 before 14\
  50. regs=200 stack=0 before 13\
  51. regs=200 stack=0 before 12\
  52. regs=200 stack=0 before 11\
  53. regs=200 stack=0 before 10\
  54. parent already had regs=0 stack=0 marks",
  55. },
  56. {
  57. "precise: test 2",
  58. .insns = {
  59. BPF_MOV64_IMM(BPF_REG_0, 1),
  60. BPF_LD_MAP_FD(BPF_REG_6, 0),
  61. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  62. BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
  63. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  64. BPF_ST_MEM(BPF_DW, BPF_REG_FP, -8, 0),
  65. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  66. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  67. BPF_EXIT_INSN(),
  68. BPF_MOV64_REG(BPF_REG_9, BPF_REG_0),
  69. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  70. BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
  71. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  72. BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
  73. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  74. BPF_EXIT_INSN(),
  75. BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
  76. BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8), /* map_value_ptr -= map_value_ptr */
  77. BPF_MOV64_REG(BPF_REG_2, BPF_REG_9),
  78. BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 8, 1),
  79. BPF_EXIT_INSN(),
  80. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), /* R2=scalar(umin=1, umax=8) */
  81. BPF_MOV64_REG(BPF_REG_1, BPF_REG_FP),
  82. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
  83. BPF_MOV64_IMM(BPF_REG_3, 0),
  84. BPF_EMIT_CALL(BPF_FUNC_probe_read_kernel),
  85. BPF_EXIT_INSN(),
  86. },
  87. .prog_type = BPF_PROG_TYPE_TRACEPOINT,
  88. .fixup_map_array_48b = { 1 },
  89. .result = VERBOSE_ACCEPT,
  90. .flags = BPF_F_TEST_STATE_FREQ,
  91. .errstr =
  92. "26: (85) call bpf_probe_read_kernel#113\
  93. last_idx 26 first_idx 22\
  94. regs=4 stack=0 before 25\
  95. regs=4 stack=0 before 24\
  96. regs=4 stack=0 before 23\
  97. regs=4 stack=0 before 22\
  98. parent didn't have regs=4 stack=0 marks\
  99. last_idx 20 first_idx 20\
  100. regs=4 stack=0 before 20\
  101. parent didn't have regs=4 stack=0 marks\
  102. last_idx 19 first_idx 17\
  103. regs=4 stack=0 before 19\
  104. regs=200 stack=0 before 18\
  105. regs=300 stack=0 before 17\
  106. parent already had regs=0 stack=0 marks",
  107. },
  108. {
  109. "precise: cross frame pruning",
  110. .insns = {
  111. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  112. BPF_MOV64_IMM(BPF_REG_8, 0),
  113. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  114. BPF_MOV64_IMM(BPF_REG_8, 1),
  115. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  116. BPF_MOV64_IMM(BPF_REG_9, 0),
  117. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  118. BPF_MOV64_IMM(BPF_REG_9, 1),
  119. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  120. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
  121. BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1),
  122. BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_2, 0),
  123. BPF_MOV64_IMM(BPF_REG_0, 0),
  124. BPF_EXIT_INSN(),
  125. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
  126. BPF_EXIT_INSN(),
  127. },
  128. .prog_type = BPF_PROG_TYPE_XDP,
  129. .flags = BPF_F_TEST_STATE_FREQ,
  130. .errstr = "!read_ok",
  131. .result = REJECT,
  132. },
  133. {
  134. "precise: ST insn causing spi > allocated_stack",
  135. .insns = {
  136. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  137. BPF_JMP_IMM(BPF_JNE, BPF_REG_3, 123, 0),
  138. BPF_ST_MEM(BPF_DW, BPF_REG_3, -8, 0),
  139. BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
  140. BPF_MOV64_IMM(BPF_REG_0, -1),
  141. BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 0),
  142. BPF_EXIT_INSN(),
  143. },
  144. .prog_type = BPF_PROG_TYPE_XDP,
  145. .flags = BPF_F_TEST_STATE_FREQ,
  146. .errstr = "5: (2d) if r4 > r0 goto pc+0\
  147. last_idx 5 first_idx 5\
  148. parent didn't have regs=10 stack=0 marks\
  149. last_idx 4 first_idx 2\
  150. regs=10 stack=0 before 4\
  151. regs=10 stack=0 before 3\
  152. regs=0 stack=1 before 2\
  153. last_idx 5 first_idx 5\
  154. parent didn't have regs=1 stack=0 marks",
  155. .result = VERBOSE_ACCEPT,
  156. .retval = -1,
  157. },
  158. {
  159. "precise: STX insn causing spi > allocated_stack",
  160. .insns = {
  161. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  162. BPF_MOV64_REG(BPF_REG_3, BPF_REG_10),
  163. BPF_JMP_IMM(BPF_JNE, BPF_REG_3, 123, 0),
  164. BPF_STX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, -8),
  165. BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
  166. BPF_MOV64_IMM(BPF_REG_0, -1),
  167. BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 0),
  168. BPF_EXIT_INSN(),
  169. },
  170. .prog_type = BPF_PROG_TYPE_XDP,
  171. .flags = BPF_F_TEST_STATE_FREQ,
  172. .errstr = "last_idx 6 first_idx 6\
  173. parent didn't have regs=10 stack=0 marks\
  174. last_idx 5 first_idx 3\
  175. regs=10 stack=0 before 5\
  176. regs=10 stack=0 before 4\
  177. regs=0 stack=1 before 3\
  178. last_idx 6 first_idx 6\
  179. parent didn't have regs=1 stack=0 marks\
  180. last_idx 5 first_idx 3\
  181. regs=1 stack=0 before 5",
  182. .result = VERBOSE_ACCEPT,
  183. .retval = -1,
  184. },
  185. {
  186. "precise: mark_chain_precision for ARG_CONST_ALLOC_SIZE_OR_ZERO",
  187. .insns = {
  188. BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, offsetof(struct xdp_md, ingress_ifindex)),
  189. BPF_LD_MAP_FD(BPF_REG_6, 0),
  190. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  191. BPF_MOV64_IMM(BPF_REG_2, 1),
  192. BPF_MOV64_IMM(BPF_REG_3, 0),
  193. BPF_JMP_IMM(BPF_JEQ, BPF_REG_4, 0, 1),
  194. BPF_MOV64_IMM(BPF_REG_2, 0x1000),
  195. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_reserve),
  196. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  197. BPF_EXIT_INSN(),
  198. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  199. BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 42),
  200. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_submit),
  201. BPF_MOV64_IMM(BPF_REG_0, 0),
  202. BPF_EXIT_INSN(),
  203. },
  204. .fixup_map_ringbuf = { 1 },
  205. .prog_type = BPF_PROG_TYPE_XDP,
  206. .flags = BPF_F_TEST_STATE_FREQ,
  207. .errstr = "invalid access to memory, mem_size=1 off=42 size=8",
  208. .result = REJECT,
  209. },